cABVBP3 ; functies aanmaken klassen vanuit ^DDP ; cABVBP3 ; Compiled December 8, 2011 12:06:16 ; T1 ;Doorgegeven sleutel is leeg;Q-waarde niet juist : ; T2 ;Geen data voor doorgegeven sleutel : ; T3 ;Definitie DMA niet in orde voor : ; T4 ;persistent#%Library.Persistent; T5 ;Fout bij ophalen omschrijvingen parameters van ; T6 ;Fout bij opslaan van ; T7 ;Fout bij het verwijderen van ; T8 ;Fout bij openen van ; T9 ;U heeft geen licentie voor dit bestand : ; T10 ;DMS niet ingevuld in ; T11 ;Groep is leeg of bestaat niet.; T12 ;Fout bij compilatie klasse ; ; YZ Q ; BUILD(Q,UI1C,COMP,TAAL) ; aanmaken van een classe ; UI1C = UI1 van DDP ; TAAL = indien ingevuld worden de klassen voor de talen aangemaakt ; 2 delen in parameter (gescheiden door ;) ; 1. 1 = enkel taal ; 0 = zowel taal als interne opbouwen ; 2. NFDE ; of ; 1 = Alle talen ; COMP = 1 : compileren S $ZT="TRAP^cAN000" N @$$INITVAR^cAFVBA01("UI1C,COMP,TAAL") S QT="" D QT^cAFVBO01 I '$L($G(UI1C)) S OK="0\"_$P($T(@("T1"_QT)),U,2) G BUILDZ I Q'?1.U S OK="0\"_$P($T(@("T1"_QT)),U,3)_Q G BUILDZ S DMSC="DP" S SW3=$$SW3^cABVBP2(DMSC) I 'SW3 S OK="0\"_$P($T(@("T3"_QT)),U,2)_DMSC G BUILDZ S B(1)=$$SIGN^cAFA1(DMSC,UI1C,0) I '$L(B(1)) S OK="0\"_$P($T(@("T2"_QT)),U,2)_DMSC_" : "_UI1C G BUILDZ F i=2:1:SW3 S B(i)=$G(^(i-1)) S $P(B(1),D,6)=$$SUPER(.B) ; bepalen superklassen M oB=B BUILDA ; interne klasse s NAAM=$$SIG^cAFA1("CODE.9022",$P(B(1),D,3),101) I '$L(NAAM) S OK="0\"_$P($T(@("T11"_QT)),U,2) G BUILDZ S NAAM=NAAM_$S($L(NAAM):".",1:"")_$P(B(1),D) ; Groep + Interne naam S OK=1 I '$G(TAAL) S OK=$$CLASS(UI1C,NAAM,.B) S TAAL=$P($G(TAAL),U,2) ; BUILB ; taalafhankelijke gebruikersklasse I '$L($G(TAAL)) G BUILDZ I TAAL=1 S TAAL="",i="" F S i=$O(^DTEXT(0,"TEXT.9000",i)) Q:i="" i '$P(^(i,0),D,30) S TAAL=TAAL_i BUILDC S TAALC=$E(TAAL),TAAL=$E(TAAL,2,99) I '$L(TAALC) G BUILDZ S BT=$$SIGN^cAFA1(DMSC_".TAAL",UI1C_" "_TAALC,0) I '$L(BT) G BUILDC S NAAM=$P(BT,D,4) I '$L(NAAM) G BUILDC I '$L($P(BT,D,3)) G BUILDC ; geen groep S NAAM=$P(BT,D,3)_"."_NAAM K B M B=oB S $P(B(1),D,2)=$P(BT,D,5) ; omschrijving S $P(B(1),D,4)=$P(BT,D,6) ; SQL-tabel S $P(B(1),D,6)=$$REPL^cAFA10($P(B(1),D,6),"DAMLib.Templ02E","DAMLib.Templ02"_$S(TAALC'="N":TAALC,1:"")) ; superklasse BUILDD S OK=$$CLASS(UI1C,NAAM,.B,TAALC) I 'OK G BUILDZ G BUILDC BUILDZ Q OK ; CLASS(UI1C,NAAM,B,TAALC) ; aanmaken klasse S XLOGD="S {LoggingData}=$$LOGDATA^cAFVBO01("""_Q_""",""~dmDMS~"",{~dmUI1~})" I $L($G(TAALC)) S i=$$GRANTREV^dmSEC(NAAM,1,"s","ReadOnly",1) CLASSA S OK=$$DEL(NAAM) I 'OK G CLASSZ ; eerst klasse verwijderen S cl=##class(%Dictionary.ClassDefinition).%New(NAAM) I 'cl S OK="0\"_$P($T(@("T8"_QT)),U,2)_"ClassDefinition : "_NAAM G CLASSZ S cl.Name=NAAM ; naam klasse S cl.ClassType=$P($P($T(@("T4"_QT)),U,2+$P(B(1),D,7)),"#") ; type S cl.Super=$P(B(1),D,6) ; superklassen S cl.Description=$P(B(1),D,2) ; Interne commentaar I $L($P(B(1),D,4)) S cl.SqlTableName=$P(B(1),D,4) ; SQLTabel naam S cl.ProcedureBlock=0 ; Parameters I $L($G(TAALC)) S OK=$$TPROP(UI1C,.TAALC) ; opzetten link tss interne en externe naam S OK=$$PAR(.cl,B(2),UI1C,.XLOGD,.TAALC) I 'OK G CLASSY S OK=$$PROP(.cl,UI1C,.STOR,.XLOGD,.TAALC) I 'OK G CLASSY I '$L($G(TAALC)) S OK=$$METH(.cl,UI1C,$G(STOR("Q49"))&$P(B(2),D,9)) I 'OK G CLASSY S OK=$$IND(.cl,UI1C,.TAALC) I 'OK G CLASSY S OK=$$DATA(Q,UI1C,.B,.STOR) I 'OK G CLASSY S OK=$$STOR(.cl,UI1C,.STOR) I 'OK G CLASSY S sc=cl.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_"ClassDefinition : "_NAAM) G CLASSY CLASSY D CLOSE(.cl) I $G(COMP) S cc=$System.OBJ.Compile(NAAM,"fck") I 'cc S OK=$$ERR(cc,$P($T(@("T12"_QT)),U,2)_NAAM) G CLASSZ I $L($G(TAALC)) S i=$$GRANTREV^dmSEC(NAAM,0,"s","ReadOnly",1) CLASSZ Q OK ; DATA(Q,UI1C,class,STOR) ; ophalen definities van data uit ^DMC ; UI1C = UI1 van de klasse ; class = naam van de klasse ; STOR = tabel met reeds gegevens in voor de opslag : doorgegeven als referentie : .STOR S $ZT="TRAP^cAN000" N OK,DMS,UQC,USC,UI1,UREF,IREF,TYPE,I1,BIN,N,I2,T S OK=1 S DMS=$$SIG^cAFA1("DP",UI1C,201) I '$L(DMS) S OK="0\"_$P($T(@("T10"_QT)),U,2)_$g(class) G DATAZ DATAA D DMS^cAN000("UQC","USC",DMS,1) I '$L(UQC)!'$L(USC) S OK="0\"_$P($T(@("T9"_QT)),U,2)_DMS G DATAZ S UREF=^DMC(UQC,USC,"DATA","REF"),IREF=$G(^("INDEX2")),TYPE=^DMC(UQC,USC,"DATA") S STOR("D",1,"N")="Data" I UREF["GRIDID" S GRIDID=1 S UI1="" I UREF["DLOGREF" S UREF="^DLOG" S UREF=$NA(@UREF) I $L(IREF) S IREF=$NA(@IREF) I $E(UREF,2)="|" S UREF="^"_$P(UREF,"|",3,99) I $E(IREF,2)="|" S IREF="^"_$P(IREF,"|",3,99) I TYPE<4 D ; ^_Q_KL(UI1) . S STOR("D",1,"G")=$P(UREF,"(") . I $D(STOR("D",1,"S",1)) S $P(STOR("D",1,"S",1),D,10)="0.1" ; instellen startvalue I TYPE=4 D ; ^DATA(Q,"KL",UI1) . I '$D(STOR("D",1,"S",1)) D .. S STOR("D",1,"S",1)=""""_Q_""""_D_0_D_D_1 ; geen subscript 1 te vinden .. I $TR($P($P(UREF,"(",2),","),"""","")'="Q" S STOR("D",1,"S",1)=$P($P(UREF,"(",2),",")_D_0_D_D_1 . I '$D(STOR("D",1,"S",2)) S STOR("D",1,"S",2)=$P(UREF,",",2) . S STOR("D",1,"G")=$P(UREF,"(") I TYPE=5 D ; ^_Q_BA("%F",x,UI1 . S STOR("D",1,"G")=$P(UREF,"(") . F i=1:1 S S=$TR($P(UREF,",",i),"()") Q:S=UI1!'$L(S) S:'$D(STOR("D",1,"S",i)) STOR("D",1,"S",i)=S_D_0_D_D_1 ; ; indexen en multiples DATAB I '$L(IREF) G DATAZ I '$D(STOR("D",1,"S",1)) S STOR("I",1)=""""_Q_"""" ; geen subscript 1 te vinden ; indexen S I1="" F S I1=$O(^DMC(UQC,USC,"INDEX2",I1)) Q:I1="" D . S BIN=$P(^(I1),D) . I '$D(STOR("D",1,"B",BIN)) Q ; bestaat niet als propertie . ; enkel indien String, Datum (dd.mm.jj), J\N, Referentie, Integer , numerieke tekst, Numeriek (Data-M), Maand . I "\0\2\4\5\6\10\11\12\"'[(D_$P(STOR("D",1,"B",BIN),D,2)_D) Q . S STOR("I",I1,"N")="I"_$P(STOR("D",1,"B",BIN),D) . S STOR("I",I1,"G")=$P(IREF,"(") . I TYPE<4!(TYPE=5) S STOR("I",I1,"S",1)=""""_Q_""""_D_D_D_1 ; vast Q . I TYPE=4 S STOR("I",I1,"S",1)=STOR("D",1,"S",1) ; index 1, idem als index 1 . S STOR("I",I1,"S",2)=$P($P(IREF,",",2),")") . S STOR("I",I1,"S",3)=BIN . S STOR("I",I1,"S",4)=STOR("D",1,"B",BIN) . S STOR("I",I1,"S",5)=STOR("D",1,"S",TYPE=4*2+1) ; multiples DATAC S I1="" F S I1=$O(^DMC(UQC,USC,"MULTI2",I1)) Q:I1="" D . S I2="",OK=1 . S N="",T=3 . F S I2=$O(^DMC(UQC,USC,"MULTI2",I1,I2)) Q:I2="" D I 'OK Q .. S BIN=$P(^(I2),D) .. I '$D(STOR("D",1,"B",BIN)) S OK=0 Q ; bestaat niet als propertie .. ; enkel indien String, Datum (dd.mm.jj), J\N, Referentie, Integer , numerieke tekst, Numeriek (Data-M), Maand .. I "\0\2\4\5\6\10\11\12\"'[(D_$P(STOR("D",1,"B",BIN),D,2)_D) Q .. S N=N_$S('$L(N):"M",1:"")_$P(STOR("D",1,"B",BIN),D) .. S T=T+1 .. S STOR("I",I1,"S",T)=STOR("D",1,"B",BIN) . I 'OK K STOR("I",I1) Q . I '$L(N) Q . S STOR("I",I1,"N")=N . S STOR("I",I1,"G")=$P(IREF,"(") . I TYPE<4!(TYPE=5) S STOR("I",I1,"S",1)=""""_Q_"""" ; vast Q . I TYPE=4 S STOR("I",I1,"S",1)=STOR("D",1,"S",1) ; index 1, idem als index 1 . S STOR("I",I1,"S",2)=$P($P(IREF,",",2),")") . S STOR("I",I1,"S",3)=""""_I1_"""" . S STOR("I",I1,"S",T+1)=STOR("D",1,"S",TYPE=4*2+1) S OK=1 DATAZ Q OK ; DATATN(class) ; adhv klasse datatype vinden N i,R S R=0 S i="" F S i=$O(^VBN(0,"GRID.DATATYPE",i)) Q:i="" I $P(^(i,0),D,5)=class S R=$P(^(0),D) Q DATATNZ Q R ; DATATK(UI1D,UI1C,TAALC) ; ophalen klasse van een datatype ; UI1D : UI1 van datatype ; UI1C : UI1 van klasse ; TAALC : Taalkode N,F... N R ; indien referentie naar andere klasse I $L($G(UI1C)) D G DATATKZ . ; taalafhankelijk . I $L($G(TAALC)) S R=$$SIG^cAFA1("DP.TAAL",UI1C_" "_TAALC,104) I $L(R),$L($P(^(0),D,3)) S R=$P(^(0),D,3)_"."_R Q . ; intern . S R=$$SIG^cAFA1("DP",UI1C,101) I $L(R) S R=$$SIG^cAFA1("CODE.9022",$P(^(0),D,3),101)_"."_R I $L($G(TAALC)) S R=$$SIG^cAFA1("CODE.9020",UI1D,107) ; Taalafhankelijke klasse (GM - 28.06.07) I '$L($G(TAALC))!'$L($G(R)) S R=$$SIG^cAFA1("CODE.9020",UI1D,105) I '$L(R) S R="%Library.String" DATATKZ Q R ; DEL(CLASS) ; verwijderen van classe ; CLASS : Groep + klasnaam S $zt="TRAP^cAN000" N OK,sc,err S OK=1 S sc=##class(%Dictionary.ClassDefinition).%DeleteId(CLASS) I sc G DELZ D $system.Status.DecomposeStatus(sc,.err) I err(1,"code")=5810 G DELZ S OK=$$ERR(sc,$P($T(@("T7"_QT)),U,2)_"ClassDefinition : "_CLASS) DELZ Q OK ; IND(cl,UI1C,TAALC) ; opzetten indexen ; cl = classinstantie : doorgeven als referntie : .cl ; UI1C = interne nr van de klasse uit ^DDP S $ZT="TRAP^cAN000" N DMSCI,UQC,USC,UREF,IREF,SW3,I1,OK,B,i,UI1,REF,class,ind,pdef,sc,prop,propa,err S DMSCI="DP.IND" D DMS^cAN000("UQC","USC",DMSCI,1) I '$L(UQC)!'$L(USC) S OK="0\"_$P($T(@("T9"_QT)),U,2)_DMSCI G INDZ S IREF=^DMC(UQC,USC,"DATA","INDEX"),UREF=^("REF") S SW3=$$SW3^cABVBP2(DMSCI) I 'SW3 S OK="0\"_$P($T(@("T3"_QT)),U,2)_DMSCI G INDZ S class=cl.Name S I1=UI1C_" ",OK=1 INDA S I1=$O(@IREF@(101,I1)) G INDZ:$E(I1,1,$L(UI1C)+1)'=(UI1C_" ") S UI1=$P(^(I1),D) S B(1)=@UREF@(0) F i=2:1:SW3 S B(i)=$G(^(i-1)) I $P(B(1),D,30) G INDA ; BG of verwijderd S ind=$P(B(1),D,3) ; interne naam propertie S err=" IndexDefinition : "_class_"."_ind INDB S pdef=##class(%Dictionary.IndexDefinition).%New($p(class,".",$l(class,"."))_"."_ind) I 'pdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G INDZ D cl.Indices.Insert(pdef) S pdef.Name=ind ; interne naam S pdef.Description=$P(B(1),D,4) ; interne commentaar S (pdef.IdKey,pdef.PrimaryKey)=+$P(B(1),D,5) ; IsKey S pdef.Unique=+$P(B(1),D,6) ; uniek INDC S propa="" F i=1:1:10 q:'$l($p(B(2),D,i)) D . S prop=$$SIG^cAFA1("DP.PROP",$P(B(2),D,i),103) . I $L($G(TAALC(prop))) S prop=TAALC(prop) ; indien via taal : interne naam omvormen . I $L($P(B(3),D,i)) s prop=prop_U_$P(B(3),D,i) . s propa=propa_$s($l(propa):",",1:"")_prop S pdef.Properties=propa S sc=pdef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.pdef) G INDZ D CLOSE(.pdef) G INDA INDZ Q OK ; METH(cl,UI1C,SWQ49) ; opzetten methodes ; cl = classinstantie : doorgeven als referntie : .cl ; UI1C = interne nr van de klasse uit ^DDP ; SWQ49 = 1 (indien prop. Q49 bestaat en parameter dmQ49=1 is) S $ZT="TRAP^cAN000" N DMSCM,UQC,USC,UREF,IREF,SW3,I1,OK,B,i,UI1,REF,class,meth,mdef,sc,err,fs,line,impl,impls S DMSCM="DP.METH" D DMS^cAN000("UQC","USC",DMSCM,1) I '$L(UQC)!'$L(USC) S OK="0\"_$P($T(@("T9"_QT)),U,2)_DMSCI G METHZ S IREF=^DMC(UQC,USC,"DATA","INDEX"),UREF=^("REF") S SW3=$$SW3^cABVBP2(DMSCM) I 'SW3 S OK="0\"_$P($T(@("T3"_QT)),U,2)_DMSCM G METHZ S class=cl.Name S I1=UI1C_" ",OK=1 METHA S I1=$O(@IREF@(101,I1)) G METHZ:$E(I1,1,$L(UI1C)+1)'=(UI1C_" ") S UI1=$P(^(I1),D) S B(1)=@UREF@(0) F i=2:1:SW3 S B(i)=$G(^(i-1)) I $P(B(1),D,30) G METHA ; BG of verwijderd S meth=$P(B(1),D,3) ; interne naam methode S err=" MethodDefinition : "_class_"."_meth METHB S mdef=##class(%Dictionary.MethodDefinition).%New($p(class,".",$l(class,"."))_"."_meth) I 'mdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G METHZ D cl.Methods.Insert(mdef) S mdef.Name=meth ; interne naam S mdef.Description=$P(B(1),D,4) ; interne commentaar ; S mdef.CodeMode="Code" ; steeds code I $P(B(1),D,7) S mdef.CodeMode="Objectgenerator" ; generator S mdef.ClassMethod=+$P(B(1),D,6) ; Klassemethode S fs="" ; opbouwen formalspecs F i=1:1 Q:'$L($P(B(2),D,i)) D . s fs=fs_$S($L(fs):",",1:"")_$P(B(2),D,i)_":"_$$DATATK($P(B(3),D,i),"") S mdef.FormalSpec=fs S mdef.ReturnType=$$DATATK($P(B(1),D,5),"") ; datatype S impl=$P(B(4),D) ; indien geen klassemethode en geen generator en DAMLib.Templ* behoort tot de superklassen ... I '$P(B(1),D,6),'$P(B(1),D,7),cl.Super["DAMLib.Templ" D . s impls=$c(9)_"S Q=..Q,QT=..QT,QU=..QU" . I $G(SWQ49) S impls=impls_",Q(49)=..Q49" . I '$G(SWQ49) s impls=impls_" K Q(49)" . S impl=impls_$C(13,10)_impl F i=1:1:$l(impl,$C(13,10)) D . S line=$p(impl,$C(13,10),i) . I $e(line)'=$C(9) s line=$C(9)_line . D mdef.Implementation.WriteLine(line) D mdef.Implementation.SaveStream() S sc=mdef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.mdef) G METHZ D CLOSE(.mdef) G METHA METHZ Q OK ; PAR(cl,PAR,UI1C,XLOGD,TAALC) ; opzetten parameters ; cl = classinstantie : doorgeven als referntie : .cl ; PAR = string met waardes van parameters (B(2) uit klasse) ; UI1C = UI1 van de klasse ; XLOGD = xexute voor LoggingData in de vorm S {LoggingData}=$$LOGDATA^cAFVBO01(Q,"~dmDMS~","~dmUI1~") ; S $ZT="TRAP^cAN000" N OK,ERF,i,class,paro,pdef,sc,err,OMS I '$L($G(PAR)) S PAR=$$SIGN^cAFA1("DP",UI1C,1) I '$L(PAR) G PARZ S OK=$$PARTAB(cl.Super,0,.ERF) I 'OK G PARZ S OK=$$FRFLD^cAFVBF01("","DAM","DC") ; ophalen omschrijving van de parameters I 'OK S OK="0\"_$P($T(@("T5"_QT)),U,2)_class G PARZ S i="" F S i=$o(^mtemp99($p(OK,D),"COMMON",i)) Q:i="" S OMS=$P(^(i,0),D) I $L(OMS) S PAR(OMS)=$P(PAR,D,$P(^(0),D,4)#100) I '$L($O(PAR(""))) G PARZ s class=cl.Name S paro="",OK=1 PARA S paro=$o(PAR(paro)) I paro="" G PARZ I '$d(ERF(paro)) G PARAB I ERF(paro)=PAR(paro) G PARA S err=" ParameterDefinition : "_class_"."_paro PARAB s pdef=##class(%Dictionary.ParameterDefinition).%New($p(class,".",$l(class,"."))_"."_paro) I 'pdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G PARZ Do cl.Parameters.Insert(pdef) s pdef.Name=paro s pdef.Default=PAR(paro) I $L(PAR(paro)),$L($G(TAALC)),paro="dmUI1",$D(TAALC(PAR(paro))) S pdef.Default=TAALC(PAR(paro)) s sc=pdef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.pdef) G PARZ D CLOSE(.pdef) F Q:$G(XLOGD)'[("~"_paro_"~") S XLOGD=$P(XLOGD,"~"_paro_"~")_PAR(paro)_$P(XLOGD,"~"_paro_"~",2,99) G PARA PARZ Q OK ; PARTAB(KLASSEN,TYPE,ERF) ; samenstellen tabel met overgeërfde parameters/properties ; KLassen : bevat alle klassen waarvan men overerft : %Persistent,DAMLib.Templ02E... ; TYPE : 0 = parameters, 1 = properties ; ERF : in deze tabel komen de parameters te zitten, moet doorgegeven worden als reference ; ERF(parameter)=default waarde ; ; ERF(propertynaam) ; 1. Omschrijving ; 2. B-index ; 3. Type ; 4. SQLnaam ; 5. Calculated = 1 ; 6. Transient = 1 ; 7. SqlComputed = 1 ; 8. Private = 1 S $ZT="TRAP^cAN000" N OK,class,pdef,count,i,desc K ERF S OK=1 PARTABA S class=$p(KLASSEN,","),KLASSEN=$P(KLASSEN,",",2,99) I '$L(class) G PARTABZ S pdef=##class(%Dictionary.CompiledClass).%OpenId(class,0) I 'pdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_class G PARTABZ ; parameters I '$G(TYPE) D . S count=pdef.Parameters.Count() . F i=1:1:count s ERF(pdef.Parameters.GetAt(i).Name)=pdef.Parameters.GetAt(i).Default ; properties I $G(TYPE) D . S count=pdef.Properties.Count() . F i=1:1:count D .. s (desc,ERF(pdef.Properties.GetAt(i).Name))=pdef.Properties.GetAt(i).Description .. F S desc=$P(desc,"" S $P(ERF(pdef.Properties.GetAt(i).Name),D,2)=$e(desc,1,3) Q .. s $P(ERF(pdef.Properties.GetAt(i).Name),D,3)=pdef.Properties.GetAt(i).Type .. s $P(ERF(pdef.Properties.GetAt(i).Name),D,4)=pdef.Properties.GetAt(i).SqlFieldName .. s $P(ERF(pdef.Properties.GetAt(i).Name),D,5)=pdef.Properties.GetAt(i).Calculated .. s $P(ERF(pdef.Properties.GetAt(i).Name),D,6)=pdef.Properties.GetAt(i).Transient .. s $P(ERF(pdef.Properties.GetAt(i).Name),D,7)=pdef.Properties.GetAt(i).SqlComputed .. s $P(ERF(pdef.Properties.GetAt(i).Name),D,8)=pdef.Properties.GetAt(i).Private D CLOSE(.pdef) G PARTABA PARTABZ Q OK ; PROP(cl,UI1C,STOR,XLOGD,TAALC) ; opzetten properties ; cl = classinstantie : doorgeven als referntie : .cl ; UI1C = interne nr van de klasse uit ^DDP ; STOR = in deze tabel wordt de data opgeslagen voor de storage : doorgeven als referentie ; XLOGD = code voor SQLComputeCode voor LoggingData ; TAALC = taalkode N,F,... S $ZT="TRAP^cAN000" N DMSCP,UQC,USC,UREF,IREF,SW3,I1,OK,B,i,UI1,REF,class,prop,SWLOGD,BT S DMSCP="DP.PROP" K STOR D DMS^cAN000("UQC","USC",DMSCP,1) I '$L(UQC)!'$L(USC) S OK="0\"_$P($T(@("T9"_QT)),U,2)_DMSCP G PROPZ S IREF=^DMC(UQC,USC,"DATA","INDEX"),UREF=^("REF") S SW3=$$SW3^cABVBP2(DMSCP) I 'SW3 S OK="0\"_$P($T(@("T3"_QT)),U,2)_DMSCP G PROPZ S class=cl.Name S I1=UI1C_" ",OK=1,SWLOGD=0 PROPA S I1=$O(@IREF@(101,I1)) G PROPE:$E(I1,1,$L(UI1C)+1)'=(UI1C_" ") S UI1=$P(^(I1),D) S B(1)=@UREF@(0) F i=2:1:SW3 S B(i)=$G(^(i-1)) I '$L($P(B(1),D,3)) G PROPA ; geen interne naam I $P(B(1),D,30)=2 G PROPA ; Verwijderd. Buiten gebruik wel meenemen in interne klasse - GM 04.05.07 ;I $P(B(1),D,30) G PROPA ; BG of verwijderd I $P(B(1),D,13) G PROPA ; zoeksleutel I $L($P(B(1),D,3),"#")>1 G PROPA ; samengestelde naam I '$L($G(TAALC)) G PROPC PROPB ; taalafhankelijk I $P(B(2),D,9)=3 G PROPA ; skip taalafhankelijk I $P(B(1),D,30) G PROPA ; BG of verwijderd niet meenemen in taalafhankelijke klasse - GM 04.05.07 S BT=$$SIGN^cAFA1(DMSCP_".TAAL",UI1_" "_TAALC,1) I '$L(BT) G PROPC ; indien geen taalafhank. de interne opzetten I '$L($P(BT,D)) G PROPC S $P(B(1),D,3)=$P(BT,D) ; naam S $P(B(1),D,4)=$P(BT,D,2) ; commentaar PROPC S prop=$P(B(1),D,3) ; naam propertie I prop="LoggingData" S SWLOGD=1 ; property LoggingData bestaat I '$L(prop) G PROPA ; geen naam ingevuld PROPD S OK=$$SPROP(.cl,prop,.B,.STOR,.TAALC) I 'OK G PROPZ G PROPA ; aanvullen tabel met overgeërfde properties PROPE S OK=$$PARTAB(cl.Super,1,.REF) I 'OK G PROPZ S i="" F s i=$o(REF(i)) q:i="" D . I i="Q49" S STOR("Q49")=1 ; bestaat prop. Q49 . I '$P(REF(i),D,2) Q ; geen B-index . I $D(STOR("D",1,"B",$P(REF(i),D,2))) Q ; bestaat in klasse zelf . I $p(REF(i),D,5) Q ; calculated . I $p(REF(i),D,6) Q ; transient . I $p(REF(i),D,7) Q ; SqlComputed . S prop=i I $L($P(REF(i),D,4)) S prop=$p(REF(i),D,4) ; SqlName . S STOR("D",1,"B",$P(REF(i),D,2))=prop_D_$$DATATN($P(REF(i),D,3))_D_2 ; opzetten property LoggingData PROPF I SWLOGD G PROPZ ; LoggingData bestaat in DDP en is reeds opgezet I '$D(REF("LoggingData")) G PROPZ ; geen LogginData bij overgeërfde properties K B S i="LoggingData" S B(1)="\\"_i_"\"_$P(REF(i),D) ; naam en interne commentaar S $P(B(1),D,6)=($P(REF(i),D,7)!$P(REF(i),D,5)) ; Berekend S B(3)=XLOGD ; SQLComputeCode S $P(B(1),D,9)=$P(REF(i),D,6) ; transient S $P(B(2),D,9)=$P(REF(i),D,8) ; private S OK=$$SPROP(.cl,i,.B,.STOR,.TAALC) PROPZ Q OK ; REPL(R,TAALC) S $ZT="TRAP^cAN000" N i,n S i="" F s i=$O(TAALC(i)) Q:i="" D . s n=TAALC(i) i i=n q . I '$F(R,"{"_i_"}") q . S R=$$REPL^cAFA10(R,"{"_i_"}","{"_n_"}") REPLZ Q R ; SPROP(cl,prop,B,STOR,TAALC) ; maak property aan S $ZT="TRAP^cAN000" N OK,err,pdef,DATATC,DATATN,REF,sc,class S OK=1,class=cl.Name S err=" PropertyDefinition : "_class_"."_prop SPROPB S pdef=##class(%Dictionary.PropertyDefinition).%New($p(class,".",$l(class,"."))_"."_prop) I 'pdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G SPROPZ D cl.Properties.Insert(pdef) S pdef.Name=prop ; interne naam S pdef.Description=$P(B(1),D,4) ; interne commentaar I '$L($G(TAALC)) S pdef.Calculated=+$P(B(1),D,6) ; berekend (enkel indien intern) S pdef.Transient=+$P(B(1),D,9) ; transient S (pdef.Calculated,pdef.SqlComputed)=+$P(B(1),D,6) I $L($P(B(3),D)) D . S $P(B(3),D)=$$REPL^cAFA10($P(B(3),D),"~Q~",Q) . I $L($G(TAALC)) S $P(B(3),D)=$$REPL($P(B(3),D),.TAALC) . S pdef.SqlComputeCode=$C(9)_$P(B(3),D) ; SqlComputcode ;GM 25.04.07 - Klasse-referentie uitblanken voor een subcript-property I $P(B(1),D,7) S $P(B(2),D,12)="" S DATATC=$$DATATK($P(B(2),D),$P(B(2),D,12),$G(TAALC)) S DATATN=$$SIG^cAFA1("CODE.9020",$P(B(2),D),101) K REF S OK=$$PARTAB(DATATC,0,.REF) I 'OK G SPROPZ SPROPC S pdef.Type=DATATC ; datatype ; S pdef.Required=+$P(B(2),D,2) ; verplicht S pdef.Private=$S($P(B(2),D,9)=2:''$L($G(TAALC)),$P(B(2),D,9)=3:0,1:+$P(B(2),D,9)) ; private I $P(B(2),D,3)>50,$D(REF("MAXLEN")) D . D pdef.Parameters.SetAt($P(B(2),D,3),"MAXLEN") ; maximum lengte . D pdef.Parameters.SetAt(0,"TRUNCATE") ; truncate afzetten I $D(REF("SCALE")),REF("SCALE")'=$P(B(2),D,4) D pdef.Parameters.SetAt($P(B(2),D,4),"SCALE") ; aantal decimalen S sc=pdef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.pdef) G SPROPZ D CLOSE(.pdef) ; opzetten tabel PROP om later te gebruiken voor de storage I $P(B(1),D,10) S STOR("D",1,"B",$P(B(1),D,10))=prop_D_DATATN_D_1 I $P(B(1),D,7) S STOR("D",1,"S",$P(B(1),D,7))=prop_D_DATATN_D_1_D_1 SPROPZ Q OK ; TPROP(UI1C,TAALC) ; opzetten link tss interne en exteren properties ; UI1C = interne nr van de klasse uit ^DDP S $ZT="TRAP^cAN000" N DMSCP,UQC,USC,UREF,IREF,SW3,I1,OK,B,UI1,BT S DMSCP="DP.PROP" D DMS^cAN000("UQC","USC",DMSCP,1) I '$L(UQC)!'$L(USC) S OK="0\"_$P($T(@("T9"_QT)),U,2)_DMSCP G TPROPZ S IREF=^DMC(UQC,USC,"DATA","INDEX"),UREF=^("REF") S SW3=$$SW3^cABVBP2(DMSCP) I 'SW3 S OK="0\"_$P($T(@("T3"_QT)),U,2)_DMSCP G TPROPZ S I1=UI1C_" ",OK=1 TPROPA S I1=$O(@IREF@(101,I1)) G TPROPZ:$E(I1,1,$L(UI1C)+1)'=(UI1C_" ") S UI1=$P(^(I1),D) S B(1)=@UREF@(0) F i=2:1:SW3 S B(i)=$G(^(i-1)) I '$L($P(B(1),D,3)) G TPROPA ; geen interne naam I $P(B(1),D,30) G TPROPA ; BG of verwijderd I $P(B(1),D,13) G TPROPA ; zoeksleutel I $L($P(B(1),D,3),"#")>1 G TPROPA ; samengestelde naam TPROPB ; taalafhankelijk S BT=$$SIGN^cAFA1(DMSCP_".TAAL",UI1_" "_TAALC,1) I '$L($P(BT,D)) G TPROPA S TAALC($P(B(1),D,3))=$P(BT,D) ; opbouw tabel met link tss interne naam en externe naam G TPROPA TPROPZ Q OK ; STOR(cl,UI1C,STOR) ; opzetten storage ; cl = classinstantie : doorgeven als referntie : .cl ; UI1C = interne nr van de klasse uit ^DDP ; STOR = tabel met b-indexen en subscripts S $ZT="TRAP^cAN000" N class,stor,sdef,sc S class=cl.Name S stor="DataM" ; interne naam propertie STORA S sdef=##class(%Dictionary.StorageDefinition).%New($p(class,".",$l(class,"."))_"."_stor) I 'sdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_class G STORZ D cl.Storages.Insert(sdef) S sdef.Name=stor ; interne naam S sdef.Description="" ; interne commentaar S sdef.Type="DAMLib.CacheSQLStorageDataM" S sdef.StreamLocation="^"_cl.Name_"S" S OK=$$STORM(.sdef,.STOR) I 'OK G STORY ; S OK=$$STORP(.sdef,"D",1,.STOR) I 'OK G STORY ; S sdef.SequenceNumber=10 S sc=sdef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_class_" "_stor) G STORY STORY D CLOSE(.sdef) S cl.StorageStrategy="DataM" STORZ Q OK ; STORP(sdef,TYPE,VNR,STOR) ; opzetten properties ; Sdef = instance van StorageDefinition : doorgeven als ref. .ddef ; STOR = tabel met b-indexen en subscripts S $ZT="TRAP^cAN000" N pdef,sc,OK,BIN,prop,err S BIN="",OK=1 STORPA S BIN=$O(STOR(TYPE,VNR,"B",BIN)) I BIN="" G STORPZ S prop=$P(STOR(TYPE,VNR,"B",BIN),D) s err=" StoragePropertyDefinition : "_prop S pdef=##class(%Dictionary.StoragePropertyDefinition).%New(prop) I 'pdef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G STORPZ D sdef.Properties.Insert(pdef) S pdef.Name=prop s sc=pdef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.pdef) G STORPZ STORPY D CLOSE(.pdef) G STORPA STORPZ Q OK ; STORM(sdef,STOR) ; opzetten SQLMappen ; sdef = instance van Storage : doorgeven als ref. .sdef ; TYPE = 0 : Data, 1 = index ; STOR = tabel met b-indexen en subscripts S $ZT="TRAP^cAN000" N dmap,ddef,sc,OK,err,TYPE,VNR S OK=1 S TYPE="" STORMA S TYPE=$O(STOR(TYPE)) I TYPE="" G STORMZ S VNR="" STORMB S VNR=$O(STOR(TYPE,VNR)) I VNR="" G STORMA S dmap=STOR(TYPE,VNR,"N") s err=" StorageSQLMapDefinition : "_dmap S ddef=##class(%Dictionary.StorageSQLMapDefinition).%New(dmap) I 'ddef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G STORMZ D sdef.SQLMaps.Insert(ddef) S ddef.Name=dmap S ddef.Type=$S(TYPE="D":"data",1:"index") ; S ddef.Structure="delimited" ; niet meer nodig vanaf 5.20 S ddef.Global=STOR(TYPE,VNR,"G") S OK=$$STORS(.ddef,TYPE,VNR,.STOR) I 'OK G STORMZ I TYPE="D" S OK=$$STORDA(.ddef,TYPE,VNR,.STOR) I 'OK G STORMZ s sc=ddef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.ddef) G STORMZ STORMY D CLOSE(.ddef) G STORMB STORMZ Q OK ; STORS(ddef,TYPE,VNR,STOR) ; opzetten subscripts ; ddef = instance van StorageSQLMap : doorgeven als ref. .ddef ; STOR = tabel met b-indexen en subscripts S $ZT="TRAP^cAN000" N sub,sudef,sc,OK,err,S,STR,i,LSTR,PS,EXP S S="",OK=1 STORSA S S=$O(STOR(TYPE,VNR,"S",S)) I S="" G STORSZ S sub=$P(STOR(TYPE,VNR,"S",S),D) s err=" StorageSQLMapSubDefinition : "_S_" : "_sub S sudef=##class(%Dictionary.StorageSQLMapSubDefinition).%New(S) I 'sudef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G STORSZ D ddef.Subscripts.Insert(sudef) S sudef.Name=S S sudef.Expression=$S($P(STOR(TYPE,VNR,"S",S),D,3):"{"_sub_"}",1:sub) ; data STORSD I TYPE'="D" G STORSI ; instellen startvalue voor de subscript I $L($P(STOR(TYPE,VNR,"S",S),D,10)) S sudef.StartValue=$P(STOR(TYPE,VNR,"S",S),D,10) G STORSX ; index ; Indien index kijken of er een alphaup moet gebeuren en dit nooit bij de laatste ; aangezien dit de key is ; I TYPE="I",'$L($O(STOR(TYPE,VNR,"S",S))),"\0\5\10\"[(D_$P(STOR(TYPE,VNR,"S",S),D,2)_D) S sudef.Expression="$$ALPHAUP("_sudef.Expression_")" ; Indien property niet aangeduidt als subscript : geen alphaup erbij STORSI I TYPE'="I" G STORSX S PS=$O(STOR(TYPE,VNR,"S",S),-1) ; vorige subscript I $L(PS),$L($P(STOR(TYPE,VNR,"S",PS),D,11)) D ; indien 1 van de vorige subscripts een spec. toegang heeft (bv datum) . S sudef.AccessType="Sub" . S STR=$P(STOR(TYPE,VNR,"S",PS),D,11) . S sudef.DataAccess=STR . S $P(STOR(TYPE,VNR,"S",S),D,11)=$P(STR,")",1,$L(STR,")")-1)_",{L"_S_"})" I '$P(STOR(TYPE,VNR,"S",S),D,4),"\0\5\10\"[(D_$P(STOR(TYPE,VNR,"S",S),D,2)_D) S sudef.Expression="$$ALPHAUP("_sudef.Expression_")" I $P(STOR(TYPE,VNR,"S",S),D,2)'=2 G STORSX ; damlib.date S sudef.AccessType="Other" s sudefinv=##class(%Dictionary.StorageSQLMapSubInvalidconditionDefinition).%New() I 'sudefinv S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G STORSY D sudef.Invalidconditions.Insert(sudefinv) S sudefinv.Name=1 S LSTR="" F i=1:1:S-1 S LSTR=LSTR_"{L"_i_"}," S $P(STOR(TYPE,VNR,"S",S),D,11)=STOR(TYPE,VNR,"G")_"("_LSTR_"$zd({L"_S_"},8))" S sudefinv.Expression="'$d("_$P(STOR(TYPE,VNR,"S",S),D,11)_")" S sc=sudefinv.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.sudefinv) G STORSY D CLOSE(.sudefinv) STORSI1 S STR=" S {L"_S_"}=$S('$L({L"_S_"}):"""",1:$zd({L"_S_"},8))" S STR=STR_$C(13,10)_" S {L"_S_"}=$O("_STOR(TYPE,VNR,"G")_"("_LSTR_"{L"_S_"}))" S STR=STR_$C(13,10)_" S {L"_S_"}=$S('$L({L"_S_"}):"""",1:$zdh({L"_S_"},8))" S sudef.NextCode=STR ; STORSX s sc=sudef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.sudef) G STORSZ STORSY D CLOSE(.sudef) G STORSA STORSZ Q OK ; STORDA(ddef,TYPE,VNR,STOR) ; opzetten data ; ddef = instance van StorageSQLMap : doorgeven als ref. .ddef ; STOR = tabel met b-indexen en subscripts S $ZT="TRAP^cAN000" N dadef,sc,OK,BIN,prop,err S BIN="",OK=1 STORDAA S BIN=$O(STOR(TYPE,VNR,"B",BIN)) I BIN="" G STORDAZ S prop=$P(STOR(TYPE,VNR,"B",BIN),D) s err=" StorageSQLMapDataDefinition : "_prop S dadef=##class(%Dictionary.StorageSQLMapDataDefinition).%New(prop) I 'dadef S OK="0\"_$P($T(@("T8"_QT)),U,2)_err G STORDAZ D ddef.Data.Insert(dadef) S dadef.Name=prop S dadef.Node=(BIN\100-1) S dadef.Delimiter="""\""" S dadef.Piece=BIN#100 s sc=dadef.%Save() I 'sc S OK=$$ERR(sc,$P($T(@("T6"_QT)),U,2)_err) D CLOSE(.dadef) G STORDAZ STORDAY D CLOSE(.dadef) G STORDAA STORDAZ Q OK ; ; SUPER(B) ; bepalen superklassen S R=$P($P($T(@("T4"_QT)),U,2+$P(B(1),D,7)),"#",2) ; Super I $P(B(1),D,6)'["DAMLib.Templ" S R=R_",DAMLib.Templ02E" I $L($P(B(1),D,6)) S R=R_","_$P(B(1),D,6) ; Bijkomende superklassen SUPERZ Q R ; CLOSE(def) ; close van object ; def = instance : moet doorgegeven worden als referentie D def.%Close() s def="" CLOSEZ Q ; ERR(sc,TXT) N err D $system.Status.DecomposeStatus(sc,.err) ERRZ Q "0\"_TXT_" : "_err(1) ; ZZ ; 29.08.07 - 10 u 22 * V8.09