DIKZ0 ;SFISC/XAK-XREF COMPILER ;23AUG2004
;;22.0;VA FileMan;**140**;Mar 30, 1999
;Per VHA Directive 10-93-142, this routine should not be modified.
S DIK0=" I X'=""""" D DD^DIK,A,SD Q:DIKZQ
RET I $D(DK1) S A=A+1,DIKA=1,DH=0 F S DH=$O(DK1(DH)) Q:DH'>0 D E^DIK
S:DH="" DH=-1 I $D(DK1) K DK1 D SD Q:DIKZQ G RET
Q
SD F DH=DH(1):0 S DH=$O(DU(DH)) Q:DH'>0 S:$D(^DD(DH,"SB")) DK1(DH)="" D DD1^DIK,0 Q:DIKZQ S:$D(^DD(DH,"IX"))!$D(^TMP("DIKC",$J,DH)) DIK(X,DH)="A1^"_DNM_DRN K:'$D(^DD(DH,"IX"))&'$D(^TMP("DIKC",$J,DH)) DIK(X,DH) K DU(DH)
Q
0 ;
D SV^DIKZ Q:DIKZQ S DIK1=""
I $D(DIKA) S DIK1=" S DA("_A_")=DA"_$S(A=1:"",1:"("_(A-1)_")")
F DIKL2=A-1:-1:1 S DIK1=DIK1_" S DA("_DIKL2_")=0"
S ^UTILITY($J,DIKR+1)=DIK1_" S DA=0",DIKR=DIKR+2,^(DIKR)="A1 ;"
D ^DIKZ2 K DIKA S DIKLW=1
S DIKR=DIKR+1,DIK=DIK2_DIK8(DH),^UTILITY($J,DIKR)=A_" ;",DIKR=DIKR+1
A ;
K DIK6 F DIKQ=0:0 S DIKQ=$O(^UTILITY("DIK",$J,DH,DIKQ)) Q:DIKQ'>0 I $G(DIKVR)="DISET"!(DIKQ'=.01) S %=^(DIKQ) S:+%'=% %=""""_%_"""" D PUT
I $G(DIKVR)="DIKILL",$D(^UTILITY("DIK",$J,DH,.01)) S DIKQ=.01,%=^(.01) S:+%'=% %=""""_%_"""" D PUT
D INDEX
K ^UTILITY("DIK",$J),DIK6
Q
PUT N DIKSET I '$D(DIK6(%)) S ^UTILITY($J,DIKR)=" S DIKZ("_%_")=$G("_DIK_"DA,"_%_"))",DIK6(%)=""
S DIKR=DIKR+1,(DIKSET,^UTILITY($J,DIKR))=" "_$P(^UTILITY("DIK",$J,DH,DIKQ,0),"^(X)")_"DIKZ("_%_")"_$P(^(0),"^(X)",2,9)
F DIKC=0:0 S DIKC=$O(^UTILITY("DIK",$J,DH,DIKQ,DIKC)) S DIKR=DIKR+1 Q:DIKC'>0 D
.S %=^(DIKC) S:$O(^(0))'=DIKC ^UTILITY($J,DIKR)=DIKSET,DIKR=DIKR+1
.I %["Q:"!(%[" Q") K DIK6 S ^UTILITY($J,DIKR)=DIK0_" X ^DD("_DH_","_DIKQ_",1,"_DIKC_","_X_")" Q
.I %["D RCR" K DIK6 S ^UTILITY($J,DIKR)=DIK0_" D",DIKR=DIKR+2,^(DIKR-1)=" .N DIK,DIV,DIU,DIN",^UTILITY($J,DIKR)=" ."_^UTILITY("DIK",$J,DH,DIKQ,DIKC,0) Q
.I %["S XMB=" S ^UTILITY($J,DIKR)=DIK0_",$D(DIK(0)),DIK(0)[""B"" S DIKZR="_DIKC_",DIKZZ="_DIKQ_" D BUL^"_DNM,DIKR=DIKR+1,^UTILITY($J,DIKR)=DIK0_",'$D(DIKOZ) "_$S($L(%)<225:%,1:"X ^DD("_DH_","_DIKQ_",1,"_DIKC_","_X_")") Q
.S ^UTILITY($J,DIKR)=DIK0_" "_$S(%[" AUDIT":"S DH="_DH_",DV="_DIKQ_",DU="_A_" ",1:"")_%_$S(%[" AUDIT":"^DIK1",1:"")
Q
;
;
INDEX ;Loop through ^TMP and pick up cross references for file DH
N DIKO,DIKCTAG
S DIKCTAG=0
;
;Build code for each xref
S DIKC=0 F S DIKC=$O(^TMP("DIKC",$J,DH,DIKC)) Q:'DIKC D GETINDEX
D:DIKCTAG LINE("CR"_(DIKCTAG+1)_" K X")
Q
;
GETINDEX ;Get code for one index DIKC in file DH
I DIKVR="DIKILL",$G(^TMP("DIKC",$J,DH,DIKC,"K"))?."^" Q
I DIKVR="DISET",$G(^TMP("DIKC",$J,DH,DIKC,"S"))?."^" Q
;
N DIKF,DIKCOD,DIKO,DIK01
S DIKCTAG=DIKCTAG+1
D LINE("CR"_DIKCTAG_" S DIXR="_DIKC)
;
;Build code to set X array
S DIKF=$O(^TMP("DIKC",$J,DH,DIKC,0)) Q:'DIKF
D LINE(" K X")
S DIKO=0 F S DIKO=$O(^TMP("DIKC",$J,DH,DIKC,DIKO)) Q:'DIKO D XARR
D LINE(" S X=$G(X("_DIKF_"))")
;
;Build code to check for null subscripts
S DIKCOD="",DIKO=0
F S DIKO=$O(^TMP("DIKC",$J,DH,DIKC,DIKO)) Q:'DIKO D:$G(^(DIKO,"SS"))
. S DIKCOD=DIKCOD_$E(",",DIKCOD]"")_"$G(X("_DIKO_"))]"""""
D LINE($S(DIKCOD]"":" I "_DIKCOD_" D",1:" D")) ;**GFT -- NOIS ISL-0604-50146 **
D LINE(" . K X1,X2 M X1=X,X2=X")
;
I DIKVR="DIKILL" D
. ;Adjust .01 values X2 array if we're deleting a record
. I $D(DIK01) D
..S DIKCOD="",DIKO=0 F S DIKO=$O(DIK01(DIKO)) Q:'DIKO D ;**GFT -- NOIS ISL-0604-50146 **
... S DIKCOD=DIKCOD_$E(",",DIKCOD]"")_"X2("_DIKO_")"
.. Q:DIKCOD=""
.. S:DIKF=$O(DIK01(0)) DIKCOD="X2,"_DIKCOD
.. S:DIKCOD["," DIKCOD="("_DIKCOD_")"
.. D LINE(" . S:$D(DIKIL) "_DIKCOD_"=""""")
. ;
. ;Get kill condition code
. S DIKCOD=$G(^TMP("DIKC",$J,DH,DIKC,"KC"))
. I DIKCOD'?."^" D
.. D LINE(" . N DIKXARR M DIKXARR=X S DIKCOND=1")
.. D LINE(" . "_DIKCOD)
.. D LINE(" . S DIKCOND=$G(X) K X M X=DIKXARR")
.. D LINE(" . Q:'DIKCOND")
. ;Get kill logic
. D LINE(" . "_$G(^TMP("DIKC",$J,DH,DIKC,"K")))
;
I DIKVR="DISET" D
. ;Get set condition code
. S DIKCOD=$G(^TMP("DIKC",$J,DH,DIKC,"SC"))
. I DIKCOD'?."^" D
.. D LINE(" . N DIKXARR M DIKXARR=X S DIKCOND=1")
.. D LINE(" . "_DIKCOD)
.. D LINE(" . S DIKCOND=$G(X) K X M X=DIKXARR")
.. D LINE(" . Q:'DIKCOND")
. ;Get set logic
. D LINE(" . "_$G(^TMP("DIKC",$J,DH,DIKC,"S")))
K DIK6 Q
;
XARR ;Build code to set X array
;Also return DIK01(order#)="" if crv is .01 field
N CODE,NODE,REF,LINE,TRANS
;K DIK01
;
;Build data extraction code
S CODE=$G(^TMP("DIKC",$J,DH,DIKC,DIKO)) Q:CODE?."^"
I $D(^TMP("DIKC",$J,DH,DIKC,DIKO,"F"))#2 D
. S DIK01(DIKO)=""
. S REF=$P($P(CODE,",",1,$L(CODE,",")-2),"(",2,999)
. S NODE=$P($P(REF,",",$L(REF,",")),"))")
. I '$D(DIK6(NODE)) D
.. D LINE(" S DIKZ("_NODE_")="_REF)
.. S DIK6(NODE)=""
. S LINE=" "_$P(CODE,REF)_"DIKZ("_NODE_")"_$P(CODE,REF,2,999)
E S LINE=" "_CODE
;
S TRANS=$G(^TMP("DIKC",$J,DH,DIKC,DIKO,"T"))
I TRANS'?."^" D
. D LINE(LINE)
. D DOTLINE(" I $G(X)]"""" "_TRANS)
. D LINE(" S:$D(X)#2 X("_DIKO_")=X")
E I $G(NODE)]"",LINE?1" S X=".E D
. D LINE(" S X("_DIKO_")"_$E(LINE,5,999))
E D
. D LINE(LINE)
. D LINE(" S:$D(X)#2 X("_DIKO_")=X")
Q
;
DOTLINE(CODE) ;Add code to ^UTILITY. If the code looks like it contains
;a Quit command, put the code under a do-dot structure.
I CODE[" Q"!(CODE["Q:") D
. D LINE(" D")
. D LINE(" . "_CODE)
E D LINE(CODE)
Q
;
LINE(CODE) ;Add line of code to ^UTILITY, increment DIKR
S ^UTILITY($J,DIKR)=CODE
S DIKR=DIKR+1
Q
DIKZ0 ;SFISC/XAK-XREF COMPILER ;23AUG2004
+1 ;;22.0;VA FileMan;**140**;Mar 30, 1999
+2 ;Per VHA Directive 10-93-142, this routine should not be modified.
+3 SET DIK0=" I X'="""""
DO DD^DIK
DO A
DO SD
IF DIKZQ
QUIT
RET IF $DATA(DK1)
SET A=A+1
SET DIKA=1
SET DH=0
FOR
SET DH=$ORDER(DK1(DH))
IF DH'>0
QUIT
DO E^DIK
+1 IF DH=""
SET DH=-1
IF $DATA(DK1)
KILL DK1
DO SD
IF DIKZQ
QUIT
GOTO RET
+2 QUIT
SD FOR DH=DH(1):0
SET DH=$ORDER(DU(DH))
IF DH'>0
QUIT
IF $DATA(^DD(DH,"SB"))
SET DK1(DH)=""
DO DD1^DIK
DO 0
IF DIKZQ
QUIT
IF $DATA(^DD(DH,"IX"))!$DATA(^TMP("DIKC",$JOB,DH))
SET DIK(X,DH)="A1^"_DNM_DRN
IF '$DATA(^DD(DH,"IX"))&'$DATA(^TMP("DIKC",$JOB,DH))
KILL DIK(X,DH)
KILL DU(DH)
+1 QUIT
0 ;
+1 DO SV^DIKZ
IF DIKZQ
QUIT
SET DIK1=""
+2 IF $DATA(DIKA)
SET DIK1=" S DA("_A_")=DA"_$SELECT(A=1:"",1:"("_(A-1)_")")
+3 FOR DIKL2=A-1:-1:1
SET DIK1=DIK1_" S DA("_DIKL2_")=0"
+4 SET ^UTILITY($JOB,DIKR+1)=DIK1_" S DA=0"
SET DIKR=DIKR+2
SET ^(DIKR)="A1 ;"
+5 DO ^DIKZ2
KILL DIKA
SET DIKLW=1
+6 SET DIKR=DIKR+1
SET DIK=DIK2_DIK8(DH)
SET ^UTILITY($JOB,DIKR)=A_" ;"
SET DIKR=DIKR+1
A ;
+1 KILL DIK6
FOR DIKQ=0:0
SET DIKQ=$ORDER(^UTILITY("DIK",$JOB,DH,DIKQ))
IF DIKQ'>0
QUIT
IF $GET(DIKVR)="DISET"!(DIKQ'=.01)
SET %=^(DIKQ)
IF +%'=%
SET %=""""_%_""""
DO PUT
+2 IF $GET(DIKVR)="DIKILL"
IF $DATA(^UTILITY("DIK",$JOB,DH,.01))
SET DIKQ=.01
SET %=^(.01)
IF +%'=%
SET %=""""_%_""""
DO PUT
+3 DO INDEX
+4 KILL ^UTILITY("DIK",$JOB),DIK6
+5 QUIT
PUT NEW DIKSET
IF '$DATA(DIK6(%))
SET ^UTILITY($JOB,DIKR)=" S DIKZ("_%_")=$G("_DIK_"DA,"_%_"))"
SET DIK6(%)=""
+1 SET DIKR=DIKR+1
SET (DIKSET,^UTILITY($JOB,DIKR))=" "_$PIECE(^UTILITY("DIK",$JOB,DH,DIKQ,0),"^(X)")_"DIKZ("_%_")"_$PIECE(^(0),"^(X)",2,9)
+2 FOR DIKC=0:0
SET DIKC=$ORDER(^UTILITY("DIK",$JOB,DH,DIKQ,DIKC))
SET DIKR=DIKR+1
IF DIKC'>0
QUIT
Begin DoDot:1
+3 SET %=^(DIKC)
IF $ORDER(^(0))'=DIKC
SET ^UTILITY($JOB,DIKR)=DIKSET
SET DIKR=DIKR+1
+4 IF %["Q:"!(%[" Q")
KILL DIK6
SET ^UTILITY($JOB,DIKR)=DIK0_" X ^DD("_DH_","_DIKQ_",1,"_DIKC_","_X_")"
QUIT
+5 IF %["D RCR"
KILL DIK6
SET ^UTILITY($JOB,DIKR)=DIK0_" D"
SET DIKR=DIKR+2
SET ^(DIKR-1)=" .N DIK,DIV,DIU,DIN"
SET ^UTILITY($JOB,DIKR)=" ."_^UTILITY("DIK",$JOB,DH,DIKQ,DIKC,0)
QUIT
+6 IF %["S XMB="
SET ^UTILITY($JOB,DIKR)=DIK0_",$D(DIK(0)),DIK(0)[""B"" S DIKZR="_DIKC_",DIKZZ="_DIKQ_" D BUL^"_DNM
SET DIKR=DIKR+1
SET ^UTILITY($JOB,DIKR)=DIK0_",'$D(DIKOZ) "_$SELECT($LENGTH(%)<225:%,1:"X ^DD("_DH_","_DIKQ_",1,"_DIKC_","_X_")")
QUIT
+7 SET ^UTILITY($JOB,DIKR)=DIK0_" "_$SELECT(%[" AUDIT":"S DH="_DH_",DV="_DIKQ_",DU="_A_" ",1:"")_%_$SELECT(%[" AUDIT":"^DIK1",1:"")
End DoDot:1
+8 QUIT
+9 ;
+10 ;
INDEX ;Loop through ^TMP and pick up cross references for file DH
+1 NEW DIKO,DIKCTAG
+2 SET DIKCTAG=0
+3 ;
+4 ;Build code for each xref
+5 SET DIKC=0
FOR
SET DIKC=$ORDER(^TMP("DIKC",$JOB,DH,DIKC))
IF 'DIKC
QUIT
DO GETINDEX
+6 IF DIKCTAG
DO LINE("CR"_(DIKCTAG+1)_" K X")
+7 QUIT
+8 ;
GETINDEX ;Get code for one index DIKC in file DH
+1 IF DIKVR="DIKILL"
IF $GET(^TMP("DIKC",$JOB,DH,DIKC,"K"))?."^"
QUIT
+2 IF DIKVR="DISET"
IF $GET(^TMP("DIKC",$JOB,DH,DIKC,"S"))?."^"
QUIT
+3 ;
+4 NEW DIKF,DIKCOD,DIKO,DIK01
+5 SET DIKCTAG=DIKCTAG+1
+6 DO LINE("CR"_DIKCTAG_" S DIXR="_DIKC)
+7 ;
+8 ;Build code to set X array
+9 SET DIKF=$ORDER(^TMP("DIKC",$JOB,DH,DIKC,0))
IF 'DIKF
QUIT
+10 DO LINE(" K X")
+11 SET DIKO=0
FOR
SET DIKO=$ORDER(^TMP("DIKC",$JOB,DH,DIKC,DIKO))
IF 'DIKO
QUIT
DO XARR
+12 DO LINE(" S X=$G(X("_DIKF_"))")
+13 ;
+14 ;Build code to check for null subscripts
+15 SET DIKCOD=""
SET DIKO=0
+16 FOR
SET DIKO=$ORDER(^TMP("DIKC",$JOB,DH,DIKC,DIKO))
IF 'DIKO
QUIT
IF $GET(^(DIKO,"SS"))
Begin DoDot:1
+17 SET DIKCOD=DIKCOD_$EXTRACT(",",DIKCOD]"")_"$G(X("_DIKO_"))]"""""
End DoDot:1
+18 ;**GFT -- NOIS ISL-0604-50146 **
DO LINE($SELECT(DIKCOD]"":" I "_DIKCOD_" D",1:" D"))
+19 DO LINE(" . K X1,X2 M X1=X,X2=X")
+20 ;
+21 IF DIKVR="DIKILL"
Begin DoDot:1
+22 ;Adjust .01 values X2 array if we're deleting a record
+23 IF $DATA(DIK01)
Begin DoDot:2
+24 ;**GFT -- NOIS ISL-0604-50146 **
SET DIKCOD=""
SET DIKO=0
FOR
SET DIKO=$ORDER(DIK01(DIKO))
IF 'DIKO
QUIT
Begin DoDot:3
+25 SET DIKCOD=DIKCOD_$EXTRACT(",",DIKCOD]"")_"X2("_DIKO_")"
End DoDot:3
+26 IF DIKCOD=""
QUIT
+27 IF DIKF=$ORDER(DIK01(0))
SET DIKCOD="X2,"_DIKCOD
+28 IF DIKCOD[","
SET DIKCOD="("_DIKCOD_")"
+29 DO LINE(" . S:$D(DIKIL) "_DIKCOD_"=""""")
End DoDot:2
+30 ;
+31 ;Get kill condition code
+32 SET DIKCOD=$GET(^TMP("DIKC",$JOB,DH,DIKC,"KC"))
+33 IF DIKCOD'?."^"
Begin DoDot:2
+34 DO LINE(" . N DIKXARR M DIKXARR=X S DIKCOND=1")
+35 DO LINE(" . "_DIKCOD)
+36 DO LINE(" . S DIKCOND=$G(X) K X M X=DIKXARR")
+37 DO LINE(" . Q:'DIKCOND")
End DoDot:2
+38 ;Get kill logic
+39 DO LINE(" . "_$GET(^TMP("DIKC",$JOB,DH,DIKC,"K")))
End DoDot:1
+40 ;
+41 IF DIKVR="DISET"
Begin DoDot:1
+42 ;Get set condition code
+43 SET DIKCOD=$GET(^TMP("DIKC",$JOB,DH,DIKC,"SC"))
+44 IF DIKCOD'?."^"
Begin DoDot:2
+45 DO LINE(" . N DIKXARR M DIKXARR=X S DIKCOND=1")
+46 DO LINE(" . "_DIKCOD)
+47 DO LINE(" . S DIKCOND=$G(X) K X M X=DIKXARR")
+48 DO LINE(" . Q:'DIKCOND")
End DoDot:2
+49 ;Get set logic
+50 DO LINE(" . "_$GET(^TMP("DIKC",$JOB,DH,DIKC,"S")))
End DoDot:1
+51 KILL DIK6
QUIT
+52 ;
XARR ;Build code to set X array
+1 ;Also return DIK01(order#)="" if crv is .01 field
+2 NEW CODE,NODE,REF,LINE,TRANS
+3 ;K DIK01
+4 ;
+5 ;Build data extraction code
+6 SET CODE=$GET(^TMP("DIKC",$JOB,DH,DIKC,DIKO))
IF CODE?."^"
QUIT
+7 IF $DATA(^TMP("DIKC",$JOB,DH,DIKC,DIKO,"F"))#2
Begin DoDot:1
+8 SET DIK01(DIKO)=""
+9 SET REF=$PIECE($PIECE(CODE,",",1,$LENGTH(CODE,",")-2),"(",2,999)
+10 SET NODE=$PIECE($PIECE(REF,",",$LENGTH(REF,",")),"))")
+11 IF '$DATA(DIK6(NODE))
Begin DoDot:2
+12 DO LINE(" S DIKZ("_NODE_")="_REF)
+13 SET DIK6(NODE)=""
End DoDot:2
+14 SET LINE=" "_$PIECE(CODE,REF)_"DIKZ("_NODE_")"_$PIECE(CODE,REF,2,999)
End DoDot:1
+15 IF '$TEST
SET LINE=" "_CODE
+16 ;
+17 SET TRANS=$GET(^TMP("DIKC",$JOB,DH,DIKC,DIKO,"T"))
+18 IF TRANS'?."^"
Begin DoDot:1
+19 DO LINE(LINE)
+20 DO DOTLINE(" I $G(X)]"""" "_TRANS)
+21 DO LINE(" S:$D(X)#2 X("_DIKO_")=X")
End DoDot:1
+22 IF '$TEST
IF $GET(NODE)]""
IF LINE?1" S X=".E
Begin DoDot:1
+23 DO LINE(" S X("_DIKO_")"_$EXTRACT(LINE,5,999))
End DoDot:1
+24 IF '$TEST
Begin DoDot:1
+25 DO LINE(LINE)
+26 DO LINE(" S:$D(X)#2 X("_DIKO_")=X")
End DoDot:1
+27 QUIT
+28 ;
DOTLINE(CODE) ;Add code to ^UTILITY. If the code looks like it contains
+1 ;a Quit command, put the code under a do-dot structure.
+2 IF CODE[" Q"!(CODE["Q:")
Begin DoDot:1
+3 DO LINE(" D")
+4 DO LINE(" . "_CODE)
End DoDot:1
+5 IF '$TEST
DO LINE(CODE)
+6 QUIT
+7 ;
LINE(CODE) ;Add line of code to ^UTILITY, increment DIKR
+1 SET ^UTILITY($JOB,DIKR)=CODE
+2 SET DIKR=DIKR+1
+3 QUIT