[796] | 1 | TMGDIS0 ;TMG/kst/Custom DIS0, non-interactive SEARCH, IF STATEMENT AND MULTIPLE COMBO'S ;5/13/10 ; 5/16/10 10:01pm
|
---|
| 2 | ;;1.0;TMG-LIB;**1**;01/01/06
|
---|
| 3 | ;-----Prior header below -------------
|
---|
| 4 | ;SFISC/GFT-SEARCH, IF STATEMENT AND MULTIPLE COMBO'S ;30JAN2005
|
---|
| 5 | ;;22.0;VA FileMan;**144**;Mar 30, 1999;Build 5
|
---|
| 6 | ;
|
---|
| 7 | DIS0(TMGINFO,TMGOUT,TMGBYROOT) ;
|
---|
| 8 | ;"Purpose: Provide an API interface for the classic Fileman console search
|
---|
| 9 | ;"Input: TMGINFO -- PASS BY REFERENCE. This is pre-defined search terms. Format:
|
---|
| 10 | ;" TMGINFO("FILE") -- File name or number to be used for search
|
---|
| 11 | ;" TMGINFO(1,...) -- Search condition 1 (corresponds to 'A' in console)
|
---|
| 12 | ;" TMGINFO(2,...) -- Search condition 2 (corresponds to 'B' in console)
|
---|
| 13 | ;" TMGINFO("LOGIC-IF")=(OPTIONAL) Logic string that would be normally
|
---|
| 14 | ;" entered at 'IF: ' prompt
|
---|
| 15 | ;" e.g. "1&2", or "A&B", or "AB" <--- all the same
|
---|
| 16 | ;" Default is logic string ANDing all search terms.
|
---|
| 17 | ;" TMGINFO("LOGIC-OR",1)=(OPTIONAL) Logic string that would be normally
|
---|
| 18 | ;" entered at 'OR: ' prompt
|
---|
| 19 | ;" TMGINFO("LOGIC-OR",#)=(OPTIONAL) Logic string that would be normally
|
---|
| 20 | ;" entered at 'OR: ' prompt. #=2,3,4... For multiple
|
---|
| 21 | ;" lines of OR logic
|
---|
| 22 | ;" NOTE: Fileman console labels search terms as "A","B","C",...
|
---|
| 23 | ;" But the above numbering system uses "1","2","3",...
|
---|
| 24 | ;" When entering in logic strings, one may use either letters
|
---|
| 25 | ;" or numbers. A=1, B=2 etc. Note that Fileman allows AB to
|
---|
| 26 | ;" mean the same as A&B. This is not possible with numbers.
|
---|
| 27 | ;" ...
|
---|
| 28 | ;" --DETAILS ON SEARCH CONDITION----
|
---|
| 29 | ;" TMGINFO(n,"FLD") -- The Fileman field name or number to seach in
|
---|
| 30 | ;" TMGINFO(n,"COND") -- The condition: "=,>,<,[,?,NULL" Prefix ' or - to negate
|
---|
| 31 | ;" TMGINFO(n,"VALUE") -- the value to search for
|
---|
| 32 | ;" TMGOUT --An OUT PARAMETER. Prior values killed. Format:
|
---|
| 33 | ;" TMGOUT(FILENUM,IEN)=""
|
---|
| 34 | ;" TMGOUT(FILENUM,IEN)=""
|
---|
| 35 | ;" TMGOUT(FILENUM,IEN)=""
|
---|
| 36 | ;" TMGBYROOT -- (Optional) If 1, then TMGOUT is treated as a variable NAME (root)
|
---|
| 37 | ;" i.e. @TMGOUT@(FILENUM,IEN)=""
|
---|
| 38 | ;"Globally-Scoped variables uses: O,DC,DA (and probably others)
|
---|
| 39 | ;"Results: 1 if OK, or -1^Error Message
|
---|
| 40 | ;
|
---|
| 41 | ;"WRITE !
|
---|
| 42 | NEW TMGRESULT SET TMGRESULT=1 ;"Default to success
|
---|
| 43 | NEW R,N,DL,DE,DJ ;"WAS KILL initially
|
---|
| 44 | NEW P,LOGIC,NLOG
|
---|
| 45 | NEW DU
|
---|
| 46 | SET O=0
|
---|
| 47 | SET E=$DATA(DC(2)) ;"E>0 IF MORE THAN ONE SRCH TERM
|
---|
| 48 | SET N="IF: A// "
|
---|
| 49 | SET DE=$SELECT(E:"IF: ",1:N)
|
---|
| 50 | NEW TMGLMODE SET TMGLMODE=1 ;"1="LOGIC-IF" 2=LOGIC-OR
|
---|
| 51 | NEW TMGLORN SET TMGLORN=0 ;"Logic OR line number
|
---|
| 52 | SET DL=0
|
---|
| 53 | SET C=","
|
---|
| 54 | R ;"WRITE !,DE
|
---|
| 55 | KILL DV
|
---|
| 56 | IF TMGLMODE=1 DO
|
---|
| 57 | . SET X=$GET(INFO("LOGIC-IF"))
|
---|
| 58 | . IF X'="" QUIT
|
---|
| 59 | . NEW I SET I=0
|
---|
| 60 | . FOR SET I=$ORDER(INFO(I)) QUIT:+I'>0 SET X=X_$CHAR(I+64)
|
---|
| 61 | . SET INFO("LOGIC-IF")=X
|
---|
| 62 | ELSE DO
|
---|
| 63 | . SET TMGLORN=TMGLORN+1
|
---|
| 64 | . SET X=$GET(INFO("LOGIC-OR",TMGLORN))
|
---|
| 65 | IF X'="" GOTO R2
|
---|
| 66 | ;"READ X:DTIME SET:'$T DTOUT=1 GOTO Q:X[U!'$T
|
---|
| 67 | SET DV=1,DU=X
|
---|
| 68 | GOTO 1:DL
|
---|
| 69 | SET DQ="TYPE '^' TO EXIT"
|
---|
| 70 | SET Y="^1^"
|
---|
| 71 | SET DL=1
|
---|
| 72 | ;"GOTO BAD:E
|
---|
| 73 | IF E="" DO GOTO TMGDONE
|
---|
| 74 | . SET TMGRESULT="-1^Bad/absent logic string."
|
---|
| 75 | DO ASKQ(.DC,.DV,.DU)
|
---|
| 76 | GOTO L
|
---|
| 77 | ;
|
---|
| 78 | R2 SET Y=U,P=0,DU="",D=""
|
---|
| 79 | SET DL=DL+1
|
---|
| 80 | P ;"PARSE LOGIC STRING
|
---|
| 81 | SET LOGIC=X,LOGN=0
|
---|
| 82 | FOR QUIT:(LOGIC="")!(+TMGRESULT=-1) DO
|
---|
| 83 | . SET DV=0
|
---|
| 84 | . IF +LOGIC>0 DO
|
---|
| 85 | . . SET (DV,DQ)=+LOGIC
|
---|
| 86 | . . SET LOGIC=$EXTRACT($LENGTH(DQ)+1,9999)
|
---|
| 87 | . ELSE DO
|
---|
| 88 | . . SET DQ=$EXTRACT(LOGIC,1)
|
---|
| 89 | . . SET LOGIC=$EXTRACT(LOGIC,2,9999)
|
---|
| 90 | . . IF DQ?.A SET DV=$ASCII(DQ)-64
|
---|
| 91 | . IF (DV>0)&($DATA(DC(DV))>0) DO QUIT
|
---|
| 92 | . . SET LOGN=LOGN+1
|
---|
| 93 | . . DO ASKQ(.DC,.DV,.DU)
|
---|
| 94 | . . SET TMGRESULT=$$CHK(DV)
|
---|
| 95 | . IF "&+ "[DQ QUIT
|
---|
| 96 | . IF ((DU="")&("'-"[DQ)) SET DU="'" QUIT
|
---|
| 97 | . SET TMGRESULT="-1^Bad entry '"_DQ_"' found in logic phrase '"_X_"'"
|
---|
| 98 | IF LOGN'>0 SET TMGRESULT="-1^No valid logic terms found in '"_X_"'"
|
---|
| 99 | IF +TMGRESULT=-1 GOTO TMGDONE
|
---|
| 100 | GOTO L
|
---|
| 101 | ;
|
---|
| 102 | ;"BAD DO
|
---|
| 103 | ;" . IF DQ?."?" DO QUIT
|
---|
| 104 | ;" . . DO BLD^DIALOG($SELECT($DATA(DC(2)):8004.2,1:8004.1))
|
---|
| 105 | ;" . . DO MSG^DIALOG("WH") ;HELP depending on whether there is a CONDITION B
|
---|
| 106 | ;" . WRITE " <",DQ,">??"
|
---|
| 107 | ;" WRITE !!
|
---|
| 108 | ;" KILL DJ(DL),DE(DL)
|
---|
| 109 | ;" SET DL=DL-1
|
---|
| 110 | ;" GOTO R
|
---|
| 111 | ;
|
---|
| 112 | ASKQ(DC,DV,DU) ;"-------------
|
---|
| 113 | NEW J,%,I
|
---|
| 114 | SET J=DC(DV)
|
---|
| 115 | SET %=J["?."" """
|
---|
| 116 | SET I=J["^'"+(DU["'")#2
|
---|
| 117 | IF J["W^" DO QUIT
|
---|
| 118 | . SET DV(DV)=$SELECT(I:2-%,1:%+%+1)
|
---|
| 119 | . IF % SET DC(DV)=$EXTRACT(J,1,$LENGTH(J)-5)_"="""""
|
---|
| 120 | IF $PIECE(J,U)[C SET DV(DV)=J?.E1",.01^".E&%+(I+%#2)
|
---|
| 121 | QUIT
|
---|
| 122 | ;
|
---|
| 123 | CHK(DV) ;Check search term
|
---|
| 124 | ;"Result: 1 if OK, -1^ErrorMessage
|
---|
| 125 | NEW %
|
---|
| 126 | NEW RSLT SET RSLT=1 ;"Default to success
|
---|
| 127 | SET %=$F(Y,U_DV)
|
---|
| 128 | IF % DO GOTO CKDN ;"Was BAD
|
---|
| 129 | . SET %=$PIECE($EXTRACT(Y,%),U,1)'=DU
|
---|
| 130 | . SET DQ=""""_DQ_""" AND """_$EXTRACT("'",%)_DQ_""" IS "_$PIECE("REDUNDANT^CONTRADICTORY",U,%+1)
|
---|
| 131 | . SET RSLT="-1^"_DQ
|
---|
| 132 | SET %=1
|
---|
| 133 | SET Y=Y_DV_DU_U
|
---|
| 134 | SET DU=""
|
---|
| 135 | SET J=$PIECE(DC(DV),U,1)
|
---|
| 136 | IF J'[C GOTO CKDN ;"WAS P
|
---|
| 137 | FOR Z=2:1 IF $PIECE(J,C,Z,99)'[C SET J=$PIECE(J,C,1,Z-1)_C QUIT
|
---|
| 138 | IF J=D DO
|
---|
| 139 | . DO SAMEQ ;"result in %
|
---|
| 140 | . IF %=1 SET DJ(DL,DV)=DX(DV)
|
---|
| 141 | SET D=J,DJ=DV
|
---|
| 142 | ;"IF %>0 GOTO P
|
---|
| 143 | IF %'>0 DO GOTO CKDN
|
---|
| 144 | . SET RSLT="-1^Error checking search term #"_DV
|
---|
| 145 | CKDN QUIT RSLT
|
---|
| 146 | ;"Q GOTO Q^DIS2
|
---|
| 147 | ;
|
---|
| 148 | SAMEQ ;----
|
---|
| 149 | IF (J<0),$PIECE(DY(-J),U,3)="" QUIT
|
---|
| 150 | ;"NOTE!!!: Answer to question below FORCED TO BE 'YES' FOR NOW. Later figure how to specify in INFO array
|
---|
| 151 | ;"WRITE !?8,"CONDITION -"_$C(DV+64)_"- WILL APPLY TO THE SAME MULTIPLE AS CONDITION -"_$C(DJ+64)_"-",!?8,"...OK"
|
---|
| 152 | ;"DO YN^DICN
|
---|
| 153 | SET %=1 ;"FORCE 'YES' answer
|
---|
| 154 | QUIT
|
---|
| 155 | ;
|
---|
| 156 | ;-----------------
|
---|
| 157 | L SET P=O
|
---|
| 158 | SET DL(DL)=Y
|
---|
| 159 | SET DE="OR: "
|
---|
| 160 | SET TMGLMODE=2 ;"OR mode
|
---|
| 161 | FOR %=2:1 SET X=$PIECE(Y,U,%) QUIT:X="" DO
|
---|
| 162 | . SET O=O+1
|
---|
| 163 | . NEW S SET S=$SELECT($DATA(DJ(DL,+X)):" together with ",1:" and ")
|
---|
| 164 | . SET ^UTILITY($J,O,0)=$SELECT(%>2:S,O=1:"",1:" Or ")_$PIECE("not ",U,X["'")_O(+X)
|
---|
| 165 | ;"WRITE:$X>18 !
|
---|
| 166 | ;"WRITE " "
|
---|
| 167 | ;"FOR %=P+1:1 Q:'$DATA(^UTILITY($J,%,0)) DO
|
---|
| 168 | ;". SET X=^(0)
|
---|
| 169 | ;". IF $LENGTH(X)+$X>77 WRITE !?13
|
---|
| 170 | ;". WRITE " "_$PIECE(X,U)
|
---|
| 171 | ;". IF $PIECE(X,U,2)'="" WRITE " ("_$PIECE(X,U,2)_")"
|
---|
| 172 | SET DV=0
|
---|
| 173 | DV SET DV=$ORDER(DV(DV))
|
---|
| 174 | IF DV="" SET DV=-1
|
---|
| 175 | ;"GOTO:DV'>0 R:E,1
|
---|
| 176 | IF (DV'>0)&E GOTO R ;"Go back and ask for OR" logic phrase
|
---|
| 177 | IF (DV'>0) GOTO 1
|
---|
| 178 | IF $DATA(DJ(DL,DV)) GOTO DV
|
---|
| 179 | SET I=$PIECE(DC(DV),U,1),D=DK,DN=0
|
---|
| 180 | SET Y="DO YOU WANT THIS SEARCH SPECIFICATION TO BE CONSIDERED TRUE FOR CONDITION -"_$C(DV+64)_"-"
|
---|
| 181 | G SET DN=DN+1
|
---|
| 182 | SET P=$PIECE(I,C,1)
|
---|
| 183 | SET I=$PIECE(I,C,2,99)
|
---|
| 184 | IF P["W" GOTO W
|
---|
| 185 | IF I="" GOTO DV
|
---|
| 186 | IF P<0 DO GOTO G:'$PIECE(J,U,3)
|
---|
| 187 | . SET J=DY(-P)
|
---|
| 188 | . SET D=+J
|
---|
| 189 | . SET R=" '"_$PIECE(^DIC(D,0),U,1)_"' ENTRIES "
|
---|
| 190 | ELSE DO
|
---|
| 191 | . SET D=+$PIECE(^DD(D,P,0),U,2),R=" '"_$ORDER(^DD(D,0,"NM",0))_"' MULTIPLES "
|
---|
| 192 | HOW ;
|
---|
| 193 | ;"NOTE!!! -- I am forcing answers to be the default ones for now. Later figure out how to
|
---|
| 194 | ;" specify pre-defined answers in the INFO array
|
---|
| 195 | ;"
|
---|
| 196 | ;"WRITE !!,Y,!?8,"1) WHEN AT LEAST ONE OF THE"_R_"SATISFIES IT"
|
---|
| 197 | ;"WRITE !?8,"2) WHEN ALL OF THE"_R_"SATISFY IT" SET X=2
|
---|
| 198 | ;"IF DV(DV) DO
|
---|
| 199 | ;". WRITE !?8,"3) WHEN ALL OF THE"_R_"SATISFY IT,",!?16,"OR WHEN THERE ARE NO"_R
|
---|
| 200 | ;". SET X=3
|
---|
| 201 | ;"WRITE !?4,"CHOOSE 1-"_X_": "
|
---|
| 202 | IF DV(DV)>1 DO
|
---|
| 203 | . ;"WRITE 3
|
---|
| 204 | . SET %1=3
|
---|
| 205 | ELSE DO
|
---|
| 206 | . ;"WRITE 1
|
---|
| 207 | . SET %1=1
|
---|
| 208 | ;"READ "// ",%:DTIME,!
|
---|
| 209 | ;"SET:'$T DTOUT=1 SET:%="" %=%1
|
---|
| 210 | SET %=%1 ;"//KT
|
---|
| 211 | KILL %1
|
---|
| 212 | ;"GOTO Q:%=U!'$T
|
---|
| 213 | ;"GOTO HOW:%>X!'%
|
---|
| 214 | IF %>1 DO
|
---|
| 215 | . SET DE(DL,DV,DN)=%
|
---|
| 216 | . SET O=O+1
|
---|
| 217 | . SET ^UTILITY($J,O,0)=" for all"_R_$PIECE(", or when no"_R_"exist",U,%>2)
|
---|
| 218 | GOTO G
|
---|
| 219 | ;
|
---|
| 220 | W IF DV(DV)-2 DO GOTO DV
|
---|
| 221 | . SET DE(DL,DV,DN)=DV(DV)
|
---|
| 222 | ;"NOTE!!! I am setting the answer to the question below to the default value.
|
---|
| 223 | ;" Later figure out how to pass predefined answer in INFO array from programmer
|
---|
| 224 | ;"WRITE !!,Y,!?7,"WHEN THERE IS NO '"_$PIECE(^DD(D,+P,0),U,1)_"' TEXT AT ALL"
|
---|
| 225 | SET %=1
|
---|
| 226 | ;"DO YN^DICN
|
---|
| 227 | ;"GOTO Q:%<0
|
---|
| 228 | ;"GOTO W:'%
|
---|
| 229 | SET DE(DL,DV,DN)=4-%
|
---|
| 230 | GOTO DV
|
---|
| 231 | ;
|
---|
| 232 | 1 KILL DX,Y ;"removed O from kill
|
---|
| 233 | DO DIS1^TMGDIS1 ;"Sets TMGRESULT, WAS GOTO ^DIS1
|
---|
| 234 | GOTO TMGDONE
|
---|
| 235 | ;
|
---|
| 236 | TMGDONE ;
|
---|
| 237 | QUIT
|
---|