go to post Dmitry Maslennikov · Jun 5, 2016 Stefan had already answered, and you can find his answer here
go to post Dmitry Maslennikov · May 30, 2016 ToPhone(s = "") { set r="" set c=96 for p=2:1:9 { set k="" for j=1:1:3+(p=7)+(p=9) { set k=k_p set c($c($i(c)))=k } } for i=1:1:$l(s) { set n=$g(c($e(s,i)),0) if $e(n)=$e(r,*) set r=r_" " set r=r_n } quit r }
go to post Dmitry Maslennikov · May 30, 2016 and 149, with a little bit changes ToPhone(s = "") { s r="",c=96 f p=2:1:9{s k="" f j=1:1:3+(p=7)+(p=9) s k=k_p,c($c($i(c)))=k} f i=1:1:$l(s){s n=$g(c($e(s,i)),0) s:$e(n)=$e(r,*) r=r_" " s r=r_n} q r }
go to post Dmitry Maslennikov · May 30, 2016 Well, my code below toPhone(s = "") { s r="",c=96,p=1 f i=3,3,3,3,3,4,3,4{s:$i(p) k="" f j=1:1:i s k=k_p,c($c($i(c)))=k} f i=1:1:$l(s){s n=$g(c($e(s,i)),0) s:$e(n)=$e(r,*) r=r_" " s r=r_n} q r } In first I'm generate a plane array with all variants, and then just get all numbers from it, include space between identical numbers, and zero for unknown symbols such as space
go to post Dmitry Maslennikov · May 30, 2016 I think I let other's to share their size, and tomorrow or sometime later I can share it.
go to post Dmitry Maslennikov · May 26, 2016 Actually, XData content it is a just XML, in it is stored exactly as you wrote it in IDE. But it is possible to compile any XData to any other format as you need, at this portal you can find two articles about how to do it, first and second. In your case it could be much easier, like some method which in compile mode gets all XData content and place it to &html<>, which then compile again as usual, and what you need after it is just call this generated method, to show this html.
go to post Dmitry Maslennikov · May 26, 2016 Steve,I would recommend to distant webservers from ECP Application servers. In your case I would install webserver exactly on the server where ECP Application Server have already installed, so in this case your connect via superport will be secured, and in this case only web port should be opened in the firewall. Outside of this servers after firewall you need to use some load balancer, in this case I would recommend to use HAProxy. Connection between extarnal HAProxy and internal webservers could be secured with ssl, but I'm not sure that is really needed.And in this case it is possible to store all static content such as JS, CSS and images on server where load balancer placed, to avoid redundant request to the data servers. It is not a big problem for the production systems.So finally in simple view it my looks like below.
go to post Dmitry Maslennikov · May 18, 2016 It's is not good idea, not all time and not everywhere I have an access to google, but I have an access to my installation, and I have to search on my local machine. And such search should be support browser's search engines. And then I could do something like this.with settingsBut Ensemble documentation, should provide their own search engine to install in my browser without any manual operations. As it possible to do with AddSearchProvider
go to post Dmitry Maslennikov · May 13, 2016 Many times I need to get some link from documentation, to show particular part to someone. And some time it is quite difficult to get such link, and the worst place in Class References, where I can't get good link for a particular part of class.So, what I need is, an active icon with link, which then I can use, and for Class reference too.As an example github.
go to post Dmitry Maslennikov · May 10, 2016 As for me, when I have to investigate some strange behavior in my application, I prefer to read all journal files or limited by time, and then all records, and then I have some some to find exactly what I need, like only kill records or only sets, and only for some concrete global references. So, my usual code looks like this: set exit=0 set docId="14105401" set jrnFile=##class(%SYS.Journal.System).GetCurrentFileName() do { w !!,jrnFile,! set jrn=##class(%SYS.Journal.File).%OpenId(jrnFile) quit:'$isobject(jrn) #dim rec As %SYS.Journal.Record = jrn.FirstRecord set last=jrn.End set pr=0,opr=0 do { set pr=$j(rec.Address/last*100,0,2) if pr'=opr write $c(13),pr_"%" set opr=pr if rec.%IsA("%SYS.Journal.SetKillRecord") { set glb=rec.GlobalNode if $qs(glb, 0),"^My.Global",$qs(glb, 1)=docId { w !!,rec.Address,!,glb w ! } } set rec=rec.Next read q:0 set exit=q="q" quit:exit } while $isobject(rec) quit:exit set sc=jrn.GetPrev(jrnFile, .jrnFile) } while $$$ISOK(sc) quit This code looks all journal files, file by file from latest to oldest, and show progress for current journal file, and shows offset if it found something interesting
go to post Dmitry Maslennikov · May 8, 2016 In my opinion, it's more looks like by mistake, not sure why it could be done in other ways, it still working, with some limitations but any way.We can wait what would say InterSystems, may be they will fix it in future.
go to post Dmitry Maslennikov · May 7, 2016 You could just pass this arguments in Execute method, something like this new $namespace set $namespace="%sys" Set tRS = ##class(%ResultSet).%New("%SYS.Journal.File:Search") Set tSC = tRS.Execute("test", "/opt/cache/mgr/journal/20160507.001") if $$$ISERR(tSC) { do $system.OBJ.DisplayError(tSC) } do tRS.%Display() this code will return all offset's which contains text - 'test' You must remember that this query should be executed only in %SYS namespace. Usually we could use some another modern ways, which allow us to call queries. set statement=##class(%SQL.Statement).%New() set tSC=statement.%PrepareClassQuery("%SYS.Journal.File","Search") if $$$ISERR(tSC) { do $system.OBJ.DisplayError(tSC) } Set tRS = statement.%Execute("test", "/opt/cache/mgr/journal/20160507.001") or even much shorter set tRS=##class(%SYS.Journal.File).SearchFunc("test", "/opt/cache/mgr/journal/20160507.001") do tRS.%Display() But unfortunately such code snippets does not work in case when Query does not contain any parameters in his original declaration.
go to post Dmitry Maslennikov · May 6, 2016 126 error means - The specified module could not be found.So, you have dependency issue, so I recommend to use dependency tool which I suggested before, to find what you need.
go to post Dmitry Maslennikov · May 6, 2016 After this error you should look at cconsole.log, where you can find error code, why loading was failed.Mostly there are two errors with loading dll in cache, using 32bit dll instead of 64bit. And if this library has unsatisfied dependencies, in this case I'm using this tool to find such dependencies.
go to post Dmitry Maslennikov · May 4, 2016 Well, you can't write conditions in this way, and compile error which you see, it is actually parsing error for such conditionHow you can change it, You should define some function which may do all this check or partially, just return some value for check. To define such function, you should have your child for Ens.Rule.FunctionSet class, something like this Class Test.Utils Extends Ens.Rule.FunctionSet { ClassMethod GetAt(value As %String = "", index As %String) As %String { if $isobject(value) { quit value.GetAt(index) } quit "" } } and then, you can use it in this way, where GetAt your just created function. <rule name=""> <constraint name="msgClass" value="Test.TestMessage"></constraint> <when condition="GetAt(Document.myList,1)="AA""> <send transform="" target="DummyOperation"></send> <return></return> </when> </rule> But your function should return final value for checking, and you can't use write so, GetAt(Document.myList,1).property1="AA"
go to post Dmitry Maslennikov · May 2, 2016 If that routine uses curly brace style, such label should be marked as public. More details here
go to post Dmitry Maslennikov · May 1, 2016 Only two way to do it, Mapping with %ALL namespace as suggested Timothy, or %-class which as you already know by default mapped to all namespace, but I said how you should name your class, to send this class to Write-enabled database.