go to post Eduard Lebedyuk · Aug 4, 2016 I doubt that this kind of information is available. Have you thought about wrapping global calls in a method? ClassMethod SetVal(glvn, value) { // track statistics, like $Username changed glvn from oldvalue to value, etc. set @glvn = value }
go to post Eduard Lebedyuk · Aug 4, 2016 Simpliest way: Cache executes an operating system command via $zf(-1) function.Alternatively, you can load a dll with $zf(-4) (also 3, 5) functions.There is also CNA project - it provides an interface for using native C-compatible shared libraries without anything but Caché ObjectScript code. CNA is a wrapper for libffi. CNA consists of native library (libcna) and Caché class (CNA.CNA). It is a wrapper around $zf functions.That said, the most effective would be some kind of a library load with library written in either C or generated from some computational language. For example Mathlab can generate C code, which can be then compiled into a library.
go to post Eduard Lebedyuk · Aug 4, 2016 Something like this? I had a similar problem, but the check was required only for part of the properties. If you want all of them, remove the line with continue. Method IsEmpty() As %Boolean [ CodeMode = objectgenerator ] { For i = 1:1:%class.Properties.Count() { Set Prop = %class.Properties.GetAt(i) CONTINUE:(Prop.Internal || Prop.Calculated || Prop.ReadOnly || Prop.Private || Prop.Identity) Do %code.WriteLine(" Quit:.." _ Prop.Name _ "'="""" $$$NO") } Do %code.WriteLine(" Quit $$$YES") }
go to post Eduard Lebedyuk · Aug 3, 2016 Are you in %SYS namespace? Underlying database (CACHELIB) is probably mounted as read-only.
go to post Eduard Lebedyuk · Aug 3, 2016 Inherit from EnsPortal.MessageViewer Copy searchPane from EnsPortal.Template.filteredViewer In searchPane, TimeFormat node replace attribute value="12" with value="999" Compile. Your new class would have Complete as TimeFormat default value Alternatively, instead of 2-4 you can set TimeFormat value in your class by overriding some init callback ( %OnAfterCreatePage maybe, don't forget to call ##super() though) and setting it there. It would be a better solution. 2020 UPDATE. I think I found a better solution. 1. Extend EnsPortal.MsgFilter.Assistant class. 2. In this class redefine EnumerateExecute method to provide the desired format. Replace this line: Do ..addTerm(.aSelect,"{fn RIGHT(%EXTERNAL(head.TimeCreated),"_dateLen_" )} As TimeCreated") to provide the format you need. Alternatively redefine OnFinalizeSQL to replace {fn RIGHT(%EXTERNAL(head.TimeCreated),999)} with something else. 3. Set the global ^EnsPortal.Settings("MessageViewer","AssistantClass") to the value of your class. This looks like an official way to modify MessageViewer behavior.
go to post Eduard Lebedyuk · Aug 3, 2016 12th piece is the FreezeOnError property for a Database and is always set to on (since 2008.1.0.217.0). The corresponding property FreezeOnError was removed from SYS.Database class.
go to post Eduard Lebedyuk · Aug 3, 2016 Sorry, I forgot that SYS.Database is deployed. You'll need to match $zu(49) to properties manually. But the macros usually have the same name. For example field 14 is sfnpiece macro ("piece" part of the name is irrelevant, so just sfn it is) and it corresponds to SFN property in SYS.Database. To test, you can write the following method: ClassMethod Test( Directory ) { Set db=##Class(SYS.Database).%OpenId(Directory) Write db.SFN = $p($zu(49),",",$$$sfnpiece) //14th piece // More checks }
go to post Eduard Lebedyuk · Aug 3, 2016 Check where in ParseZU49Info it takes field 14 and what property does it fills with that information. Check %syDatabase.inc for more information. #; Pieces of return value from $zu(49) #define mountpiece 1 #define blksizpiece 2 #define uicpiece 3 #define filsizpiece 4 #define expandpiece 5 #define maxblkpiece 6 #define glodirpiece 7 #define gloptrpiece 8 #define rdirpiece 9 #define rgrpiece 10 #define glogrpiece 11 #define freezepiece 12 #define colpiece 13 #define sfnpiece 14 #define totvolpiece 15 #define formatpiece 16 #define attribpiece 17 #define statuspiece 18 #define exptimepiece 19 #define nojrnpiece 20 #define bigdbpiece 21 #define curblkspiece 22 #define blkspermappiece 23 #define curmapspiece 24 #define resourcepiece 25 #define enckeyidpiece 26
go to post Eduard Lebedyuk · Aug 3, 2016 ParseZU49Info method in SYS.Database class translates $ZU(49) call into SYS.Database properties.
go to post Eduard Lebedyuk · Aug 3, 2016 - where can I get cache.node? The link in the Intersystmes documentation http://globalsdb.org/downloads/ doesn't work. I found cache0100.node and cache0120.node in my Cache instance's \bin directory. But I am not sure if I can use them or not.Cache instance's \bin directory is the correct path.Can anyone recommend any tutorial or code example with installation instructions?Samples are provided in <CacheDir>\dev\node.js\samples directory. Installation instructions are located in settings.js file.
go to post Eduard Lebedyuk · Jul 29, 2016 If they are defined in one class, try: ClientMethod logout() [ Language = javascript ] { this.DoLogout(); }
go to post Eduard Lebedyuk · Jul 28, 2016 Okay, then you need to use your original storage definition, but when selecting invalid, select it in a NVL function: SELECT ID, Code, Description, NVL(Invalid, 0) FROM Wendy.LTCodes It should return 0 instead of empty string.
go to post Eduard Lebedyuk · Jul 27, 2016 Runtime Variables are for that purpose.And if you want to apply filter to any MDX query against a cube, you can specify a %OnGetFilterSpec callback.
go to post Eduard Lebedyuk · Jul 26, 2016 These changes fixed it: Removed highlited part of storage definitionMade invalid property TransientAdded 0 default to $Get Class Wendy.LTCodes Extends %Persistent [ StorageStrategy = LTCStorage ] { Property Code As %String; Property Description As %String; Property Invalid As %Library.Boolean [ SqlComputeCode = { set {*} = ##class(Wendy.LTCodes).GetInvalid({Code})}, SqlComputed, Transient ]; Index CodeIndex On Code [ IdKey, PrimaryKey, Unique ]; ClassMethod GetInvalid(WSCode) As %Boolean { Quit $G(^LTCODES(WSCode,"INVALID"),0) } Method InvalidGet() As %Boolean { Quit ..GetInvalid(i%Code) } Method InvalidSet(value As %Boolean) As %Status { Set ^LTCODES(i%Code,"INVALID")=value quit $$$OK } /// Do ##class(Wendy.LTCodes).SetData() ClassMethod SetData() { kill ^LTCODES S ^LTCODES("N001")="ANYOLD DESC" S ^LTCODES("N001","INVALID")=1 S ^LTCODES("N002")="C5 REPEAT 1" S ^LTCODES("N111")="SPECIMEN COMMENT" S ^LTCODES("N200")="MSUD SCREEN|MSUD" S ^LTCODES("N500")="Sickle Cell Screen" } Storage LTCStorage { <SQLMap name="LTCMap"> <Data name="Description"> <Delimiter>"|"</Delimiter> <Piece>1</Piece> </Data> <Global>^LTCODES</Global> <Subscript name="1"> <Expression>{Code}</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^Wendy.LTCodesS</StreamLocation> <Type>%CacheSQLStorage</Type> } }
go to post Eduard Lebedyuk · Jul 26, 2016 I imported your example, executed: Do ##class(Wendy.LTCodes).SetData() Then executed this sql: SELECT ID, Code, Description, Invalid FROM Wendy.LTCodes and received the following results: IDCodeDescription InvalidN001N001ANYOLD DESC1N002N002C5 REPEAT 1 N111N111SPECIMEN COMMENT N200N200MSUD SCREEN N500N500Sickle Cell Screen seems to be working. But then I didn't really understand the use of Parameter InvalidGLVN = "^Utils.GlobalPropP"; it's for use with indirection. Example: set ^Utils.GlobalPropP = 123 set glvn = "^Utils.GlobalPropP" write glvn > ^Utils.GlobalPropP write @glvn > 123