go to post Vitaliy Serdtsev · May 24, 2017 Pass-through if No DDL Mapping is FoundE.g.:CREATE TABLE Person (Name varchar(50), FavoriteColors %Collection.ListOfDT)CREATE TABLE Person (Name varchar(50), FavoriteColors %List)CREATE TABLE Person (Name varchar(50), FavoriteColors %ListOfDataTypes)
go to post Vitaliy Serdtsev · May 24, 2017 I would recommend instead of Google Translate use the service Yandex TranslateDirect link to a machine translation of the article from Yandex Translate.The quality of the translation in my think here are better.
go to post Vitaliy Serdtsev · May 24, 2017 The solution to this issue (and not only it) is described in the second part of the article in my blog (in Russian):$(REST - CSP - (-HyperEvents) + EasyUI + File Upload). Part 2The entire article consists of five parts.
go to post Vitaliy Serdtsev · May 20, 2017 And what this bill says is the documentation (What Is Caché?)?
go to post Vitaliy Serdtsev · May 17, 2017 Refine your version $zv. Perhaps in older versions there were bugs that were then fixed.Simple test:Class my.children Extends %Persistent{Property p1;Relationship parent As my.parent [ Cardinality = parent, Inverse = children ];Method %OnConstructClone( object As %RegisteredObject, deep As %Boolean = 0, ByRef cloned As %String) As %Status [ Private, ServerOnly = 1 ]{ s i%p1 = object.p1 _ " cloned" q $$$OK}}Class my.parent Extends %Persistent{Property p1;Relationship children As my.children [ Cardinality = children, Inverse = parent ];ClassMethod Fill(){ ;d ##class(my.parent).Fill() d ..%KillExtent() f i = 1:1:3 { s p = ..%New() s p.p1 = "parent["_i_"]" f j = 1:1:2 { s c = ##class(my.children).%New() s c.p1 = $$$FormatText("children[%1,%2]",i,j) d p.children.Insert(c) } d p.%Save() } zw ^my.parentD w !,"_______",!! f i = 1,3 d ..%OpenId(i).%ConstructClone($$$YES).%Save() ; or so - the result is the same ; f i = 1,3 d ..%OpenId(i).%ConstructClone($$$NO).%Save() zw ^my.parentD}Method %OnConstructClone( object As %RegisteredObject, deep As %Boolean = 0, ByRef cloned As %String) As %Status [ Private, ServerOnly = 1 ]{ s i%p1 = object.p1 _ " cloned" q $$$OK}}USER>w $zvCache for Windows (x86-64) 2017.2 (Build 672U) Wed May 10 2017 20:43:42 EDTUSER>d ##class(my.parent).Fill()^my.parentD=3^my.parentD(1)=$lb("","parent[1]")^my.parentD(1,"children",1)=$lb("","children[1,1]")^my.parentD(1,"children",2)=$lb("","children[1,2]")^my.parentD(2)=$lb("","parent[2]")^my.parentD(2,"children",3)=$lb("","children[2,2]")^my.parentD(2,"children",4)=$lb("","children[2,1]")^my.parentD(3)=$lb("","parent[3]")^my.parentD(3,"children",5)=$lb("","children[3,2]")^my.parentD(3,"children",6)=$lb("","children[3,1]") _______ ^my.parentD=5^my.parentD(1)=$lb("","parent[1]")^my.parentD(1,"children",1)=$lb("","children[1,1]")^my.parentD(1,"children",2)=$lb("","children[1,2]")^my.parentD(2)=$lb("","parent[2]")^my.parentD(2,"children",3)=$lb("","children[2,2]")^my.parentD(2,"children",4)=$lb("","children[2,1]")^my.parentD(3)=$lb("","parent[3]")^my.parentD(3,"children",5)=$lb("","children[3,2]")^my.parentD(3,"children",6)=$lb("","children[3,1]")^my.parentD(4)=$lb("","parent[1] cloned")^my.parentD(4,"children",7)=$lb("","children[1,2] cloned")^my.parentD(4,"children",8)=$lb("","children[1,1] cloned")^my.parentD(5)=$lb("","parent[3] cloned")^my.parentD(5,"children",9)=$lb("","children[3,2] cloned")^my.parentD(5,"children",10)=$lb("","children[3,1] cloned")
go to post Vitaliy Serdtsev · May 10, 2017 The next question is, what hashing algorithm is Cache using to create the hash?CRC32I will need to replicate that in JavaScript, or come up with some other hash approach.Localization for Client-side TextI assume $mvv(58) is set by the system when its installed? But can't find any information on that at the moment.$mvv(58) - Default Language for a session either user defined or CSP based.PS: Look at the source code %occMessages.inc - there's a lot of tasty there ;) or read the article in my blog, but it's in russian language :(
go to post Vitaliy Serdtsev · Feb 3, 2017 The only single problem here – there is no direct support for importing from .JSON files even for recent versions of Caché/Ensemble with builtin JSON support in the kernel.See %Library.DynamicAbstractObject:%FromJSON(), %ZEN.Auxiliary.jsonProvider:%ConvertJSONToObject(), %ZEN.Auxiliary.jsonProvider:%ParseFile(), %ZEN.Auxiliary.jsonProvider:%ParseJSON()Given:test.json: {"a":"test","b":[1,2,3,4]} s file=##class(%Stream.FileCharacter).%New() s file.Filename="C:\test.json" s file.TranslateTable="UTF8" d ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(file,,.obj) d obj.%Print() Output:-----------------a: "test"b: [1] 1 [2] 2 [3] 3 [4] 4
go to post Vitaliy Serdtsev · Feb 2, 2017 It seems to me that in this case is not well suited %SerialObject.Will be easier to use %List.
go to post Vitaliy Serdtsev · Feb 2, 2017 > Can I make a serial class always computed?Yes, of course.Class CS.Serial Extends %SerialObject [ NoExtent ]{Property Year As %Integer;Property Month As %Integer;}Class CS.Persistent Extends %Persistent{Property data As CS.Serial [ SqlComputeCode = {set {*} = ##class(CS.Persistent).dataGetStatic()}, SqlComputed, Transient ];ClassMethod dataGetStatic() As %List{ quit $lb(2017,1)}}Output:^CS.PersistentD=1^CS.PersistentD(1)=$lb("")ID data1 $lb(2017,1) 1 Rows(s) Affected
go to post Vitaliy Serdtsev · Feb 2, 2017 It all depends on what you wish to achieve.For example:Class CS.Serial Extends %SerialObject{Property Year As %Integer;Property Month As %Integer;Method %MyGetSerial() As %List [ ServerOnly = 1 ]{ q $lb(i%Year,i%Month)}}Class CS.Persistent Extends %Persistent{/// Property is triggered computedProperty data1 As CS.Serial [ SqlComputeCode = {set {*} = ..dataGetStatic()}, SqlComputed ];/// Property is always computedProperty data2 As %List [ SqlComputeCode = {set {*} = ##class(CS.Persistent).dataGetStatic()}, SqlComputed, Transient ];/// data getter method in SQL contextClassMethod dataGetStatic() As %List{ s s=##class(CS.Serial).%New(), s.Month=1, s.Year=2017 q s.%MyGetSerial() ; or q $lb(2017,1)}}---------select ID,data1,data2,data1_Month,data1_Year from CS.PersistentID data1 data2 data1_Month data1_Year1 2017,1 2017,1 1 20172 2017,1 2017,1 1 20173 2017,1 2017,1 1 2017
go to post Vitaliy Serdtsev · Jan 25, 2017 Try to use high level interface to work with sockets: %IO.Socket, %IO.SocketCommon.Look on %SYSTEM.INetInfo.Connected() [aka $ZUTIL(189)] or you can use tools of OS [for example see source code %SYSTEM.INetInfo.CheckAddressExist()]
go to post Vitaliy Serdtsev · Jan 16, 2017 See /csp/samples/timer.csp in SAMPLESNote: by timeout you can run any method: on the client side (javascript) and/or on the server side (COS).
go to post Vitaliy Serdtsev · Jan 13, 2017 # 1d ##class(%ListOfDataTypes).BuildValueArray($lfs("a,b,c,d,e,f"),.array)s array(0)=$o(array(""),-1)zw array# 2s list=##class(%ListOfDataTypes).%New()d list.InsertList($lfs("a,b,c,d,e,f"))m array=list.Datas array(0)=list.Count()zw arrayThe Result for both variant:array(0)=6array(1)="a"array(2)="b"array(3)="c"array(4)="d"array(5)="e"array(6)="f"
go to post Vitaliy Serdtsev · Jan 10, 2017 You could do the same thing by creating a View with a function in the WHERE clause that called the method to figure out if you should see the row or not.responsibility lies on developer don't to forget add additional conditions: WHERE, %IGNOREINDEX, etc.the query becomes more complicatedI think this is a cleaner solution as you do not need to worry about the %RLI becoming available again. What prevents force disable %RLI in ^%ZSTART or $SYSTEM.SQL.SetServerInitCode() ?
go to post Vitaliy Serdtsev · Jan 10, 2017 Important: pre-need string to convert to UTF-8 USER>w ##class(%xsd.hexBinary).LogicalToXSD($system.Encryption.SHAHash(512,$zcvt("тестtest","O","UTF8"))) 83B481B1A58FA416F34BFF575F2DCA866C6AB790CF0941BC0F1E7E91D916D22866CB9575C666021B2F8A796B20A484ABB29403853EDEA6173B9A61758060117E USER>w ##class(%xsd.hexBinary).LogicalToXSD($system.Encryption.SHAHash(512,$zcvt("test","O","UTF8"))) EE26B0DD4AF7E749AA1A8EE3C10AE9923F618980772E473F8819A5D4940E0DB27AC185F8A0E1D5F84F88BC887FD67B143732C304CC5FA9AD8E6F57F50028A8FF
go to post Vitaliy Serdtsev · Feb 10, 2016 In my opinion better will be so: Property SystemTime As %TimeStamp [ InitialExpression = {$ZDATETIME($NOW(),3,1,0)}, ReadOnly ]; This variant will work and for SQL and for Objects. In addition the developer will not be able to explicitly set a different value.
go to post Vitaliy Serdtsev · Jan 26, 2016 For clarity in code you can write: #include %systemInclude set varName = $$$NO ; 0 set varName = $$$YES ; 1 See ObjectScript Macros and the Macro Preprocessor