| [1200] | 1 | BMXADOV1        ; IHS/CIHA/GIS - RPC CALL: GENERATE DATA FOR AN ADO DATASET ; 6/5/11 12:15pm | 
|---|
| [1147] | 2 | ;;4.1000;BMX;;Apr 17, 2011 | 
|---|
|  | 3 | ; CONTINUATION FILE FOR BMXADOV | 
|---|
|  | 4 | ; MANAGES ITERATION FOR INDIVIDUAL INDEX TYPES | 
|---|
|  | 5 | ; ASSUMES CERTAIN LOCAL VARS: CREF,FIEN,IENS,DAS (<-THESE CAN'T BE NULL),START,STOP,MAX,TOT,NUM,IX | 
|---|
| [1200] | 6 | ; | 
|---|
|  | 7 | ; Change Log (VW/SMH) | 
|---|
|  | 8 | ; - June 5th: Fix compilation error on GT.M. Search for *1000 | 
|---|
| [1147] | 9 | ; | 
|---|
|  | 10 | ; | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | DATA(IENS,DA,XCNT)      ;EP - ADD DATA NODES TO ARRAY | 
|---|
|  | 13 | ; ASSUMES THAT VSTG VARIABLES AND THE OUT ARRAY ARE PRESENT | 
|---|
|  | 14 | I '$G(DA) Q | 
|---|
|  | 15 | I '$L(IENS) Q | 
|---|
|  | 16 | S $P(IENS,C)=DA | 
|---|
|  | 17 | N STG,X,Y,%,FLD,STOP,VAL,CNT,FIEN,LINE,IFLAG,IDEP,TFLD,TNO,TEF | 
|---|
|  | 18 | S STG=DA | 
|---|
|  | 19 | I $G(DAS),$E(DAS,$L(DAS))="," S STG=$TR(DAS,",",U)_STG ; FIX FOR SUBFILE | 
|---|
|  | 20 | S CNT=$L(IENS,",") ; START AFTER THE .001 FIELD | 
|---|
|  | 21 | I $G(SUB) S STG=$P(IENS,C,2)_U_DA ; MAKE DAS FOR A SUBFILE.  THIS WILL BE THE IST PIECE OF THE DATA STRING | 
|---|
|  | 22 | I $G(XCNT) S CNT=XCNT ; USED WITH JOINS | 
|---|
|  | 23 | F  S CNT=$O(@OUT@(CNT)) Q:'CNT  Q:$G(STOP)  D  I @OUT@(CNT)[$C(30) Q  ; LOOP TO CREATE THE DATA STRING | 
|---|
|  | 24 | . K IFLAG,IDEP | 
|---|
|  | 25 | . S FIEN=+@OUT@(CNT) I '$D(^DD(FIEN,0)) S STOP=1 Q | 
|---|
|  | 26 | . S FLD=$P(@OUT@(CNT),B,2) | 
|---|
|  | 27 | . I FLD=".01ID" D  Q  ; PROCESS THE IDENTIFIER FIELD | 
|---|
|  | 28 | .. I '$G(SIEN) Q | 
|---|
|  | 29 | .. S %=$O(^BMXADO(SIEN,1,"B",".01ID",0)) I '% Q | 
|---|
|  | 30 | .. S IDEP=$G(^BMXADO(SIEN,1,%,1)) I '$L(IDEP) Q | 
|---|
|  | 31 | .. X ("S VAL=$$"_IDEP_"("_+STG_")") ; PASS THE DA TO THE IDENTIFIER EXTRINSIC FUNCTION, RETURN IDENTIFIERS | 
|---|
|  | 32 | .. S VAL=$TR(VAL,"^",""),VAL=$TR(VAL,B,"") | 
|---|
|  | 33 | .. S STG=STG_U_VAL | 
|---|
|  | 34 | .. Q | 
|---|
|  | 35 | . I $G(SIEN),FLD S %=$O(^BMXADO(SIEN,1,"B",FLD,0)) I %,$P($G(^BMXADO(SIEN,1,%,0)),U,9) S IFLAG=1 ; SCHEMA FILE SAYS FORCE INTERNAL VALUE FOR THIS FIELD | 
|---|
|  | 36 | . K TFLD | 
|---|
|  | 37 | . I FLD["TRIGGER" S TFLD=FLD,FLD=+FLD,IFLAG=1 | 
|---|
|  | 38 | . I FLD["IEN" S FLD=+FLD,IFLAG=1 ; LOOKUP VALUE FIELD (IEN) | 
|---|
|  | 39 | . I '$D(^DD(FIEN,FLD,0)),FLD'=.001 S STOP=1 Q | 
|---|
|  | 40 | . I $D(TFLD),FLD=.001 S VAL=+IENS | 
|---|
|  | 41 | . E  S VAL=$$GET1^DIQ(FIEN,IENS,FLD,$S($G(IFLAG):"I",$G(TFLAG):"I",1:$G(FMT))) | 
|---|
|  | 42 | . I $G(TFLD) D  S STG=STG_U_VAL Q  ; GENERATE A TRIGGERED VALUE FOR THIS FIELD | 
|---|
|  | 43 | .. S TNO=$O(^BMXADO(SIEN,1,"B",TFLD,0)) I 'TNO S VAL="" Q | 
|---|
|  | 44 | .. S TEF=$G(^BMXADO(SIEN,1,TNO,3)) I '$L(TEF) S VAL="" Q  ; GET EXTR FUNCT THAT GENERATES A SECONDARY VALUE | 
|---|
|  | 45 | .. X ("S VAL=$$"_TEF_"(VAL)") | 
|---|
|  | 46 | .. Q | 
|---|
|  | 47 | . I FLD=.01,VAL="" S STOP=1 Q  ; INVALID FILEMAN ENTRY!  SKIP IT | 
|---|
|  | 48 | . S VAL=$TR(VAL,"^",""),VAL=$TR(VAL,B,"") | 
|---|
|  | 49 | . S STG=STG_U_VAL | 
|---|
|  | 50 | . Q | 
|---|
|  | 51 | I $G(STOP) Q  ; DON'T ADD NODE IF DD INFO IS INVALID | 
|---|
|  | 52 | F  S LINE=$E(STG,1,250),STG=$E(STG,251,999999) D  I '$L(STG) Q  ; PREVENTS DATA LENGTH FROM EXCEEDING 250 BYTES | 
|---|
|  | 53 | . S TOT=TOT+1 | 
|---|
|  | 54 | . I '$L(STG) S LINE=LINE_$C(30),NUM=NUM+1 ; END OF RECORD, RECORD TOTAL IS UPDATED | 
|---|
|  | 55 | . S @OUT@(TOT)=LINE ; NODE IS ADDED | 
|---|
|  | 56 | . Q | 
|---|
|  | 57 | Q | 
|---|
|  | 58 | ; | 
|---|
|  | 59 | NUMIT(DA)       ; EP-ITERATE BY NUMBER | 
|---|
|  | 60 | N XIT,LDA | 
|---|
|  | 61 | I IENS S DA=+IENS ; RE-ENTRY FROM SEED | 
|---|
|  | 62 | I '$G(DA),$G(START) S DA=START-1 | 
|---|
|  | 63 | I '$G(DA) S DA=0 | 
|---|
|  | 64 | S LDA="" | 
|---|
|  | 65 | F  S DA=$O(@CREF@(DA)) D  I $G(XIT) Q | 
|---|
|  | 66 | . I 'DA S XIT=1,LDA="" Q  ; NO MORE IENS - THE END OF THE LINE | 
|---|
|  | 67 | . D DATA(IENS,DA,+$G(XCNT)) | 
|---|
|  | 68 | . I $G(STOP),$O(@CREF@(DA))>STOP S LDA="",XIT=1 Q  ; AS FAR AS YOU ARE ALLOWED TO GO FOR NUMBER ITERATION | 
|---|
|  | 69 | . I NUM=MAX S LDA=DA,XIT=1 Q  ; REACHED THE MAX TRANSACTION LIMIT - GET MORE NEXT TIME | 
|---|
|  | 70 | . Q | 
|---|
|  | 71 | I LDA,'$O(@CREF@(LDA)) S LDA="" ; END OF THE LINE SO SET LDA TO NULL | 
|---|
|  | 72 | Q LDA | 
|---|
|  | 73 | ; | 
|---|
|  | 74 | LOOK(LIEN)      ; EP-ITERATE BY A SINGLE STANDARD INDEX THAT IS A POINTER VALUE | 
|---|
|  | 75 | N XIT,LDA | 
|---|
|  | 76 | S DA=+IENS | 
|---|
|  | 77 | F  S DA=$O(@CREF@(IX,LIEN,DA)) D  I $G(XIT) Q | 
|---|
|  | 78 | . I 'DA S XIT=1,LDA="" Q  ; NO MORE IENS - THE END OF THE LINE | 
|---|
|  | 79 | . D DATA(IENS,DA,$G(XCNT)) | 
|---|
|  | 80 | . I NUM=MAX S LDA=DA,XIT=1 Q  ; REACHED THE MAX TRANSACTION LIMIT - GET MORE NEXT TIME | 
|---|
|  | 81 | . Q | 
|---|
|  | 82 | I '$O(@CREF@(IX,LIEN,DA)) Q "" | 
|---|
|  | 83 | Q LDA | 
|---|
|  | 84 | ; | 
|---|
|  | 85 | LOOK1() ; EP-ITERATE USING A STANDARD INDEX | 
|---|
|  | 86 | N XIT,LDA,VAL,DA,% | 
|---|
|  | 87 | S DA=+IENS I 'DA G SCRATCH ; CHECK FOR RE-RENTRY | 
|---|
|  | 88 | REENTER ; RE-ENTER STD ITERATION USING DA AS THE SEED | 
|---|
|  | 89 | S %=$$IXVAL(FIEN,IX,DAS) I '$L(%) Q "" ; GET STARTUP INFO | 
|---|
|  | 90 | LR      S VAL=$P(%,B,3) | 
|---|
|  | 91 | I VAL="" Q "" ; NO VAL FOUND FOR INITIAL ITERATION, SO QUIT | 
|---|
|  | 92 | F  S DA=$O(@CREF@(IX,VAL,DA)) Q:'DA  D DATA(IENS,DA,+$G(XCNT)) I NUM=MAX S LDA=DA,XIT=1 Q  ; SWEEP UP ALL THE REMAINING DAS UNDER THE CURRENT VALUE | 
|---|
|  | 93 | I $G(XIT) Q:'$O(@CREF@(IX,VAL,LDA)) "" Q LDA ; IF NO MORE AFTER MAX, SET LDA = NULL | 
|---|
|  | 94 | G LOOK1R ; SEED IS DEFINED | 
|---|
|  | 95 | SCRATCH S VAL="" ; STD LOOKUP STARTING FROM SCRATCH | 
|---|
|  | 96 | I $L(START) S VAL=$O(@CREF@(IX,START),-1) ; GET SEED FOR ITERATION | 
|---|
|  | 97 | LOOK1R  F  S VAL=$O(@CREF@(IX,VAL)) D  I $G(XIT) Q  ; EP - RE-ENTRY POINT IF SEED IS DEFINED | 
|---|
|  | 98 | . I VAL="" S LDA="",XIT=1 Q  ; END OF THE LINE | 
|---|
|  | 99 | . I STOP=+STOP,VAL=+VAL,VAL>STOP S LDA="",XIT=1 Q | 
|---|
|  | 100 | . I $L(STOP),VAL]STOP S LDA="",XIT=1 Q  ; LOOKUP LIMITS | 
|---|
|  | 101 | . S DA=0 | 
|---|
|  | 102 | . F  S DA=$O(@CREF@(IX,VAL,DA)) Q:'DA  D  I $G(XIT) Q | 
|---|
|  | 103 | .. D DATA(IENS,DA,+$G(XCNT)) | 
|---|
|  | 104 | .. I NUM=MAX S LDA=DA,XIT=1 D  ; TRANSACTION LIMIT ; CHECK FOR MORE | 
|---|
|  | 105 | ... I $O(@CREF@(IX,VAL,DA)) Q | 
|---|
|  | 106 | ... S %=$O(@CREF@(IX,VAL)) I %="" S LDA="" Q | 
|---|
|  | 107 | ... I $L(STOP),%]STOP S LDA="" Q | 
|---|
|  | 108 | ... I '$O(@CREF@(IX,%,0)) S LDA="" Q | 
|---|
|  | 109 | ... Q | 
|---|
|  | 110 | .. Q | 
|---|
|  | 111 | . Q | 
|---|
|  | 112 | Q LDA | 
|---|
|  | 113 | ; | 
|---|
|  | 114 | LOOK2(LFILE)    ; EP-TEXT POINTER LOOKUP | 
|---|
|  | 115 | ; CHANGE THE GLOBAL REFERENCE FOR THE LOOKUP TO THE POINTED-TO FILE BEFORE PROCEEDING | 
|---|
|  | 116 | N XIT,LDA,OREF,CREF,VAL,DA | 
|---|
|  | 117 | S OREF=$$ROOT^DILFD(LFILE,IENS) I '$L(OREF) Q "" | 
|---|
|  | 118 | S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" | 
|---|
|  | 119 | S DA=+IENS | 
|---|
|  | 120 | I '$G(DA) G SCRATCH ; START FROM SCRATCH | 
|---|
|  | 121 | S %=$$IXVAL(LFILE,IX,DAS) I '$L(%) Q "" | 
|---|
|  | 122 | G LR ; RE-ENTER | 
|---|
|  | 123 | ; | 
|---|
|  | 124 | IXVAL(FIEN,IX,DAS)      ; GIVEN A FILE IEN, INDEX NAME, AND DAS STRING, RETURN THE VALUE USED IN THE INDEX | 
|---|
|  | 125 | N DA,FLD,IENS,OREF,CREF,XREF,VAL,UP,LEV,L | 
|---|
|  | 126 | I '$D(^DD(+$G(FIEN),0)) Q "" ; MISSING OR INVALID FILE NUMBER | 
|---|
|  | 127 | I '$L($G(IX)) Q "" ; NO INDEX SPECIFIED | 
|---|
|  | 128 | S UP=FIEN F LEV=1:1 S UP=$G(^DD(UP,0,"UP")) Q:'UP | 
|---|
|  | 129 | I LEV'=$L(DAS,C) Q "" ; DAS LEVELS MUST MATCH FILE OR SUBFILE LEVEL | 
|---|
|  | 130 | S IENS=$$IENS^BMXADOV($G(DAS)) I IENS=U Q "" | 
|---|
|  | 131 | S OREF=$$ROOT^DILFD(FIEN,IENS) I '$L(OREF) Q "" | 
|---|
|  | 132 | S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" | 
|---|
|  | 133 | I '$D(@CREF@(IX)) Q CREF_"||" ; NO INDEX VALUES TO CHECK | 
|---|
|  | 134 | S XREF=OREF_IX_")" | 
|---|
|  | 135 | S DA=+IENS I 'DA Q CREF_"||" | 
|---|
|  | 136 | I '$D(@CREF@(DA)) Q CREF_"||" ; NO ENTRY EXISTS | 
|---|
| [1200] | 137 | ;I IX="AA" G AA //smh *1000: Cannot Goto to a Formal Line or Extrinsic. Change to below | 
|---|
|  | 138 | I IX="AA" Q $$AA() | 
|---|
| [1147] | 139 | S FLD=+$$IXFLD^BMXADOV(FIEN,IX) I 'FLD Q "" ; INVALID DD | 
|---|
|  | 140 | S VAL=$$GET1^DIQ(FIEN,IENS,FLD,"I") I VAL="" Q "" ; VALUE IS NULL - NOTHING TO INDEX | 
|---|
|  | 141 | I '$D(@CREF@(IX,VAL,DA)) Q "" ; INVALID INDEX | 
|---|
|  | 142 | Q XREF_B_DA_B_VAL | 
|---|
|  | 143 | ; | 
|---|
|  | 144 | AA()    ;EP - VISIT/V-FILE ITERATION USING THE 'AA' INDEX | 
|---|
|  | 145 | N LDA,XIT,AAINFO,DA,%,X,Y,DFN,TYPE,ORD,ISTART,ISTOP,IDT,AAREF,%DT,DIC | 
|---|
|  | 146 | S X=OREF_"""AA"")",%=$Q(@X) I %="" Q "" | 
|---|
|  | 147 | S TYPE="" I $L(%,C)=5 S TYPE=$P(PARAM,B,2) I TYPE="" Q "" ; FOR CERTAIN V FILES, TYPE MUST BE DEFINED | 
|---|
|  | 148 | I $E(TYPE)="`" S TYPE=$E(TYPE,2,99) I 'TYPE Q "" ; REMOVE ` FROM TYPE IEN | 
|---|
|  | 149 | I $L(TYPE),'TYPE D  I TYPE'>0 Q "" ; QUIT IF INVALID TYPE | 
|---|
|  | 150 | . S %=$P($G(^DD(FIEN,.01,0)),U,2) | 
|---|
|  | 151 | . S DIC=+$P(%,"P",2) I '$D(^DD(DIC,.01,0)) Q | 
|---|
|  | 152 | . S X=TYPE,DIC(0)="M" D ^DIC I Y=-1 Q | 
|---|
|  | 153 | . S TYPE=+Y | 
|---|
|  | 154 | . Q | 
|---|
|  | 155 | S DFN=+PARAM | 
|---|
|  | 156 | I '$D(^DPT(DFN,0)) Q "" ; PATIENT DFN MUST BE DEFINED | 
|---|
|  | 157 | I 'TYPE S AAREF=OREF_"""AA"","_DFN_")" | 
|---|
|  | 158 | E  S AAREF=OREF_"""AA"","_DFN_","_TYPE_")" | 
|---|
|  | 159 | I '$D(@AAREF) Q "" ; IF NOTHING UNDER AA INDEX, DON'T BOTHER LOOKING | 
|---|
|  | 160 | S ISTART=9999999 I START S X=START,%DT="P" D ^%DT S ISTART=9999999-Y | 
|---|
|  | 161 | S ISTOP=0 I STOP S X=STOP,%DT="P" D ^%DT S ISTOP=9999999-Y | 
|---|
|  | 162 | S ORD=-1 I $P(PARAM,B,$L(PARAM,B))="R" S ORD=1 ; SORT IN CHRONOLOGICAL OR REVERSE CHRONOLOGICAL ORDER | 
|---|
|  | 163 | I ORD=-1 S X=$G(ISTART),Y=$G(ISTOP),ISTOP=X,ISTART=Y ; CHANGES REQUIRED TO PRESENT DATA IN CHRONOLIGICAL ORDER | 
|---|
|  | 164 | S IDT=0,LDA="" | 
|---|
|  | 165 | I ISTOP S IDT=ISTOP-.0000001 | 
|---|
|  | 166 | S DA=+IENS | 
|---|
|  | 167 | I DA S IDT=$$AAR I 'IDT Q LDA ; SWEEP UP REMAINING IENS FOR CURRENT IDT AND RESET IDT FOR RE-ENTRY | 
|---|
|  | 168 | F  S IDT=$O(@AAREF@(IDT),ORD) Q:'IDT  D  I $G(XIT) Q | 
|---|
|  | 169 | . I ORD=1,IDT>ISTART S LDA="",XIT=1 Q | 
|---|
|  | 170 | . I ORD=-1,IDT<ISTART S LDA="",XIT=1 Q | 
|---|
|  | 171 | . S DA=0 | 
|---|
|  | 172 | . F  S DA=$O(@AAREF@(IDT,DA)) Q:'DA  D  I $G(XIT) Q | 
|---|
|  | 173 | .. D DATA(IENS,DA,+$G(XCNT)) | 
|---|
|  | 174 | .. I NUM=MAX S LDA=DA,XIT=1 I '$$AAMORE S LDA="" ; TRANSACTION LIMIT | 
|---|
|  | 175 | .. Q | 
|---|
|  | 176 | . Q | 
|---|
|  | 177 | Q LDA | 
|---|
|  | 178 | ; | 
|---|
|  | 179 | AAR()   ; SWEEP UP REMAINING IENS FOR CURRENT IDT AND RESET IDT FOR RE-ENTRY | 
|---|
|  | 180 | N %,X,Y,XIT | 
|---|
|  | 181 | S %=$$AAVAL(FIEN,DAS) I '$L(%) Q "" | 
|---|
|  | 182 | S IDT=$P(%,B,5) I 'IDT Q "" | 
|---|
|  | 183 | F  S DA=$O(@AAREF@(IDT,DA)) Q:'DA  D  I $G(XIT) Q | 
|---|
|  | 184 | . D DATA(IENS,DA,+$G(XCNT)) | 
|---|
|  | 185 | . I NUM=MAX S LDA=DA,IDT="",XIT="" I '$$AAMORE S LDA="" | 
|---|
|  | 186 | . Q | 
|---|
|  | 187 | Q IDT | 
|---|
|  | 188 | ; | 
|---|
|  | 189 | AAMORE()        ; RETURN A '1' IF MORE ITERATION IS POSSIBLE | 
|---|
|  | 190 | N X | 
|---|
|  | 191 | I $O(@AAREF@(IDT,DA)) Q 1 | 
|---|
|  | 192 | S X=$O(@AAREF@(IDT),ORD) I 'X Q 0 | 
|---|
|  | 193 | I $O(@AAREF@(X,0)) Q 1 | 
|---|
|  | 194 | Q 0 | 
|---|
|  | 195 | ; | 
|---|
|  | 196 | AAVAL(FIEN,DAS) ; GIVEN A FILE AND DAS, RETURN INFO NECESSARY TO RE-CREATE THE 'AA' INDEX | 
|---|
|  | 197 | N DATE,IDT,DFN,TYPE,VIEN,%,OREF,CREF,DA,IENS | 
|---|
|  | 198 | I '$D(^DD(FIEN,.01,0)) Q "" | 
|---|
|  | 199 | S IENS=$$IENS^BMXADOV($G(DAS)) I IENS=U Q "" | 
|---|
|  | 200 | S OREF=$$ROOT^DILFD(FIEN,IENS) I '$L(OREF) Q "" | 
|---|
|  | 201 | S CREF=$$CREF^DILF(OREF) I '$L(CREF) Q "" | 
|---|
|  | 202 | S DA=+IENS I '$D(@CREF@(DA)) Q "" | 
|---|
|  | 203 | I FIEN=9000010 S DFN=$P(@CREF@(DA,0),U,5),VIEN=DA | 
|---|
|  | 204 | E  S DFN=$P(@CREF@(DA,0),U,2),VIEN=$P(@CREF@(DA,0),U,3) | 
|---|
|  | 205 | I $D(^DPT(DFN,0)),$D(^AUPNVSIT(VIEN,0)) | 
|---|
|  | 206 | E  Q "" | 
|---|
|  | 207 | S DATE=+$P($G(^AUPNVSIT(VIEN,0)),U) I 'DATE Q "" | 
|---|
|  | 208 | S IDT=(9999999-(DATE\1)) | 
|---|
|  | 209 | S %=$P(DATE,".",2) I % S IDT=+(IDT_"."_%) I 'IDT Q "" | 
|---|
|  | 210 | S X=OREF_"""AA"")",%=$Q(@X) I %="" Q "" | 
|---|
|  | 211 | S TYPE="" I $L(%,C)=5 S TYPE=$P(@CREF@(DA,0),U) | 
|---|
|  | 212 | Q X_B_DA_B_DFN_B_TYPE_B_IDT | 
|---|
|  | 213 | ; | 
|---|
|  | 214 | AAP()   ;EP - ITERATOR FOR PROBLEM FILE: AA INDEX | 
|---|
|  | 215 | I '$D(^AUPNPROB("AA",+$G(START))) Q "" | 
|---|
|  | 216 | N LOC,PNUM,DFN,IEN | 
|---|
|  | 217 | S LOC=0,DFN=START | 
|---|
|  | 218 | F  S LOC=$O(^AUPNPROB("AA",DFN,LOC)) Q:'LOC  D | 
|---|
|  | 219 | . S PNUM="" | 
|---|
|  | 220 | . F  S PNUM=$O(^AUPNPROB("AA",DFN,LOC,PNUM)) Q:PNUM=""  D | 
|---|
|  | 221 | .. S IEN=0 | 
|---|
|  | 222 | .. F  S IEN=$O(^AUPNPROB("AA",DFN,LOC,PNUM,IEN)) Q:'IEN  D DATA(",",IEN,+$G(XCNT)) | 
|---|
|  | 223 | .. Q | 
|---|
|  | 224 | .Q | 
|---|
|  | 225 | Q "" | 
|---|
|  | 226 | ; | 
|---|
|  | 227 | TESTID(DA)      ; TEST IDENTIFIERS | 
|---|
|  | 228 | N %,Y,SEX | 
|---|
|  | 229 | S %=$G(^DIZ(2160010,+$G(DA),0)) I '$L(%) Q "" | 
|---|
|  | 230 | S SEX=$P(%,U,2) I '$L(SEX) S SEX="??" | 
|---|
|  | 231 | S Y=$P(%,U,3) X ^DD("DD") | 
|---|
|  | 232 | Q (SEX_"   "_Y) | 
|---|
|  | 233 | ; | 
|---|