go to post Robert Cemper · Mar 7, 2018 Hi Evgeny,class %DeepSee.UserPortal.DashboardViewer has a property saveAction as %ZEN.Datatype.string;Container for the current save mode for source control.http://localhost:57774/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=samples&CLASSNAME=%25DeepSee.UserPortal.DashboardViewer#PROPERTY_saveActionif you combine this with standard $system.OBJ.Export() this may do it.SAMPLES>s sc=$system.OBJ.Export("B*.DFI","DeepSee.xml") Exporting to XML started on 03/07/2018 09:36:32Exporting type : Basic Dashboard Demo.dashboard.DFIExport finished successfully.
go to post Robert Cemper · Mar 5, 2018 and if you write this string to a %Stream.FileCharacter It's a file again.http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Stream.FileCharacterand your file is base64 encoded
go to post Robert Cemper · Mar 5, 2018 try to encode / decode your text to base64 to make sure you don't get in conflict with transmission control chars.http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.Encryption#METHOD_Base64Encodehttp://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.Encryption#METHOD_Base64Decode
go to post Robert Cemper · Mar 4, 2018 A good friend of mine provided this solution using also JSON types and internal $LB() types for more detailed type analysis.Of course there's no guaranty for the hidden types in $LB() . types ; Show COS-Datatypes ; kav ; 2018-03-04 // set obj=##class(Person).%New() write "VALUE",?15,"JSON",?22,"$LISTBUILD",! ,$TR($J("",32)," ","-"),! for val="453","abcd",1234,"abc"_$c(352), -34, 1.3, -7.9, $double(1.25),obj { write val,?15,$$TypeOf1(val),?22,$$TypeOf2(val,.txt),.txt! } quit // Return JSON datatype by the documented way // TypeOf1(val) Public{ quit [(val)].%GetTypeOf(0) } // Return datatype by the undocumented $LB() way // TypeOf2(val) Public { if $length(val)>253 { set typ=$ziswide(val)+1 } else { set typ=$a($lb(val),2) } set txt=$case(typ ,1:" 8bitString" ,2:" 16bitString" ,4:" nonNegativeInteger" ,5:" negativeInteger" ,6:" nonNegativeFloat" ,7:" negativeFloat" ,8:" double" , :" ??? never seen before") quit typ}d ^typesVALUE JSON $LISTBUILD--------------------------------453 string 1 8bitStringabcd string 1 8bitString1234 number 4 nonNegativeIntegerabcŠ string 2 16bitString-34 number 5 negativeInteger1.3 number 6 nonNegativeFloat-7.9 number 7 negativeFloat1.25 number 8 double1@User.Person oref 1 8bitString
go to post Robert Cemper · Mar 2, 2018 I hope it will be recorded as I'm already booked at that time and can't attend
go to post Robert Cemper · Mar 2, 2018 pls. distinguish correctlySystemVariable $ZT / $ZTRAP .... error trapSystenFunction $ZT() / $ZTIME() ... time conversionHint: don't waste your time on Google. Online Documentation knows it all.docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls
go to post Robert Cemper · Mar 1, 2018 simplified you could translate it to "lazy loading" if not in memorymore: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persobj_swizzling
go to post Robert Cemper · Mar 1, 2018 you need an oref in ref and also in Myproperty1, ... So you have to check both . see answer
go to post Robert Cemper · Mar 1, 2018 ClassMethod myfuct( id) As %String{ set ref=##class(myClass).%OpenId(id) If '$isobject(ref) quit "no object 1, no return" if '$isrobject(ref.Myproperty1) quit "no object 2, no return" set str="my return: "_ref.Myproperty1.OtherClass1Property quit str}
go to post Robert Cemper · Mar 1, 2018 you do set ref=##class(myClass).%OpenId(id)but you don't check if you really got an object. the id might be invalidcontinue with if '$isobject(ref) quit ""
go to post Robert Cemper · Mar 1, 2018 the code causing the problem in MyClass.2.int looks most likely like this: Set oid=$select(i%Myproperty="":"",1:$listbuild(i%Myproperty_""))you are inside an ObjectMethod and miss the actual Object reference.This happens when you try to access a property inside a Classmethod. classic mistake:ClassMethod MyMethod(1,2,3) as %Status { set x=..Myproperty}correct use: ClassMethod MyMethod(oref,1,2,3) as %Status { set x=oref.Myproperty}
go to post Robert Cemper · Mar 1, 2018 Whether external backup or backup from a mirror (also asynchronous) or Caché backup you always have to identifythe point in time when your DB is logically consistent. What I think of is no open transactions, no open dependencies.If you know that point in time you could separate your async mirror or shadow and run any backup from there.Or just shut down your async server instance and run snapshots.But there might also be a time gap between master and async server.Once completed your async server can join again and catch up whatever time that may take. The critical point is to know when the async server has reached consistency.But that depends on the application.
go to post Robert Cemper · Feb 28, 2018 there is a method CopyFromStream that really moves the content to a new StreamSo your PDF moves from physical file to a Global stream that you work up and down as a "private" copy.Without touching the original anymore. This might be a useful option.
go to post Robert Cemper · Feb 28, 2018 for a file stream it's a physical file, for a global stream it's a global or part of it.if you clear it you either delete the file or the global (or its part )that holds the stream.stream in Caché describes a sequence of persistent bytes on disk that you work on with dedicated common methods.this must not be mixed up with a stream of characters on a network connection. if you miss a character there it's gone.
go to post Robert Cemper · Feb 28, 2018 Clear() removes all content. The easiest way to CLEAR a file is to remove it. in any file system.
go to post Robert Cemper · Feb 28, 2018 "lightweight" is the theoretical approach for object purists that want to have just 1 object covering the world and don't care about practical use. They often were moaning "oh only 1.n relationship". As you noted "heavy" allows real relation management. And could be faster in some cases.
go to post Robert Cemper · Feb 28, 2018 Hi Alexey,You hit the point: "lightweight" just documents the relation. Full stop. No further service.You have to service (ie. Delete) it at both ends.If you use a serial object with OREF + Status) you still have to service both ends.The "heavy" variant does it centralized at one place.Though from storage point of view you move out the additional subscript level from array.
go to post Robert Cemper · Feb 27, 2018 Hi, Evegeny!for both variants you work along the array by GetNext() methodfor each employee you have an array with the OREFs of the company. So you have the full object at hands.similar the opposite direction from company to employee and employee->nae in SQL or employee.nameAnd as we always have a Collection type Array indexing is simple either by (KEY) or (ELEMENT). whether you need the ID or the OREFhttp://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQLOPT_indices#GSQLOPT_indices_collectionsThe only tricky action is DELETE: there you have to have a method to "DisRelate" before delete.But real commercial systems never delete anything. Just set a flag "isDeleted". Which is much easier for any "undo" action.
go to post Robert Cemper · Feb 27, 2018 It's a value returned from OS:So this might be platform dependent.the call is $zu(140,5,$select($$$isVMS&&(%file'[";"):%file_";*",1:%file))the part for VMS deletes all versions of the file if the name is not terminated by " ;"