#Include vhLib.Class #include vhLib.Macro ConstructClone(oRef,NewClass,ConstructMethod,lbSkip) new arrFrom , arrTo , arrHULP set NewClass = $get(NewClass) set:'$Length(NewClass) NewClass = oRef.%ClassName(1) do arrProperties^vhLib.Class(oRef.%ClassName(1),.arrFrom,"A","A","A") do arrProperties^vhLib.Class(NewClass,.arrTo,"A","A","A") new Property set Property = "" for set Property = $order(arrFrom(Property)) quit:Property="" do . if arrFrom(Property)'=$get(arrTo(Property)) Kill arrFrom(Property) for set Property = $order(arrTo(Property)) quit:Property="" do . if arrTo(Property)'=$get(arrFrom(Property)) Kill arrFrom(Property) new i set lbSkip=$get(lbSkip) for i = 1 :1 : $listlength(lbSkip) { set Property = $listget(lbSkip,i) kill:$length(Property) arrFrom(Property) } new oRefClone set oRefClone = $zobjClassMethod(NewClass,$get(ConstructMethod,"%New")) Do CopyProperties(oRef,oRefClone,.arrFrom) quit oRefClone ; ;---------------------------------------------------------------------------------------------------- arrProperties(ClassName,arrProperties,flagRequired,flagCalculated,flagEmbeddedOnly) set flagRequired = $get(flagRequired , "A") set flagCalculated = $get(flagCalculated , "A" ) set flagEmbeddedOnly = $get(flagEmbeddedOnly, 0 ) kill arrHULP($job) kill arrProperties do BuildarrProperties(ClassName,.arrProperties,flagRequired,flagCalculated,flagEmbeddedOnly) quit // returns arr(Property) = $listbuild( items ) .. volgorde van items kan je vinden in vhLib.Class.inc ; ps : vraag mij niede wat er hier allemaal gebeurd , snap het ondertussen zelf al niet meer maar blijkbaar werkt het toch BuildarrProperties(ClassName,arrProperties,flagRequired,flagCalculated,flagEmbeddedOnly) new IdxProperty set IdxProperty = "" new objCompiledClass , Counter new PropertyName , PropertyType , flagCanSave , flagDeeperLevel set flagRequired = $get(flagRequired , "A") set flagCalculated = $get(flagCalculated , "A" ) //set flagEmbeddedOnly = $get(flagEmbeddedOnly, 0 ) set arrHULP($job,"ClassName") = $get(arrHULP($job,"ClassName")) set objCompiledClass = ##class(%Library.CompiledClass).%OpenId(ClassName) if $length(objCompiledClass) { for Counter = 1 : 1 : objCompiledClass.Properties.Count() { set flagCanSave = 1 set PropertyName = objCompiledClass.Properties.GetAt(Counter).Name set PropertyType = $$Type(ClassName,PropertyName) if flagRequired '= "A" set flagCanSave = ( flagRequired = $$IsRequired(ClassName,PropertyName)) if flagCanSave set flagCanSave = $extract(PropertyName)'="%" if flagCanSave { if PropertyType [ "Library" { if flagCalculated '= "A" set flagCanSave = ( flagCalculated = $$IsCalculated(ClassName,PropertyName)) set PropertyName = $select($length(arrHULP($job,"ClassName")):arrHULP($job,"ClassName")_".",1:"")_PropertyName if flagCanSave set arrProperties(PropertyName) = $$BuildarrPropertiesListBuild(ClassName,PropertyName) } else { set flagDeeperLevel = ( $$IsEmbedded(PropertyType) && '$length($$Collection(ClassName,PropertyName))) if 'flagDeeperLevel set arrProperties(PropertyName) = $$BuildarrPropertiesListBuild(ClassName,PropertyName) if flagDeeperLevel,'$$IsSwizzled(ClassName,PropertyName) { set arrHULP($job,"ClassName") = $select($length(arrHULP($job,"ClassName")):arrHULP($job,"ClassName")_".",1:"") _ PropertyName do BuildarrProperties(PropertyType,.arrProperties,flagRequired,flagCalculated) } } } } } set arrHULP($job,"ClassName") = $piece(arrHULP($job,"ClassName"),".",1,$length(arrHULP($job,"ClassName"),".")-1) quit ;---------------------------------------------------------------------------------------------------- BuildarrPropertiesListBuild(ClassName,Property) new result set result = "" set:Property["." Property = $piece(Property,".",$length(Property,".")) new Type set Type = $$Type(ClassName,Property) set $list(result,$$$fldClassName) = Type set $list(result,$$$fldIsPersistent) = $$IsPersistent(Type) set $list(result,$$$fldCollection) = $$Collection(ClassName,Property) quit result ;---------------------------------------------------------------------------------------------------- Type(CacheObject,PropertyName) new result set result = $$ParameterValue(CacheObject,PropertyName,"Type",1) quit result ;---------------------------------------------------------------------------------------------------- IsRequired(CacheObject,PropertyName) quit $$ParameterValue(CacheObject,PropertyName,"Required",1) ;---------------------------------------------------------------------------------------------------- IsCalculated(ClassName,Property) quit $$ParameterValue(ClassName,Property,"Calculated",0) ;---------------------------------------------------------------------------------------------------- Collection(ClassName,Property) quit $$ParameterValue(ClassName,Property,"Collection",0) ;---------------------------------------------------------------------------------------------------- IsMultiDimensional(ClassName,Property) quit $$ParameterValue(ClassName,Property,"MultiDimensional",0) ;---------------------------------------------------------------------------------------------------- IsTransient(ClassName,Property) quit +$$ParameterValue(ClassName,Property,"Transient",1) ;---------------------------------------------------------------------------------------------------- Collation(CacheObject,PropertyName) quit $$ParameterValue(CacheObject,PropertyName,"COLLATION",0) ;---------------------------------------------------------------------------------------------------- IsSwizzled(CacheObject,PropertyName) new result set result = 0 new PropertyClass set PropertyClass = $$Type(CacheObject,PropertyName) if PropertyClass '[ "Library" && $length(PropertyClass) && $$IsPersistent(PropertyClass) set result = 1 quit result ;---------------------------------------------------------------------------------------------------- IsPersistent(ClassName) quit ##class(%Library.CompiledClass).%OpenId(ClassName).Persistent ;---------------------------------------------------------------------------------------------------- IsEmbedded(ClassName) quit ##class(%Library.CompiledClass).%OpenId(ClassName).Serial ;---------------------------------------------------------------------------------------------------- MaxLength(CacheObject,PropertyName) new result set result = $$ParameterValue(CacheObject,PropertyName,"MAXLEN",1,0) quit result ;---------------------------------------------------------------------------------------------------- ParameterValue(ClassName,Property,Parameter,flagFirstOccuredPositif) new arrEmbeddedProperties , oRef, IdxEmbeddedProperty set IdxEmbeddedProperty = "" new result , QuitFlag set QuitFlag = 0, result = "" set flagFirstOccuredPositif = $get(flagFirstOccuredPositif,0) do arrEmbeddedProperties(ClassName,Property,.arrEmbeddedProperties) for set IdxEmbeddedProperty = $order(arrEmbeddedProperties(IdxEmbeddedProperty)) quit:IdxEmbeddedProperty="" quit:QuitFlag do . set ClassName = $piece(arrEmbeddedProperties(IdxEmbeddedProperty),"#",1) . set Property = $piece(arrEmbeddedProperties(IdxEmbeddedProperty),"#",2) . set oRef = ##class(%Library.CompiledProperty).%OpenId(ClassName_"."_Property) . set result = $zobjProperty(oRef,Parameter) . if flagFirstOccuredPositif, result = 1 set QuitFlag = 1 . set oRef = "" quit result ;---------------------------------------------------------------------------------------------------- arrEmbeddedProperties(ClassName,Property,arrEmbeddedProperties) do BuildarrEmbeddedProperties(ClassName,Property,.arrEmbeddedProperties) quit BuildarrEmbeddedProperties(ClassName,Property,arrEmbeddedProperties) new QuitFlag set QuitFlag = 0 new Counter set Counter = 1 new objClass while 'QuitFlag { if ##class(%Library.CompiledProperty).%ExistsId(ClassName_"."_$piece(Property,".",Counter)) { set objClass = ##class(%Library.CompiledProperty).%OpenId(ClassName_"."_$piece(Property,".",Counter)) do add2arrEmbeddedProperties(ClassName,$piece(Property,".",Counter),.arrEmbeddedProperties) if objClass.Type [ "Library" { set QuitFlag = 1 } else { set ClassName = objClass.Type set Counter = Counter + 1 if $piece(Property,".",Counter)="" set QuitFlag = 1 if $length(Property,".") = 1 set QuitFlag = 1 } } else { set QuitFlag = 1 } } quit ;---------------------------------------------------------------------------------------------------- add2arrEmbeddedProperties(ClassName,Property,arrEmbeddedProperties) new ItemIndex set ItemIndex = $order(arrEmbeddedProperties(""),-1) + 1 set arrEmbeddedProperties(ItemIndex) = ClassName _ "#" _ Property quit ;---------------------------------------------------------------------------------------------------- CopyProperties(oRefFrom,oRefTo,arrProperties) new IdxProperty set Property = "" for set Property = $order(arrProperties(Property)) quit:Property="" do . quit:$length($listget(arrProperties(Property),$$$fldCollection)) // voorlopig stoppen indien het gaat over een list of nen array . do SetValueInMem(oRefTo,Property,$$ValueInMem(oRefFrom,Property)) quit ;---------------------------------------------------------------------------------------------------- SetValueInMem(oRef,Property,Value) if $length(oRef) { if $$IsSwizzled(oRef.%ClassName(1),Property) { do $zobjMethod(oRef,Property_"SetObjectId",Value) } else { xecute "set oRef."_Property_" = Value" } } quit ; ------------------------------------------------------------------------------------------------ ValueInMem(oRef,Property) new result set result = "" if $$IsSwizzled(oRef.%ClassName(1),Property) { set result = $zobjMethod(oRef,Property_"GetObjectId") } else { if $length(Property,".") > 0 { xecute "set result = oRef."_Property } else { set result = $zobjProperty(oRef,Property) } } quit result arrDerivedClasses(ClassName,arrClasses) new itClasses , Class set itClasses = $$itDerivedClasses(ClassName) while itClasses.HasNext() { set Class = itClasses.Next() set arrClasses(Class)=Class } quit itDerivedClasses(ClassName) new qHandler , List set List = ##class(%ListOfDataTypes).%New() set qHandler = ##class(%ResultSet).%New("%Dictionary.ClassDefinitionQuery:SubclassOf") do qHandler.Execute(ClassName) while qHandler.Next() { do List.Insert(qHandler.GetData(1)) } quit ##class(TECH.ListIterator).%New(List)