DIEZ4 ;SFISC/MKO-COMPILE INPUT TEMPLATE, RECORD-LEVEL INDEXES ;2:15 PM 14 Jul 1999 ;;22.0;VA FileMan;**11**;Mar 30, 1999 ;Per VHA Directive 10-93-142, this routine should not be modified. ; ;Variables passed in through symbol table: ; DNM = Name of routine ; DRN(routine#) = "" : array of routine numbers ; DMAX = Maximum routine size ; DIEZTMP = Root of global that contains record-level index info ; ;Routine-wide variables ; T = Total byte count of current routine ; L = Last line number in current routine ; DP = file # ; DRN = routine # ; DIEZCNT = Count of xrefs processed in current routine (used as ; a line tag) ; DIEZAR(file#,xref#) = linetag^routine (returned) ; DIEZKEYR(file#,key#,uniqxref#) = Xn^routine ; RECXR(DIEZAR) ;Build routines for record-level indexes Q:'$D(@DIEZTMP@("R")) N DIEZCNT,DIEZXR,DP ; S DRN=$O(DRN(""),-1)+1 D NEWROU ; S DP=0 F S DP=$O(@DIEZTMP@("R",DP)) Q:'DP D Q:$G(DIEZQ) . S DIEZXR=0 . F S DIEZXR=$O(@DIEZTMP@("R",DP,DIEZXR)) Q:'DIEZXR D Q:$G(DIEZQ) .. D GETXR(DIEZXR) Q:$G(DIEZQ) Q:$G(DIEZQ) D SAVE Q ; GETXR(DIEZXR) ;Get code for one index DIEZXR N DIEZCOD,DIEZF,DIEZKLOG,DIEZNSS,DIEZO,DIEZSLOG I T>DMAX D SAVE Q:$G(DIEZQ) D NEWROU ; S DIEZCNT=$G(DIEZCNT)+1 S DIEZAR(DP,DIEZXR)=DIEZCNT_U_DNM_DRN ; ;Build code to call subroutine to set X array D L(DIEZCNT_" N X,X1,X2 S DIXR="_DIEZXR_" D X"_DIEZCNT_"(U) K X2 M X2=X D X"_DIEZCNT_"(""F"") K X1 M X1=X") ; ;Build code to check for null subscripts S DIEZNSS="",DIEZO=0 F S DIEZO=$O(@DIEZTMP@("R",DP,DIEZXR,DIEZO)) Q:'DIEZO D . Q:'$G(@DIEZTMP@("R",DP,DIEZXR,DIEZO,"SS")) . I DIEZNSS="" S DIEZNSS="$G(X("_DIEZO_"))]""""" . E S DIEZNSS=DIEZNSS_",$G(X("_DIEZO_"))]""""" I DIEZNSS]"" S DIEZNSS=" I "_DIEZNSS_" D" E S DIEZNSS=" D" ; ;Store kill logic and condition S DIEZKLOG=$G(@DIEZTMP@("R",DP,DIEZXR,"K")) I DIEZKLOG'?."^" D . D L(DIEZNSS) . ;Build kill condition code . S DIEZCOD=$G(@DIEZTMP@("R",DP,DIEZXR,"KC")) . I DIEZCOD'?."^" D .. D L(" . N DIEZCOND,DIEXARR M DIEXARR=X S DIEZCOND=1") .. D L(" . "_DIEZCOD) .. D L(" . S DIEZCOND=$G(X) K X M X=DIEXARR Q:'DIEZCOND") . ;Store kill logic . D L(" . "_DIEZKLOG) ; ;Store set logic and condition S DIEZSLOG=$G(@DIEZTMP@("R",DP,DIEZXR,"S")) I DIEZSLOG'?."^" D . D L(" K X M X=X2"_DIEZNSS) . ;Build set condition code . S DIEZCOD=$G(@DIEZTMP@("R",DP,DIEZXR,"SC")) . I DIEZCOD'?."^" D .. D L(" . N DIEZCOND,DIEXARR M DIEXARR=X S DIEZCOND=1") .. D L(" . "_DIEZCOD) .. D L(" . S DIEZCOND=$G(X) K X M X=DIEXARR Q:'DIEZCOND") . ;Store set logic . D L(" . "_DIEZSLOG) ; ;Build code to check record level keys D:$D(^DD("KEY","AU",DIEZXR)) BLDKCHK(DIEZXR) D L(" Q") ; ;Build code to set X array S DIEZF=$O(@DIEZTMP@("R",DP,DIEZXR,0)) D L("X"_DIEZCNT_"(DION) K X") ; S DIEZO=0 F S DIEZO=$O(@DIEZTMP@("R",DP,DIEZXR,DIEZO)) Q:'DIEZO D BLDDEC(DIEZXR,DIEZO) D L(" S X=$G(X("_DIEZF_"))") D L(" Q") Q ; BLDDEC(DIEZXR,DIEZO) ;Build data extraction code N CODE,NODE,TRANS ; S CODE=$G(@DIEZTMP@("R",DP,DIEZXR,DIEZO)) Q:CODE?."^" S TRANS=$G(@DIEZTMP@("R",DP,DIEZXR,DIEZO,"T")) I TRANS'?."^" D . D L(" "_CODE) . D DOTLINE(" I $D(X)#2 "_TRANS) . D L(" S:$D(X)#2 X("_DIEZO_")=X") E I $D(@DIEZTMP@("R",DP,DIEZXR,DIEZO,"F"))#2,CODE?1"S X=".E D . D L(" S X("_DIEZO_")"_$E(CODE,4,999)) E D . D L(" "_CODE) . D L(" S:$D(X)#2 X("_DIEZO_")=X") Q ; BLDKCHK(DIEZUI) ;Build code to check key for xref N DIEZKLST,DIEZMAXL,DIEZUIR,I ; D XRINFO^DIKCU2(DIEZUI,.DIEZUIR,"",.DIEZMAXL) ; ;Get list of keys with this uniqueness index S DIEZKLST="",I=0 S I=0 F S I=$O(^DD("KEY","AU",DIEZUI,I)) Q:'I S DIEZKLST=I_"," Q:DIEZKLST="" S DIEZKLST=$E(DIEZKLST,1,$L(DIEZKLST)-1) ; D L(" . I $G(DIEXEC)[""K"" D") D L(" .. N DIMAXL,DIUIR") D L(" .. S DIUIR=$NA("_DIEZUIR_") Q:'$D(@DIUIR)") ; ;Build code to set DIMAXL(order#)=maxLength I $D(DIEZMAXL) D . N ORD,X . S X="S ",ORD=0 . F S ORD=$O(DIEZMAXL(ORD)) Q:'ORD D .. S X=X_"DIMAXL("_ORD_")="_DIEZMAXL(ORD)_"," . I X?.E1"," D L(" .. "_$E(X,1,$L(X)-1)) ; D L(" .. I '$$UNIQUE^DIE17(.X,.DA,DIUIR,""X"_DIEZCNT_U_DNM_DRN_""""_$S($D(DIEZMAXL):",.DIMAXL",1:"")_") N I F I="_DIEZKLST_" S DIKEY("_DP_",I,DIIENS)=""""") Q ; L(X) ;Add CODE to ^UTILITY S L=L+1,^UTILITY($J,0,L)=X,T=T+$L(X)+2 Q ; DOTLINE(X) ; I X[" Q"!(X[" Q:") D . D L(" D"),L(" ."_X) E D L(X) Q ; NEWROU ;Start a new routine K ^UTILITY($J,0) S ^UTILITY($J,0,1)=DNM_DRN_" ; ;"_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3),T=$L(^(1)) S ^UTILITY($J,0,2)=" ;;",T=T+$L(^(2)) S L=2,DIEZCNT=0 Q ; SAVE ;Get the next available routine number N DQ F DQ=DRN+1:1 Q:'$D(DRN(DQ)) ; ;Save current routine D SAVE^DIEZ1 Q:$G(DIEZQ) K ^UTILITY($J,0) Q