go to post Vitaliy Serdtsev · Feb 28, 2019 SQL Projection of Object-Valued Properties INSERT INTO Package_Tables.Person_Address (Person, element_key, Address_AddressType, Address_StreetAddress) VALUES (1,2,1,'72 Fake Street')
go to post Vitaliy Serdtsev · Feb 28, 2019 Working example: Class dc.test [ Abstract ] { /// d ##class(dc.test).Test1() ClassMethod Test1() [ ProcedureBlock = 0 ] { new active,reactive,info,i kill info set active = 1 set reactive = 2 for i="active","reactive" { set info(i)= @i } zw info } /// d ##class(dc.test).Test2() ClassMethod Test2() [ PublicList = (active, reactive) ] { new active, reactive kill info set active = 1 set reactive = 2 for i="active","reactive" { set info(i)= @i } zw info } }
go to post Vitaliy Serdtsev · Feb 22, 2019 What will the following code output? s resptext="{""access_token"":""4SDFDSFDSF-aSDASDASD"",""expires_in"":""3300"",""refresh_token"":"""",""scope"":""sms_send"",""token_type"":""Bearer""}" s sc = ##class(%ZEN.Auxiliary.jsonProvider).%ParseJSON(resptext,,.pObject,1) i $$$ISOK(sc) { w pObject,!!, pObject."access_token",!, pObject."expires_in",! k arr s arr="" d pObject.%CopyToArray(.arr) zw arr }else{ d $system.OBJ.DisplayError(sc) }My result (2018.1): USER>d ^test 1@%ZEN.proxyObject 4SDFDSFDSF-aSDASDASD 3300 arr("access_token")="4SDFDSFDSF-aSDASDASD" arr("expires_in")=3300 arr("refresh_token")="" arr("scope")="sms_send" arr("token_type")="Bearer"
go to post Vitaliy Serdtsev · Feb 22, 2019 What will the following code output? USER>k arr d pObject.%CopyToArray(.arr) zw arrPS: "in" ≠ "expires_in"
go to post Vitaliy Serdtsev · Feb 18, 2019 Hi Adrian. Made a small example: #dim rs As %ResultSet s pid=4652 s rs=##class(%ResultSet).%New("%SYS.ProcessQuery:VariableByPid") f filter="","a*" { w !,"Filter = ",$$$quote(filter),! d rs.Execute(pid,,,,filter) while rs.Next() { w "Name = ",rs.Get("Name"),", Value = ",rs.Get("Value"),! } }Result: USER:4652>s a="11",b="22",a1="33" w $job 4652 USER:1392>w $job,! d ^dc 1392 Filter = "" Name = a, Value = 11 Name = a1, Value = 33 Name = b, Value = 22 Filter = "a*" Name = a, Value = 11 Name = a1, Value = 33
go to post Vitaliy Serdtsev · Feb 16, 2019 The presence of a potential opportunity to read the documentation via "Class Reference". For macros from *.inc this is not possible.
go to post Vitaliy Serdtsev · Feb 15, 2019 Using Dynamic SQL Dynamic SQL Using Older Result Set Classes
go to post Vitaliy Serdtsev · Feb 15, 2019 See: %SYS.LockQuery %SYS.ProcessQuery:VariableByPid()/VariableByJobNumber() %SYSTEM.Memory:VariableStats() PS: $SYSTEM.Util.CleanDeadJobs().
go to post Vitaliy Serdtsev · Feb 14, 2019 Still another option: Class dc.test Extends %Persistent { Property JSONData As list Of %String [ SqlListType = SUBNODE ]; ClassMethod Test() { d ..%KillExtent() f l=$lb("apple","pear","plum"),$lb({"Name":"Kyle"}.%ToJSON(),{"Name":"Evgeny"}.%ToJSON()) { s t=..%New() d t.JSONData.InsertList(l) d t.%Save() } zw @$system.Dictionary.comMemberKeyGet($this,$$$cCLASSstorage,$$$nameDefaultStorageNameGet,$$$cSDEFdatalocation) s rs=##class(%SQL.Statement).%ExecDirect(,"select distinct json_arrayagg(JSONData %foreach(test)) from dc.test_JSONData") while rs.%Next() { s jsonStr=rs.%GetData(1), json=[].%FromJSON(jsonStr) w !,jsonStr,", %Size()=",json.%Size(),! } } }Result: USER>d ##class(dc.test).Test() ^dc.testD=2 ^dc.testD(1)=$lb("") ^dc.testD(1,"JSONData")=3 ^dc.testD(1,"JSONData",1)="apple" ^dc.testD(1,"JSONData",2)="pear" ^dc.testD(1,"JSONData",3)="plum" ^dc.testD(2)=$lb("") ^dc.testD(2,"JSONData")=2 ^dc.testD(2,"JSONData",1)="{""Name"":""Kyle""}" ^dc.testD(2,"JSONData",2)="{""Name"":""Evgeny""}" ["apple","pear","plum"], %Size()=3 [{"Name":"Kyle"},{"Name":"Evgeny"}], %Size()=2Doc: SqlListType JSON_ARRAYAGG
go to post Vitaliy Serdtsev · Jan 16, 2019 if I call giveMeAFalseMe from Cache when it's returning "true" or "false", Cache will translate "true" into a truthy %Boolean return value, right? No, it does zenBool, which is on the client side. The important thing is that #server()# always returns a string, for example: <script language="cache" method="giveMeAFalse" arguments="" procedureblock='1' returntype="%Integer">return 4</script> var bool = #server(..giveMeAFalse())#; console.log("bool = " + bool); console.log("typeof bool = ", typeof bool); Result: bool = 4 typeof bool = string PS: you can further explore the sources of the #server()# -> cspHttpServerMethod() -> cspProcessResponse(), which are in the file cspxmlhttp.js.
go to post Vitaliy Serdtsev · Jan 15, 2019 See zenConvertType() [///Converts a typed value returned from the server to an appropriate JS type] from zenutils.js. Try this: <script src="zenutils.js"></script> <script language="javascript"> function isItActuallyFalse() { var bool = zenConvertType('BOOLEAN',#server(..giveMeAFalse())#); ... } </script> <script language="cache" method="giveMeAFalse" arguments="" returntype="%Boolean" procedureblock='1'>return $$$NO</script>or var bool = zenBool(#server(..giveMeAFalse())#); ... <script language="cache" method="giveMeAFalse" arguments="" returntype="%Boolean" procedureblock='1'>return "false"</script>
go to post Vitaliy Serdtsev · Dec 31, 2018 s tags=$lb("a","b","c"), str="c,a1,d,b,f" s l=$lfs(str),ptr=0 while $listnext(tags,ptr,tag) { w:$lf(l,tag) tag,! }Result b c
go to post Vitaliy Serdtsev · Dec 18, 2018 Source code of class %Net.Remote.Utility is open, so you can use it to make your "RunCommandViaCPIPE" method and already use it. PS: it's just a wrapper around low-level commands, see Local Interprocess Communication.
go to post Vitaliy Serdtsev · Nov 2, 2018 No. If you beware to use %occLibrary, you may look into side %Regex.Matcher Here is another documented solution: #include %systemInclude n try{ #define TAB $c(9) s csv="""ABC,"_$c(10)_" Company,"",""123 Main St, Ste 102"",""Anytown, DC"",10001,234-567-8901,""Anytown"_$$$TAB_"DC""" d ##class(%DeepSee.TermList).%ParseCSVRecord(csv,.arr) w csv,!!,$$WriteCSVRecord(.arr,$$$TAB) }catch(ex){ w "Error ", ex.DisplayString(),! } WriteCSVRecord(&pRecord, pDelim=",", pEncode=$$$YES) { // made on the basis of the method %WriteCSVRecord Set r = "" Set k = $O(pRecord("")) While (k'="") { Set tValue = $G(pRecord(k)) Set:$G(pEncode) tValue = $ZCVT(tValue,"O","UTF8") Set r = r _ $S((tValue["""")||(tValue[",")||(tValue[pDelim):$$$quote(tValue),1:tValue) Set k = $O(pRecord(k)) Set:k'="" r = r _ pDelim } Quit r }Result: USER>d ^dc "ABC, Company,","123 Main St, Ste 102","Anytown, DC",10001,234-567-8901,"Anytown DC" "ABC, Company," "123 Main St, Ste 102" "Anytown, DC" 10001 234-567-8901 "Anytown DC"
go to post Vitaliy Serdtsev · Nov 1, 2018 #include %systemInclude s csv="ABC Company,""123 Main St, Ste 102"",""Anytown, DC"",10001,234-567-8901" s list=$$CSVtoList^%occLibrary(csv) f i=1:1:$ll(list) s:$li(list,i)["," $li(list,i)=$$$quote($li(list,i)) w csv,!,$lts(list,$c(9))Result: USER>d ^test ABC Company,"123 Main St, Ste 102","Anytown, DC",10001,234-567-8901 ABC Company "123 Main St, Ste 102" "Anytown, DC" 10001 234-567-8901
go to post Vitaliy Serdtsev · Nov 1, 2018 Maybe the name of the topic to specify a CSV-string instead of string ? After clarification, the question became more clear.