go to post Eduard Lebedyuk · Jun 12, 2016 Great article, I find this feature very useful too, here's my %ZLANGC00: ; %ZLANGC00 ; custom commands for ObjectScript ; http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GSTU_customize Quit /// Execute Query and display the results /// Call like this: /// zsql "SELECT TOP 10 Name FROM Sample.Person" ZSQL(Query) #Dim ResultSet As %SQL.StatementResult Set ResultSet = ##class(%SQL.Statement).%ExecDirect(, Query) Do ResultSet.%Display() Quit /// Move user to a namespace of his choice /// Call like this: /// zm "s" ZM(Namespace) Do MoveToNamespace^%ZSTART(Namespace) Quit /// Move to Samples namespace and set a as a Samples.Person object /// Set b as %ZEN.proxyObject /// Set c as %Object ZO(move = 1) Public ZN:move "SAMPLES" If ##class(%Dictionary.CompiledClass).%ExistsId("Sample.Person") { Set p = ##class(Sample.Person).%OpenId(1) } Set a = ##class(%ZEN.proxyObject).%New() Set b = {} Quit and related %ZSTART: %ZSTART() { Quit } /// This entry point is invoked on user login /// offering user to choose a namespace LOGIN() Public { Set Timeout = 3 Write "Namespace <" _ $Namespace _ ">: " Read Namespace:Timeout // Get value of a Namespace variable Quit:Namespace="" Do MoveToNamespace(Namespace) } /// Does actual moving to a chosen namespace /// This is an entry point, for cases where /// Namespace value is already aquired MoveToNamespace(Namespace = "") Public { Set Timeout = 3 #Dim List As %ListOfDataTypes Set List = $$GetNamespaceList(Namespace) Set Count = List.Count() If Count = 1 { Set Choice = 1 } ElseIf Count > 1 { Do DisplayList(List) // If there is less then 10 results, then we need only 1 digit // Otherwise we need 2 digits // It is assumed that no more then 99 results would be returned Read "Select number <1>: ", Choice#$Select(Count < 10:1, 1:2):Timeout // If the user entered nothing or not a valid number // we select first namespace in a list to go to Set:((Choice = "") || ('$IsValidNum(Choice, 0, 1, Count))) Choice = 1 } Else { // No namespaces found Quit } Zn List.GetAt(Choice) } /// Get all availible namespaces that satisfy /// "Name %STARTSWITH Namespace" condition /// as %ListOfDataTypes GetNamespaceList(Namespace = "") { New $Namespace Set $Namespace = "%SYS" #Dim List As %ListOfDataTypes #Dim ResultSet As %SQL.StatementResult Set List = ##class(%ListOfDataTypes).%New() Set UserCondition = "%UPPER(Name) %STARTSWITH %UPPER(?)" // Or [ if you wish Set Condition="(" _ UserCondition _ ") AND (SectionHeader='Namespaces') AND (%UPPER(Name)!='%ALL')" Set SQL = "SELECT Name FROM Config.Namespaces WHERE " _ Condition Set ResultSet = ##class(%SQL.Statement).%ExecDirect(, SQL, Namespace) While ResultSet.%Next() { Do List.Insert(ResultSet.%Get("Name")) } Quit List } /// Display %ListOfDataTypes in a format: /// 1 item /// 2 item /// ... DisplayList(List) { #Dim List As %ListOfDataTypes Write ! For i = 1:1:List.Count() { Write i, $C(9), List.GetAt(i), ! } } Github repo.
go to post Eduard Lebedyuk · Jun 10, 2016 Both BuildValueArray and LogicalToDisplay work with serialized form of %ListOfDataTypes object - $list string: do ##class(%ListOfDataTypes).BuildValueArray($lb("a","b","c"), .out) zw out Outputs: out(1)="a" out(2)="b" out(3)="c" To sum up: %ListOfDataTypes - objectserialized %ListOfDataTypes - $list$list - a string (with special properties, but not an object)%List - $list
go to post Eduard Lebedyuk · Jun 9, 2016 Follow up on that. Can I store MD5/SHA in a database as is or do I need to convert it to base64 first?
go to post Eduard Lebedyuk · Jun 9, 2016 Yes, I'm aware of that. There is not that much records (hundreds of thousands tops). Still, decided to do a comparison: ClassMethod Time(count = 100000000) { Set str = "111111111111111111111111111111111111111111111111111111111" Set time1 = $P($h, ",", 2) For i=1:1:count { s a = $zcrc(str, 7) } Set time2 = $P($h, ",", 2) For i=1:1:count { s a = $System.Encryption.MD5Hash(str) } Set time3 = $P($h, ",", 2) For i=1:1:count { s a = $System.Encryption.SHA1Hash(str) } Set time4 = $P($h, ",", 2) For i=1:1:count { s a = $System.Encryption.SHAHash(256, str) } Set time5 = $P($h, ",", 2) Write !,"CRC: ",time2-time1,!,"MD5: ",time3-time2,!,"SHA1: ",time4-time3,!,"SHA2: ",time5-time4 } It outputs the following results: CRC: 14 MD5: 72 SHA1: 119 SHA2: 140
go to post Eduard Lebedyuk · Jun 9, 2016 Unfortunately there is no such thing. Would be great to have this feature. Currently in my projects I manually write all possible paths, for example here.
go to post Eduard Lebedyuk · Jun 9, 2016 A maximum of 254 arguments can be passed to a method: ClassMethod Gen(count = 255) { set out = "w ..hash(" for i=1:1:count-1 { set out = out _ "1," } set out = out _ "1)" x out } ClassMethod hash(in...) { set crc = 0 for i=1:1:in { set crc = $zcrc($char(i#256)_in(i), 7, crc) } return crc }
go to post Eduard Lebedyuk · Jun 9, 2016 > EnsLib.SQL.Snapshot.GetRowList().Thank you.> additional field in the external databaseWould have been nice, but not happening unfortunately.
go to post Eduard Lebedyuk · Jun 9, 2016 Here's CRC hashing method (accepts any number of arguments): ClassMethod hash(in...) { set delimiter = $c(255) set str = delimiter for i=1:1:in { set str = str _ in(i) _ delimiter } return $zcrc(str, 7) }
go to post Eduard Lebedyuk · Jun 7, 2016 Wait interval can be very small so it's okay.You could, I suppose, add some %ZSTOP code but that would be an overkill.
go to post Eduard Lebedyuk · Jun 6, 2016 Yes. Use resources instead. Read the docs. $ZPARENT value is also a "resource" that's getting created with the process, so children processes can communicate events to a parent process easily. As processes you want to pass messages between are not parent and child, you need to create and use explicitly named resources.
go to post Eduard Lebedyuk · Jun 6, 2016 Jobbed process runs independently of parent process.Killing a parent does not kill its children.That said, you can use events for interprocess communication.
go to post Eduard Lebedyuk · Jun 6, 2016 I think only profiler for the exact case can really answer this kind of questions. Too many nuances in the real-life code for one-fits-all solution of any kind to be feasible.
go to post Eduard Lebedyuk · Jun 6, 2016 > one "extremum" version: Does not really count. The method signature must be: ClassMethod ToPhone(t As %String) As %String {}
go to post Eduard Lebedyuk · Jun 6, 2016 Hello.While there is currently no way to it, you can see %DeepSee.UI.MDXExcel class, which does excel export and write your own csv exporter. It would be a simplified copy of %DeepSee.UI.MDXExcel.All output is done via &html so you need to replace that with the usual write.
go to post Eduard Lebedyuk · Jun 6, 2016 I knew about the second option (my original question was not clear on that I guess), but I'm really interested in the first option: how do I open *.cls directly?Here's the sample process:when I click on ContractFinalApprovalProcess BPL opens instead of cls.
go to post Eduard Lebedyuk · Jun 2, 2016 You can use %SerialObject for that: Class Utils.Serial Extends %SerialObject { Property Payload As %String; /// zw ##class(Utils.Serial).Test() ClassMethod Test(input As %String = {$lb(1,2,3,",",5)}) As %String { set obj = ##class(Utils.Serial).%New() set obj.Payload = input do obj.%SerializeObject(.str) kill (str) set obj = ##class(Utils.Serial).%Open(str) return obj.Payload } } For example: zw ##class(Utils.Serial).Test("1,2,3,,,5") >"1,2,3,,,5" zw ##class(Utils.Serial).Test($lb(1,2,3,",",5)) >$lb(1,2,3,",",5)
go to post Eduard Lebedyuk · Jun 1, 2016 Q1: 1. JS client sends URL encoded string automatically or almost automatically (most frameworks do URL encoding for any URL) 2. In your broker override OnPreDispatch method and unescape pURL with: set pURL = $ZCONVERT($ZCONVERT(pURL,"I","URL") ,"I","UTF8") Q2: It is against core REST architecture principles, so I hope not.
go to post Eduard Lebedyuk · May 31, 2016 You can use MDX2JSON or DeepSee REST API for pivot execution -> JSON conversion.