go to post Vitaliy Serdtsev · Jun 15, 2017 The jsonProvider code may also be invoked from a non-Zen context by calling one of the following APIs: %WriteJSONFromArray %WriteJSONFromObject %WriteJSONStreamFromArray %WriteJSONStreamFromObject %ConvertJSONToObject proof Example: d ##class(%ZEN.Auxiliary.jsonProvider).%WriteJSONStreamFromObject(.stream,..%OpenId(1),,,1,"aelqoc") w "<- json = ",stream.Read(),!
go to post Vitaliy Serdtsev · Jun 15, 2017 I do have a question, though: Is there any way to use a defined ODBC DSN in the connection string using CacheActiveX? No: Defining a Connection String
go to post Vitaliy Serdtsev · Jun 14, 2017 Example: ADODB + $list Defining and Using Stored Procedures
go to post Vitaliy Serdtsev · Jun 14, 2017 Do make re-indexing: How to build indices for a class if you add an index after creating records
go to post Vitaliy Serdtsev · Jun 14, 2017 E.g.: s fileName="C:\temp\test.txt" s f=##class(%FileCharacterStream).%New() s f.Filename=fileName s f1=##class(%FileCharacterStream).%New() s f1.Filename=fileName d f.Write("start ") d f.CopyFrom(f1) d f.Write(" end") d f.SaveStream() s f="",f1=""Result: test.txt (Before): bla-bla-bla test.txt (After): start bla-bla-bla end
go to post Vitaliy Serdtsev · Jun 14, 2017 If you know how to work with ActiveX from MS Excel VBA, then there is no problem. E.g. (demo.vbs): Set f = CreateObject("CacheActiveX.Factory") Set rs = CreateObject("CacheActiveX.ResultSet") If Not f.IsConnected() Then f.Connect("cn_iptcp:127.0.0.1[1972]:SAMPLES:_SYSTEM:SYS") Set rs=f.DynamicSQL("select TOP 3 * from Sample.Person") rs.Execute() while rs.Next WScript.Echo rs.Get("SSN") 'print of field SSN for first three rows from the table Sample.Person wend rs.Close() Set person = f.Static("Sample.Person") age=person.CurrentAge(45678) 'call of method of class Sample.Person WScript.Echo age End IfRunning a Query in Visual Basic
go to post Vitaliy Serdtsev · Jun 9, 2017 Indeed, thank you: Class demo.B Extends %Persistent [ Final ] { Parameter MANAGEDEXTENT As INTEGER [ Constraint = "0,1", Flags = ENUM ] = 0; Parameter READONLY = 1; Property P2; Storage Default { <Data name="BDefaultData"> <Value name="3"> <Value>P2</Value> </Value> </Data> <DataLocation>^demo.AD</DataLocation> <DefaultData>BDefaultData</DefaultData> <IdLocation>^demo.AD</IdLocation> <IndexLocation>^demo.AI</IndexLocation> <StreamLocation>^demo.AS</StreamLocation> <Type>%Library.CacheStorage</Type> } }
go to post Vitaliy Serdtsev · Jun 9, 2017 Is there any way to "generate" compatible storage? And why SQLStorage? Why not default CachéStorage, but copy-pasted from Class A? Unfortunately, to use %CacheStorage will not work, since at compile occurs the error: ERROR #5564: Storage reference: '^demo.AD' used in 'demo.B.cls' is already registered for use by 'demo.A.cls' > ERROR #5030: An error occurred while compiling class 'demo.B'
go to post Vitaliy Serdtsev · Jun 9, 2017 If you only need SQL access, then will be easier to create a view (CREATE VIEW), if need both, then - %CacheSQLStorage, e.g.: Class demo.A Extends %Persistent { Property P1; Property P2; ClassMethod Fill() { d ..%KillExtent() f i=1:1:3 { s t=..%New() s t.P1="P1_"_i s t.P2="P2_"_i d t.%Save() } } Storage Default { <Data name="ADefaultData"> <Value name="1"> <Value>%%CLASSNAME</Value> </Value> <Value name="2"> <Value>P1</Value> </Value> <Value name="3"> <Value>P2</Value> </Value> </Data> <DataLocation>^demo.AD</DataLocation> <DefaultData>ADefaultData</DefaultData> <IdLocation>^demo.AD</IdLocation> <IndexLocation>^demo.AI</IndexLocation> <StreamLocation>^demo.AS</StreamLocation> <Type>%Library.CacheStorage</Type> } } Class demo.B Extends %Persistent [ Final, StorageStrategy = Default ] { Parameter READONLY = 1; Property P2; Storage Default { <SQLMap name="BDefaultData"> <Data name="P2"> <Piece>3</Piece> </Data> <Global>^demo.AD</Global> <RowIdSpec name="1"> <Expression>{L1}</Expression> <Field>ID</Field> </RowIdSpec> <Subscript name="1"> <Expression>{ID}</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^demo.AS</StreamLocation> <Type>%CacheSQLStorage</Type> } }Result: USER>d ##class(demo.A).Fill() USER>d $SYSTEM.SQL.Shell() SQL Command Line Shell ---------------------------------------------------- The command prefix is currently set to: >. Enter q to quit, ? for help. USER>>select * from demo.A 1. select * from demo.A ID P1 P2 1 P1_1 P2_1 2 P1_2 P2_2 3 P1_3 P2_3 3 Rows(s) Affected statement prepare time(s)/globals/lines/disk: 0.1426s/46110/260143/45ms execute time(s)/globals/lines/disk: 0.0004s/16/809/0ms cached query class: %sqlcq.USER.cls12 --------------------------------------------------------------------------- USER>>select * from demo.B 2. select * from demo.B ID P2 1 P2_1 2 P2_2 3 P2_3 3 Rows(s) Affected statement prepare time(s)/globals/lines/disk: 0.0696s/44550/243602/0ms execute time(s)/globals/lines/disk: 0.0002s/4/619/0ms cached query class: %sqlcq.USER.cls13 --------------------------------------------------------------------------- USER>>quit USER>w ##class(demo.B).%OpenId(3).P2 P2_3
go to post Vitaliy Serdtsev · Jun 8, 2017 Do not forget about the method signature: ClassMethod main() As %StringNeed not print the number, but return it.
go to post Vitaliy Serdtsev · Jun 7, 2017 http://docs.intersystems.com/cache52/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.Version#GetMajor
go to post Vitaliy Serdtsev · Jun 7, 2017 See "predefine the type of an specific piece of a global" USER>s a=" 1.0", b=" 2.2" w w !,a]]b a=" 1.0" b=" 2.2" 0 USER>s a=$double(1.0), b=$double(2.2) w w !,a]]b a=1 b=2.2000000000000001776 0
go to post Vitaliy Serdtsev · Jun 7, 2017 Ok, exclusively for fun. I made some improvements and now my score is 9, but if you try very hard, even - 0!Who less ? ;) Here is the code: Class ITPlanet.Task2 [ Abstract ] { Parameter p = {$zwbunpack("㤸㜶㔴㌲")}; ClassMethod main() As %String { q ..#p } } Class ITPlanet.Test [ Abstract ] { ClassMethod length( class = {$classname()}, method = "main") As %Integer [ CodeMode = expression ] { ##class(%Dictionary.MethodDefinition).IDKEYOpen(class, method).Implementation.Size } ClassMethod test(makeDeploy = {$$$NO}) { ;do ##class(ITPlanet.Test).test() set classname="ITPlanet.Task2" set check=9876543210 do:makeDeploy $system.OBJ.MakeClassDeployed(classname) set result=$classmethod(classname,"main") write !,result,!,check, !,"correct: ",$select(result=check:"yes",1:"no"), !,"length: ",..length(classname) } } USER>do ##class(ITPlanet.Test).test() 9876543210 9876543210 correct: yes length: 9 USER>do ##class(ITPlanet.Test).test(1) 9876543210 9876543210 correct: yes length: 0
go to post Vitaliy Serdtsev · Jun 7, 2017 Here my very old article on the subject (machine translation).
go to post Vitaliy Serdtsev · Jun 6, 2017 Rhetorical question - for what?If for fun, then this is possible.But I will tell the solution here later.
go to post Vitaliy Serdtsev · Jun 6, 2017 My result is 21.It is similar to the variant of Alexander, but only _+"".
go to post Vitaliy Serdtsev · Jun 6, 2017 You can use the class %ZEN.proxyObject, e.g.: Class demo.Customer Extends %RegisteredObject { Property p1 As %String; Property p2 As %String; Property list As %Collection.ListOfDT; /// d ##class(demo.Customer).Test() ClassMethod Test() { s customer=##class(demo.Customer).%New() s customer.p1="p1" s customer.p2="p2" s customer.list=##class(%ListOfDataTypes).%New() d customer.list.InsertList($lb(1,"two",,"four")) s appointment=##class(%ZEN.proxyObject).%New() s appointment.a1="a1" s appointment.a2="a2" s appointment.list=##class(%ListOfDataTypes).%New() d appointment.list.InsertList($lb(2,3,"test",8)) ; Cancellation s response=##class(%ZEN.proxyObject).%New() s response.Code="Cancellation" s response.Info="Info_Cancellation" w response.Code,":",! d response.%ToJSON(,"2aelow") d response.%Clear() ; Customer s response.Code="Customer" s response.Info=customer w !!,response.Code,":",! d response.%ToJSON(,"2aelow") d response.%Clear() ; Appointment s response.Code="Appointment" s response.Info=appointment w !!,response.Code,":",! d response.%ToJSON(,"2aelow") } } USER>d ##class(demo.Customer).Test() Cancellation: { "Code":"Cancellation", "Info":"Info_Cancellation" } Customer: { "Code":"Customer", "Info": { "p1":"p1", "p2":"p2", "list":["1","two","","four"] } } Appointment: { "Code":"Appointment", "Info": { "a1":"a1", "a2":"a2", "list":[2,3,"test",8 ] } }
go to post Vitaliy Serdtsev · Jun 2, 2017 The translation was already done: Localization in Caché DBMS