go to post Robert Cemper · May 2, 2019 You may try WebTerminal over HTTPS as an alternate way for access.
go to post Robert Cemper · May 2, 2019 It's really a matter of taste.If you don't like the long list of params (especially with lousy documented methods) you can#1) use 1 single param and pass a local array byRef . and decode it yourself eg:par("IPadrr")="127.0.0.1")par("Port")=1972par(Namespace")="SAMPLES".....do ##class(my.par).method(.par)or#2) use the traditional style you may know from Caché I/O Device Guide having also just 1 parameterdo ##class(my.pieces).method("/SERVER=127.0.0.1:/PORT=1972:/NAMESPACE=SAMPLES")I personally prefer #2) as it gives you an embedded doc on your intentions.
go to post Robert Cemper · Apr 29, 2019 #1) all documentation on XML is hereIt covers everything to output Objects to XML.#2) to fill this in-between object you may use the SQL Table represented by an object class. as simple INSERT INTO my.xmltable select .........You just have to take care that the object class also extends %XML.Adapter .That makes it ready for XML Export. All details described in docs
go to post Robert Cemper · Apr 26, 2019 Dear Martin,I have a rather clear vision where your $example comes from ($zzg, $zza, ...) My personal suggestion is to move everything you maintain today in %ZZLANG?00 routines into clean Macro definitions (.inc)The history of %LANG* code goes back to times when migration from other language dialects (MSM, DTM, DSM, VISOS, ..) happenedand developers were writing just in .INT routines. That's far back in the late 80ies. The availability of MACRO code (also ages back) made it almost obsolete. The feature was never eliminated by considerations of backward compatibility. I personally would never allow any developer to touch %SYS. And wouldn't accept any code using $zz* , zz* stuff or $zu().There are much cleaner ways to achieve the same result without compromising the core.
go to post Robert Cemper · Apr 25, 2019 You may take my previous article The 'unlimited' UNIQUE index as a suggestion how to work around this limit.
go to post Robert Cemper · Apr 23, 2019 if you just look for a specific property instead of a larger part of the objectyou may use set value=##class(ICT.Experiments.B).<propertyname>GetStored(primaryKey)instead of set collB=##class(ICT.Experiments.B).%OpenId(primaryKey)to avoid loading the full object
go to post Robert Cemper · Apr 19, 2019 I may misunderstand your intentions butwhen I use "ResultSet.%Get("Collection")", all I get is a list of the primary keys of the objects. now you all you miss for each PrimaryKey is Set collB=##class(ICT.Experiments.B).%OpenId(primaryKey) orSet collC=##class(ICT.Experiments.C).%OpenId(primaryKey)and the object is yours.With your class definition, PrimaryKey is the Idkey of the Object.
go to post Robert Cemper · Apr 15, 2019 the total size is somewhat strange its format changes from 255 to 256 in size and interpretationand again at 65535 / 65536 up to <MAXSTRING>
go to post Robert Cemper · Apr 15, 2019 special case:s a=$lb() zzdump a w !,$l(a) 0000: 01 .1s a=$lb("") zzdump a w !,$l(a) 0000: 02 01 ..2s a="" zzdump a w !,$l(a)0
go to post Robert Cemper · Apr 15, 2019 the structure of $LB() is rather simply a binary string-----------element--------------TotalLength = 1, 3, 7 bytes depending on size *corrected*Type = 1 byte (check in JSON converter for codes, or just check with ZZDUMP)Content : size = TotalLength-1-size of length field-----------element--------------TotalLength = 1, 3, 7 bytes depending on size *corrected*Type = 1 byte (check in JSON converter for codes, or just check with ZZDUMP)Content : size= TotalLength-1-size of length field-----------element--------------...Therefore concatenation of $lb) is so easy
go to post Robert Cemper · Apr 10, 2019 Sorry, I had more changes. My approach in details Class DC.String Extends %String {ClassMethod Get() As %String [ CodeMode = objectgenerator ]{ do %code.WriteLine($c(9) _ "Quit $g(^Test.String, 0)") quit $$$OK }ClassMethod Set(%val As %String) [ CodeMode = objectgenerator ] { do %code.WriteLine($c(9) _ "Set ^Test.String = %val") do %code.WriteLine($c(9) _ "do zTest()") quit $$$OK }/// this generates Method propTest() /// but satisfies the Compiler for this class ClassMethod Test() { quit ;; from Data definition }}compiles this routine: ;DC.String.1 ;(C)InterSystems, generated for class DC.String. Do NOT edit. 10/04/2019 12:00:42PM ;;42345370;DC.String ;zGet() public { Quit $g(^Test.String, 0) }zSet(%val) public { Set ^Test.String = %val do zTest() }zTest() public { quit ;; from Data definition }and the using class Class DC.StringTest Extends %RegisteredObject {Property prop As DC.String;Method Test(){ b quit ;; from using Class }}compiled as ;DC.StringTest.1 ;(C)InterSystems, generated for class DC.StringTest. Do NOT edit. 10/04/2019 12:02:35PM ;;49614632;DC.StringTest ;%NormalizeObject() public {If '$system.CLS.GetModified() Quit 1If m%prop Set:i%prop'="" i%prop=(..propNormalize(i%prop))Quit 1 }%ValidateObject(force=0,checkserial=1) public {set sc=1If '$system.CLS.GetModified() Quit scIf m%prop Set iv=..prop If iv'="" Set rc=(..propIsValid(iv)) If ('rc) Set sc=$$EmbedErr^%occSystem(sc,rc,5802,"prop",iv)Quit sc }zTest() public { b quit ;; from using Class}zpropGet() public {Quit $g(^Test.String, 0) }zpropSet(%val) public {Set ^Test.String = %valdo zTest() }zpropTest() public { quit ;; from Data definition}and the test SAMPLES>s obj=##class(DC.StringTest).%New()SAMPLES>set obj.prop=123 b quit ;; from using Class ^<BREAK>zTest+1^DC.StringTest.1SAMPLES 3d1>Well, the code generator can be tricky.It's not one of my favorites. But sometimes you have no choice.
go to post Robert Cemper · Apr 9, 2019 instead of do %code.WriteLine($c(9) _ "Quit ..Test()") use do %code.WriteLine($c(9) _ "Quit zTest()") It worked for me best
go to post Robert Cemper · Apr 9, 2019 OK.StorageTo../..ToStorage only works in persistent classes where you move content from/to globals.No chance without storage. It doesn't get called in Registered Classes and not when the object wasn't saved.see my test with %Persistentset obj=##class(Test.String).%New()write obj.prop ;nothing loaded yetset obj.prop=77 write obj.prop ; unchanged as neither stored nor loaded77do obj.%Save(),obj,%Reload() ; force reload to trigger StorageToLogicalwrite obj.prop ; and here we gopropThis proves that there is limited use of the approach.
go to post Robert Cemper · Apr 8, 2019 I could imagine inheriting standard data types for a customized data type and then adding methods LogicalToStorage and StorageToLogical similar as LogicalToObs, ....So your manipulations happen on the way from Global to the local variable.Additional Parameters eventually may control the generated code.It's just a vague idea.
go to post Robert Cemper · Apr 8, 2019 Ken Olson , the founder of DEC (Digital Equipment Corp.) was famous for its statement:"I can't imagine any good reason for someone to have a computer at his home" Similar in the late 1950ies IBM estimated the worldwide market for computers of 15..30 systems in total.So lack of phantasy what could be in the future is quite common also for very successful people and companies.
go to post Robert Cemper · Apr 6, 2019 inside &SQL() only SQL compatible code is allowedso $ZDT($H,3,1,3) is not known in SQLyou may doset %myts=$ZDT($H,3,1,3), %tx=tx&sql(SELECT {fn TIMESTAMPDIFF(SQL_TSI_HOUR,:%myts,:%tx)})mind the colon :%myts and :%tx to pass global accessible variables to embedded SQL
go to post Robert Cemper · Apr 1, 2019 you better not change %CSP.Login but make a personal copy and change this404 = HTTP page not found. Most likely you put your copy to the wrong directory or namespace And then you have to put the reference in MgmtPortal Security-> WebApplications as Login page:Again with the correct namespace and the correct directory.
go to post Robert Cemper · Mar 29, 2019 At first sight, I'd say you are looking for iKnow. Take a look
go to post Robert Cemper · Mar 27, 2019 @Aleksandar Kovacevic ISC Engineering & Support has this information and also appropriate tools for analysis.You better contact them directly in Cambridge.@Dmitry Maslennikov : Excellent explanation
go to post Robert Cemper · Mar 26, 2019 can't import %routines which I need. Without any special mapping, %routines are stored in SYSLIB. (except %z*,%Z*)Mount SYSLIB (default: read-only) as Read/Write and you can load your %routines. Needless to mention that you better not overwrite already existing %routines.The effects could be unpredictable.