| 1 | TMGDIS  ;TMG/kst/Custom version of DIS ;03/25/06 ; 5/19/10 1:16pm
 | 
|---|
| 2 |         ;;1.0;TMG-LIB;**1**;01/01/06
 | 
|---|
| 3 |         ;"-------Prior header below --------------- 
 | 
|---|
| 4 |         ;"SFISC/GFT-GATHER SEARCH CRITERIA ;05:52 PM  27 Mar 2002
 | 
|---|
| 5 |         ;";22.0;VA FileMan;**6,97**;Mar 30, 1999
 | 
|---|
| 6 |         ;"Purpose: to GATHER SEARCH CRITERIA
 | 
|---|
| 7 |         ;
 | 
|---|
| 8 |         ;"------Also includes code from DIS2, with header as below.
 | 
|---|
| 9 | DIS2    ;SFISC/GFT-SEARCH, TEMPLATES & COMPUTED FIELDS;4JUN2005
 | 
|---|
| 10 |         ;;22.0;VA FileMan;**6,144**;Mar 30, 1999;Build 5        
 | 
|---|
| 11 |         ;"
 | 
|---|
| 12 |         ;"NOTE: The following code was just to the point of working when I found a better
 | 
|---|
| 13 |         ;"      way to do this via the new LIST^DIC.  So I am going to stop work on this code.
 | 
|---|
| 14 | SRCH(TMGINFO,TMGOUT) ;
 | 
|---|
| 15 |         ;"Purpose: Provide an API interface for the classic Fileman console search
 | 
|---|
| 16 |         ;"Input: TMGINFO -- PASS BY REFERENCE.  This is pre-defined search terms.  Format:
 | 
|---|
| 17 |         ;"           TMGINFO("FILE") -- File name or number to be used for search
 | 
|---|
| 18 |         ;"                          If name is supplied, will be converted to IEN^NAME
 | 
|---|
| 19 |         ;"           TMGINFO(1,...) -- Search condition 1 (corresponds to 'A' in console)
 | 
|---|
| 20 |         ;"           TMGINFO(2,...) -- Search condition 2 (corresponds to 'B' in console) 
 | 
|---|
| 21 |         ;"           TMGINFO("LOGIC-IF")=(OPTIONAL) Logic string that would be normally
 | 
|---|
| 22 |         ;"                                 entered at 'IF: ' prompt
 | 
|---|
| 23 |         ;"                                 e.g. "1&2", "A&B", "A+B", or "AB" <--- all the same
 | 
|---|
| 24 |         ;"                                 Default is logic string ANDing all search terms.        
 | 
|---|
| 25 |         ;"           TMGINFO("LOGIC-OR",1)=(OPTIONAL) Logic string that would be normally 
 | 
|---|
| 26 |         ;"                                 entered at 'OR: ' prompt
 | 
|---|
| 27 |         ;"           TMGINFO("LOGIC-OR",#)=(OPTIONAL) Logic string that would be normally 
 | 
|---|
| 28 |         ;"                                 entered at 'OR: ' prompt.  #=2,3,4... For multiple
 | 
|---|
| 29 |         ;"                                 lines of OR logic
 | 
|---|
| 30 |         ;"                 NOTE: Fileman console labels search terms as "A","B","C",...
 | 
|---|
| 31 |         ;"                       But the above numbering system uses "1","2","3",...
 | 
|---|
| 32 |         ;"                       When entering in logic strings, one may use either letters
 | 
|---|
| 33 |         ;"                       or numbers. A=1, B=2 etc.  Note that Fileman allows AB to
 | 
|---|
| 34 |         ;"                       mean the same as A&B.  This is not possible with numbers.
 | 
|---|
| 35 |         ;"           --------------------------
 | 
|---|
| 36 |         ;"           TMGINFO("SORT IEN")=MyIEN (OPTIONAL) -- If provided, then IEN must point
 | 
|---|
| 37 |         ;"                  to an existing SORT TEMPLATE that will be used to store the output
 | 
|---|
| 38 |         ;"                  search into.  Any preexisting data in record will be deleated.
 | 
|---|
| 39 |         ;"           --------------------------
 | 
|---|
| 40 |         ;"           TMGINFO("PRE-SET",  -- (Optional) PASS BY REFERENCE.  If provided, then only 
 | 
|---|
| 41 |         ;"                  the IEN's provided will be used for further searching.  This will 
 | 
|---|
| 42 |         ;"                  allow this function to be call successively, further narrowing a 
 | 
|---|
| 43 |         ;"                  search.  The results of a prior run can be passed back in. Format:
 | 
|---|
| 44 |         ;"                  TMGINFO("PRE-SET",Filenum,IEN)=""
 | 
|---|
| 45 |         ;"                  TMGINFO("PRE-SET",Filenum,IEN)=""        
 | 
|---|
| 46 |         ;"                  -or-
 | 
|---|
| 47 |         ;"                  TMGINFO("PRE-SET","ROOT",Filenum)=NameOfVariableHoldingSet.  Var must have format:
 | 
|---|
| 48 |         ;"                      Varname(IEN)=""
 | 
|---|
| 49 |         ;"           --------------------------
 | 
|---|
| 50 |         ;"           TMGINFO("BYROOT")=1  (Optional)  If 1, then TMGOUT is treated as a variable NAME (root)
 | 
|---|
| 51 |         ;"                             i.e. @TMGOUT@(FILENUM,IEN)=""
 | 
|---|
| 52 |         ;"           --------------------------
 | 
|---|
| 53 |         ;"           ...
 | 
|---|
| 54 |         ;"           --DETAILS ON SEARCH CONDITION----
 | 
|---|
| 55 |         ;"           TMGINFO(n,"FLD") -- The Fileman field name or number to seach in
 | 
|---|
| 56 |         ;"           TMGINFO(n,"COND") -- The condition: "=,>,<,[,?,NULL"  Prefix ' or - to negate
 | 
|---|
| 57 |         ;"           TMGINFO(n,"VALUE") -- the value to search for
 | 
|---|
| 58 |         ;"         *Alternative Syntax* 
 | 
|---|
| 59 |         ;"           TMGINFO(n)=Fld^Cond^Value  If this is found, it will be used to fill in fields above.
 | 
|---|
| 60 |         ;"       TMGOUT --An OUT PARAMETER.  Fill with results of search.  Prior values killed.  Format:
 | 
|---|
| 61 |         ;"          TMGOUT(FILENUM,IEN)=""
 | 
|---|
| 62 |         ;"          TMGOUT(FILENUM,IEN)=""     
 | 
|---|
| 63 |         ;"       or @TMGOUT@(FILENUM,IEN)=""  if BYROOT=1 (see above)
 | 
|---|
| 64 |         ;"Results: 1 if OK, or -1^Error Message
 | 
|---|
| 65 |         ;
 | 
|---|
| 66 |         NEW TMGSORTT SET TMGSORTT=0 ;"Will store IEN of SORT TEMPLATE used for output
 | 
|---|
| 67 |         NEW TMGRESULT SET TMGRESULT=$$PREPTMPL(.TMGINFO)
 | 
|---|
| 68 |         IF +TMGRESULT=-1 GOTO SRCHDN
 | 
|---|
| 69 |         NEW TMGBYROOT SET TMGBYROOT=+$GET(TMGINFO("BYROOT")) 
 | 
|---|
| 70 |         IF TMGSORTT'>0 DO  GOTO SRCHDN
 | 
|---|
| 71 |         . SET TMGRESULT="-1^Unable to prepair a SORT template for use."
 | 
|---|
| 72 |         IF +TMGRESULT=-1 GOTO SRCHDN  
 | 
|---|
| 73 |         NEW TMGFILE SET TMGFILE=+$GET(TMGINFO("FILE"))        
 | 
|---|
| 74 |         NEW ROOT
 | 
|---|
| 75 |         IF $DATA(TMGINFO("PRE-SET",TMGFILE)) DO
 | 
|---|
| 76 |         . SET ROOT=$GET(TMGINFO("PRE-SET","ROOT",TMGFILE)) QUIT:ROOT'=""
 | 
|---|
| 77 |         . SET ROOT=$NAME(TMGINFO("PRE-SET",TMGFILE))
 | 
|---|
| 78 |         ELSE  DO
 | 
|---|
| 79 |         . SET ROOT=$GET(^DIC(TMGFILE,0,"GL"))
 | 
|---|
| 80 |         . IF ROOT="" SET TMGRESULT="-1^Unable to get global root for file '"_TMGFILE_"'"
 | 
|---|
| 81 |         . SET ROOT=$$CREF^DILF(ROOT)
 | 
|---|
| 82 |         NEW DIS 
 | 
|---|
| 83 |         MERGE DIS=^DIBT(+TMGSORTT,"DIS")
 | 
|---|
| 84 |         IF $DATA(DIS(0))=0 DO  GOTO SRCHDN
 | 
|---|
| 85 |         . SET TMGRESULT="-1^Unable to find screening code in SORT template"
 | 
|---|
| 86 |         NEW RSLTROOT
 | 
|---|
| 87 |         IF TMGBYROOT SET RSLTROOT=TMGOUT
 | 
|---|
| 88 |         ELSE  SET RSLTROOT="TMGOUT"
 | 
|---|
| 89 |         KILL @RSLTROOT
 | 
|---|
| 90 |         NEW D0 SET D0=0  ;"D0 is IEN used in DIS code.
 | 
|---|
| 91 |         FOR  SET D0=$ORDER(@ROOT@(D0)) QUIT:(+D0'>0)  DO
 | 
|---|
| 92 |         . XECUTE DIS(0)
 | 
|---|
| 93 |         . IF $TEST SET @RSLTROOT@(TMGFILE,D0)=""
 | 
|---|
| 94 | SRCHDN  IF TMGSORTT>0 DO
 | 
|---|
| 95 |         . IF TMGSORTT=$GET(TMGINFO("SORT IEN")) QUIT  ;"Don't delete if specified by user
 | 
|---|
| 96 |         . ;"IF $$DELTEMPL^TMGDIS2(TMGSORTT)>0 QUIT
 | 
|---|
| 97 |         . ;"SET TMGRESULT="-1^Unable to delete SORT TEMPLATE #"_TMGSORTT
 | 
|---|
| 98 |         QUIT TMGRESULT
 | 
|---|
| 99 |         ;
 | 
|---|
| 100 |         ;
 | 
|---|
| 101 | PREPTMPL(TMGINFO)
 | 
|---|
| 102 |         ;"PURPOSE: Prepair a SORT TEMPLATE that will be used for doing the actual search.
 | 
|---|
| 103 |         ;"         Note: This code used to extend into DIP* code where the actual search would be done.
 | 
|---|
| 104 |         ;"               But it has been repurposed.
 | 
|---|
| 105 |         ;"Input: TMGINFO -- See documentation above.
 | 
|---|
| 106 |         ;"Output: TMGSORTT should be set to the IEN of the SORT TEMPLATE that contains the searching code.
 | 
|---|
| 107 |         ;"Results: 1 if OK, or -1^Message if error
 | 
|---|
| 108 |         ;
 | 
|---|
| 109 |         NEW DC ;"Variable DC stores coded search values
 | 
|---|
| 110 |               ;"Example:
 | 
|---|
| 111 |              ;"DC(1)="14,.01^=105" <-- field 14, sub field .01 '=' IEN 105 (in pointed to file)
 | 
|---|
| 112 |             ;"DC(2)="14,2^=44"    <-- field 14, sub field 2 '=' IEN 44 (in pointed to file)
 | 
|---|
| 113 |            ;"
 | 
|---|
| 114 |           ;"Example
 | 
|---|
| 115 |          ;"DC(1)="14,-1^[""ACETA"""  <-- field 14 is a multiple, '-' --> ?  1 is field '[' ACETA
 | 
|---|
| 116 |         ;"DC(2)="14,-2^[""%"""      <-- field 14 is a multiple, '-' --> ?  2 is field '[' %
 | 
|---|
| 117 |         ;"
 | 
|---|
| 118 |         ;"Example
 | 
|---|
| 119 |         ;"DC=6
 | 
|---|
| 120 |         ;"DC(1) = 14,.01^=105   <-- field 14, sub field .01 '=' IEN 105 (in pointed to file)
 | 
|---|
| 121 |         ;"DC(2) = 14,-2^["%"    <-- field 14 is a multiple, '-' --> ?  2 is field '[' %
 | 
|---|
| 122 |         ;"              note field 2 is a pointer, so perhaps '-' means non-exact match
 | 
|---|
| 123 |         ;"DC(3) = 14,1^["1"     <-- field 14 is a multiple, 1 is field '[' ACETA
 | 
|---|
| 124 |         ;"              note field 1 is free text, so perhaps '-' not needed
 | 
|---|
| 125 |         ;"DC(4) = 1^=211        <-- field 1 '=' IEN 211
 | 
|---|
| 126 |         ;"DC(5) = .01^["A"      <-- field .01 '[' A
 | 
|---|
| 127 |         ;"Values of O with above example
 | 
|---|
| 128 |         ;"O=0
 | 
|---|
| 129 |         ;"O(1) = VA PRODUCT ACTIVE INGREDIENTS EQUALS 105^ACETAMINOPHEN
 | 
|---|
| 130 |         ;"O(2) = VA PRODUCT UNITS CONTAINS "%"
 | 
|---|
| 131 |         ;"O(3) = VA PRODUCT STRENGTH CONTAINS "1"
 | 
|---|
| 132 |         ;"O(4) = DOSAGE FORM EQUALS 211^BAG
 | 
|---|
| 133 |         ;"O(5) = NAME CONTAINS "A"
 | 
|---|
| 134 |         NEW DIS,%ZIS
 | 
|---|
| 135 |         NEW O   ;"('Oh', not 'zero')  Stores file & field names and values to search FOR
 | 
|---|
| 136 |                ;"Example:
 | 
|---|
| 137 |               ;"O=0
 | 
|---|
| 138 |              ;"O(1) = VA PRODUCT ACTIVE INGREDIENTS CONTAINS (case-insensitive) "ACETAMINOPHEN"
 | 
|---|
| 139 |             ;"O(2) = VA PRODUCT ACTIVE INGREDIENTS CONTAINS (case-insensitive) "CAFF"
 | 
|---|
| 140 |            ;"O(3) = VA GENERIC NAME CONTAINS "A"
 | 
|---|
| 141 |           ;"Note:
 | 
|---|
| 142 |          ;"  Each node (i.e. (1),(2) etc) contains a separate search item.
 | 
|---|
| 143 |         ;"
 | 
|---|
| 144 |         ;"Another example
 | 
|---|
| 145 |         ;"O="EQUALS"
 | 
|---|
| 146 |         ;"O(1)="VA PRODUCT ACTIVE INGREDIENTS EQUALS 105^ACETAMINOPHEN"
 | 
|---|
| 147 |         ;"O(2)="VA PRODUCT UNITS EQUALS 44^%"
 | 
|---|
| 148 |         ;"
 | 
|---|
| 149 |         ;"Note:
 | 
|---|
| 150 |         ;"  In above examples,
 | 
|---|
| 151 |         ;"     O(1) --> VA PRODUCT is file name, ACTIVE INGREDIENTS is .01 field
 | 
|---|
| 152 |         ;"              of ACTIVE INGREDIENTS multiple
 | 
|---|
| 153 |         ;"              105 is IEN of ACETAMINOPHEN
 | 
|---|
| 154 |         ;"              EQUALS is chosen comparator
 | 
|---|
| 155 |         ;"     O(2)--> VA PRODUCT is file name, UNITS is field 2 of ACTIVE INGREDIENTS multiple
 | 
|---|
| 156 |         ;"              44 is IEN of unit '%'
 | 
|---|
| 157 |         ;"              EQUALS is chosen comparator
 | 
|---|
| 158 |         ;"  The value in O (e.g. 'EQUALS') is later killed, so not used in actual search.
 | 
|---|
| 159 |  
 | 
|---|
| 160 |         NEW N,P,C,I,J,Q
 | 
|---|
| 161 |         NEW R  ;"stores root of file being searched
 | 
|---|
| 162 |         NEW E  ;"stores field type codes (piece 2 of 0 node)
 | 
|---|
| 163 |         NEW Z  ;"pointers or SET data (piece 3 of 0 note)
 | 
|---|
| 164 |         NEW DIC,X,Y
 | 
|---|
| 165 |         NEW DL ;"DL=indent amount from left margin.
 | 
|---|
| 166 |         NEW DC ;"DC=search element i.e. 1=A,2=B,3=C etc.
 | 
|---|
| 167 |         NEW DU ;"DU = field number
 | 
|---|
| 168 |         NEW DA,DI,DV,DX,DY,DTOUT,DK
 | 
|---|
| 169 |         NEW DICMX,DICOMP
 | 
|---|
| 170 |         NEW TMGSAVX
 | 
|---|
| 171 |         NEW TMGRESULT SET TMGRESULT=1  ;"Default to success
 | 
|---|
| 172 |         SET DIC=1
 | 
|---|
| 173 |         SET X=+$GET(TMGINFO("FILE"))
 | 
|---|
| 174 |         DO ^DIC
 | 
|---|
| 175 |         IF Y=-1 DO  GOTO PREPDN
 | 
|---|
| 176 |         . SET TMGRESULT="-1^File '"_X_"' is not valid."
 | 
|---|
| 177 |         SET DIC=+Y
 | 
|---|
| 178 |         set TMGINFO("FILE")=Y
 | 
|---|
| 179 |         NEW TMGFILE SET TMGFILE=Y
 | 
|---|
| 180 |         DO  ;"Parse syntax of all in one line into separate fields
 | 
|---|
| 181 |         . NEW I SET I=0
 | 
|---|
| 182 |         . FOR  SET I=$ORDER(INFO(I)) QUIT:(+I'>0)!(+TMGRESULT=-1)  DO
 | 
|---|
| 183 |         . . NEW S SET S=$GET(INFO(I)) QUIT:S=""
 | 
|---|
| 184 |         . . NEW TEMPL SET TEMPL="FLD^COND^VALUE"        
 | 
|---|
| 185 |         . . NEW J FOR J=1:1:3 DO
 | 
|---|
| 186 |         . . . NEW LABL SET LABL=$PIECE(TEMPL,"^",J)
 | 
|---|
| 187 |         . . . NEW F1 SET F1=$PIECE(S,"^",J)
 | 
|---|
| 188 |         . . . IF $DATA(INFO(I,LABL)),$GET(INFO(I,LABL))'=F1 DO  QUIT
 | 
|---|
| 189 |         . . . . SET TMGRESULT="-1^Conflicting "_LABL_" information for term #"_I
 | 
|---|
| 190 |         . . . SET INFO(I,LABL)=F1
 | 
|---|
| 191 |         . . IF +TMGRESULT'=-1 SET INFO(I)=""
 | 
|---|
| 192 |         IF +TMGRESULT=-1 GOTO PREPDN
 | 
|---|
| 193 | EN      ;
 | 
|---|
| 194 |         IF DIC SET DIC=$G(^DIC(DIC,0,"GL"))
 | 
|---|
| 195 |         IF DIC="" DO  GOTO PREPDN
 | 
|---|
| 196 |         . SET TMGRESULT="-1^File '"_TMGFILE_"' is not valid."
 | 
|---|
| 197 |         KILL DI,DX,DY,I,J,DL,DC,DA,DTOUT,^UTILITY($J)
 | 
|---|
| 198 |         IF '$DATA(@(DIC_"0)")) DO  GOTO PREPDN
 | 
|---|
| 199 |         . SET TMGRESULT="-1^File '"_TMGFILE_"' is missing its global."
 | 
|---|
| 200 |         SET (R,DI,I(0))=DIC
 | 
|---|
| 201 |         SET DL=1  ;"DL=indent amount from left margin.
 | 
|---|
| 202 |         SET DC=1  ;"DC=search element i.e. 1=A,2=B,3=C etc.
 | 
|---|
| 203 |         SET DY=999
 | 
|---|
| 204 |         SET N=0
 | 
|---|
| 205 |         SET Q=""""
 | 
|---|
| 206 |         SET DV=""
 | 
|---|
| 207 | R       ;
 | 
|---|
| 208 |         ;"SET J(N) and DK<--file NUMBER, R<--file NAME
 | 
|---|
| 209 |         IF +R=R DO
 | 
|---|
| 210 |         . SET (J(N),DK)=R
 | 
|---|
| 211 |         . SET R=""
 | 
|---|
| 212 |         ELSE  DO
 | 
|---|
| 213 |         . SET @("(J(N),DK)=+$PIECE("_R_"0),U,2)")
 | 
|---|
| 214 |         . SET R=$PIECE(^(0),U)
 | 
|---|
| 215 |         ;
 | 
|---|
| 216 | F       ;=== Get next field===
 | 
|---|
| 217 |         IF DC>58 GOTO UP
 | 
|---|
| 218 |         KILL X,DIC,P   ;"Note: newer version of code renames P to DISPOINT
 | 
|---|
| 219 |         SET DIC(0)="Z"  ;"WAS EZ
 | 
|---|
| 220 |         SET C=","
 | 
|---|
| 221 |         SET DIC="^DD("_DK_C
 | 
|---|
| 222 |         SET DIC("W")=""
 | 
|---|
| 223 |         SET DIC("S")="IF $PIECE(^(0),U,2)'[""m"""_$SELECT($DATA(DICS):" "_DICS,1:""),DU=""
 | 
|---|
| 224 |         SET X=$GET(TMGINFO(DC,"FLD"))
 | 
|---|
| 225 |         IF X="" GOTO UP
 | 
|---|
| 226 |         ;"IF X?1"[".E GOTO TEM  ;"I think this is for putting all on one line. REMOVED because it is user-interactive
 | 
|---|
| 227 |         SET TMGSAVX=X
 | 
|---|
| 228 |         DO ^DIC ;"search FOR field, based on user input.
 | 
|---|
| 229 |         IF Y=-1 SET X=TMGSAVX
 | 
|---|
| 230 |         IF Y'>0 GOTO COMP
 | 
|---|
| 231 |         KILL P
 | 
|---|
| 232 |         SET DE=Y(0)
 | 
|---|
| 233 |         SET O(DC)=$PIECE(DE,U)  ;"Store first part of search term
 | 
|---|
| 234 |         SET DU=+Y   ;"DU = field number
 | 
|---|
| 235 |         SET Z=$PIECE(DE,U,3)  ;"pointers or SET data
 | 
|---|
| 236 |         SET E=$PIECE(DE,U,2)  ;"field info codes, poss with subfile #
 | 
|---|
| 237 | G       ;==== Get Condition =========
 | 
|---|
| 238 |         KILL X,DIC
 | 
|---|
| 239 |         SET DIC="^DOPT(""DIS"","  ;"file containing "equals","contains","greater than" etc.
 | 
|---|
| 240 |         SET DIC(0)="Z"  ;"Was QEZ
 | 
|---|
| 241 |         IF E["B" SET X="" GOTO OK ;"'B'->field is a BOOLEAN COMPUTED field, so skip
 | 
|---|
| 242 |         IF +E=0 GOTO G2 ;"E=file info code starts with # IF subfile.  So skip IF not subfile
 | 
|---|
| 243 |         SET N(DL)=N
 | 
|---|
| 244 |         SET N=N+1
 | 
|---|
| 245 |         SET DV(DL)=DV
 | 
|---|
| 246 |         SET DL(DL)=DK
 | 
|---|
| 247 |         SET DK=+E
 | 
|---|
| 248 |         SET J(N)=DK
 | 
|---|
| 249 |         SET X=$PIECE($PIECE(DE,U,4),";")  ;"4th piece of 0 node holds storage location
 | 
|---|
| 250 |         SET I(N)=$SELECT(+X=X:X,1:""""_X_"""")
 | 
|---|
| 251 |         SET Y(0)=^DD(DK,.01,0)
 | 
|---|
| 252 |         SET DL=DL+1   ;"indent further
 | 
|---|
| 253 |         IF $PIECE(Y(0),U,2)["W" DO  GOTO C  ;"was goto WP
 | 
|---|
| 254 |         . SET DIC("S")="IF Y<3"
 | 
|---|
| 255 |         . SET DU=+Y_"W"
 | 
|---|
| 256 |         SET DV=DV_+Y_","
 | 
|---|
| 257 |         GOTO F   ;"loop back to get more field info for subfile   FIX!!!  How is this pre-determined??
 | 
|---|
| 258 |         ;
 | 
|---|
| 259 | G2      SET X=$PIECE(E,"P",2) 
 | 
|---|
| 260 |         IF X,$DATA(^DIC(+X,0,"GL")) DO
 | 
|---|
| 261 |         . ;Y will be FIELD lookup, unless it's COMPUTED EXPRESSION from ^DIS2   
 | 
|---|
| 262 |         . SET P=$SELECT(Y:+Y,1:-DC)_U_U_^("GL")
 | 
|---|
| 263 |         IF E["P" DO
 | 
|---|
| 264 |         . SET P=+Y_U_Y(0) ;"e.g. P=.02^PATIENT^P9000001'
 | 
|---|
| 265 |         . SET X=+$PIECE(E,"P",2) 
 | 
|---|
| 266 |         . FOR  QUIT:'X  DO
 | 
|---|
| 267 |         . . SET DA=$PIECE($G(^DD(X,.01,0)),U,2) 
 | 
|---|
| 268 |         . . IF DA["D" DO  QUIT
 | 
|---|
| 269 |         . . . SET E="D"_E
 | 
|---|
| 270 |         . . . SET X=""
 | 
|---|
| 271 |         . . SET X=+$P(DA,"P",2)
 | 
|---|
| 272 |         IF $DATA(P),Y>0 DO
 | 
|---|
| 273 |         . SET X="(#"_+Y_")"
 | 
|---|
| 274 |         . NEW SAVX SET SAVX=X
 | 
|---|
| 275 |         . SET DA="DIS("""_$C(DC+64)_DL_""","
 | 
|---|
| 276 |         . SET DICOMP=N 
 | 
|---|
| 277 |         . SET:$DATA(O(DC))[0 O(DC)=X 
 | 
|---|
| 278 |         . DO EN^DICOMP 
 | 
|---|
| 279 |         . IF $GET(X)="" DO  QUIT
 | 
|---|
| 280 |         . . SET TMGRESULT="-1^Unable to process '"_SAVX
 | 
|---|
| 281 |         . SET DA(DC)=X
 | 
|---|
| 282 |         . SET DU=-DC 
 | 
|---|
| 283 |         . FOR %=0:0 SET %=$ORDER(X(%)) Q:'%  SET @(DA_%_")")=X(%)
 | 
|---|
| 284 |         IF +TMGRESULT=-1 GOTO PREPDN
 | 
|---|
| 285 |         ;
 | 
|---|
| 286 | C       SET X=$GET(TMGINFO(DC,"COND")) ;"Get pre-defined user search condition
 | 
|---|
| 287 |         IF X="" DO  GOTO PREPDN
 | 
|---|
| 288 |         . SET TMGRESULT="-1^Search condition not specified for term #"_DC
 | 
|---|
| 289 |         SET DN=$SELECT("'-"[$E(X):"'",1:"")  ;"IF NOT is specified then DN="'"
 | 
|---|
| 290 |         SET X=$E(X,DN]""+1,99) ;"remove 'NOT' symbol, IF present
 | 
|---|
| 291 |         DO ^DIC
 | 
|---|
| 292 |         IF Y=-1 DO  GOTO PREPDN
 | 
|---|
| 293 |         . SET TMGRESULT="-1^Search condition '"_X_"' is not valid."
 | 
|---|
| 294 | C2      SET O=$PIECE("NOT ",U,DN]"")_$PIECE(Y,U,2)  ;"Store search condition in O
 | 
|---|
| 295 |         IF +Y=1 DO  GOTO OK  ;"Handle NULL selected
 | 
|---|
| 296 |         . SET X=DN_"?."" """ 
 | 
|---|
| 297 |         . SET O(DC)=O(DC)_" "_O
 | 
|---|
| 298 |         SET DQ=Y
 | 
|---|
| 299 |         ;"At this point DQ should be one of following values:
 | 
|---|
| 300 |         ;"1 for NULL,       2 for CONTAINS     3 for matches
 | 
|---|
| 301 |         ;"4 for LESS THAN   5 for EQUALS       6 for GREATER THAN
 | 
|---|
| 302 |         ;
 | 
|---|
| 303 |         ;"====Get Search Term=================
 | 
|---|
| 304 |         SET X=$GET(INFO(DC,"VALUE"))
 | 
|---|
| 305 |         IF X="" DO  GOTO PREPDN
 | 
|---|
| 306 |         . SET TMGRESULT="-1^No search value specified for term #"_DC 
 | 
|---|
| 307 |         ;
 | 
|---|
| 308 | DT      ;"--Handle searches for DATES--
 | 
|---|
| 309 |         IF (E'["D")!(DQ<4) GOTO PT        
 | 
|---|
| 310 |         SET %DT="T"  ;"was TE
 | 
|---|
| 311 |         DO ^%DT
 | 
|---|
| 312 |         IF Y<0 DO  GOTO PREPDN
 | 
|---|
| 313 |         . SET TMGRESULT="-1^Invalid date value '"_X
 | 
|---|
| 314 |         SET X=Y_U_X
 | 
|---|
| 315 |         XECUTE ^DD("DD")
 | 
|---|
| 316 |         SET Y=X_U_Y
 | 
|---|
| 317 |         GOTO GOT
 | 
|---|
| 318 |         ;
 | 
|---|
| 319 | PT      ;"--POINTERS--
 | 
|---|
| 320 |         IF ($DATA(P)=0)!(+DQ'=5) GOTO PT2
 | 
|---|
| 321 |         ;"--Handle Pointer field EQUALS X value--
 | 
|---|
| 322 |         KILL DIC,DIS($char(DC+64)_DL)
 | 
|---|
| 323 |         SET DIC=U_$PIECE(P,U,4)
 | 
|---|
| 324 |         SET DIC(0)="M"  ;"was EMQ
 | 
|---|
| 325 |         SET DU=+P
 | 
|---|
| 326 |         DO ^DIC 
 | 
|---|
| 327 |         IF Y'>0 DO  GOTO PREPDN
 | 
|---|
| 328 |         . SET TMGRESULT="-1^Search value '"_X_"' not found for search term #"_DC
 | 
|---|
| 329 |         GOTO GOT
 | 
|---|
| 330 |         ;
 | 
|---|
| 331 | PT2     SET Y=X
 | 
|---|
| 332 |         ;Line below allows looking for "^" in WP or $E-stored actual data
 | 
|---|
| 333 |         IF (Y[U),($PIECE(DE,U,4)'[";E"),('$P($G(DE),U,2)),(E'["C") DO  GOTO PREPDN
 | 
|---|
| 334 |         . SET TMGRESULT="-1^Search value '"_Y_"' should not contain '^'"
 | 
|---|
| 335 |         IF +DQ'=3 GOTO PT3
 | 
|---|
| 336 |         SET X="I X?"_Y 
 | 
|---|
| 337 |         SET TMGSAVX=X
 | 
|---|
| 338 |         DO ^DIM 
 | 
|---|
| 339 |         IF $DATA(X)=0 DO  GOTO PREPDN
 | 
|---|
| 340 |         . SET TMGRESULT="-1^Bad match expression: '"_TMGSAVX_"'"
 | 
|---|
| 341 |         GOTO GOT
 | 
|---|
| 342 |         ;
 | 
|---|
| 343 | PT3     IF (DQ=4)!(DQ=6),(+Y'=Y) DO  GOTO PREPDN ;> or < have to be numeric
 | 
|---|
| 344 |         . SET TMGRESULT="-1^Search value '"_Y_"' must be numeric to use comparator '"_O_"'"
 | 
|---|
| 345 |         IF Y?."?" DO  GOTO PREPDN 
 | 
|---|
| 346 |         . SET TMGRESULT="-1^Bad search value '"_Y_"'"
 | 
|---|
| 347 |         ;
 | 
|---|
| 348 | SET     ;"--Handle set-type fields----
 | 
|---|
| 349 |         IF E'["S" GOTO OTHR
 | 
|---|
| 350 |         SET TMGSAVX=X
 | 
|---|
| 351 |         DO 
 | 
|---|
| 352 |         . NEW D 
 | 
|---|
| 353 |         . SET X=1 
 | 
|---|
| 354 |         . IF (+DQ=5)!(Y["""") DO  KILL:(D="") X QUIT
 | 
|---|
| 355 |         . . NEW DIR,DDER 
 | 
|---|
| 356 |         . . SET X=Y
 | 
|---|
| 357 |         . . SET DIR(0)="S^"_Z
 | 
|---|
| 358 |         . . SET DIR("V")=1 
 | 
|---|
| 359 |         . . DO ^DIR 
 | 
|---|
| 360 |         . . IF $G(DDER) DO  QUIT
 | 
|---|
| 361 |         . . . SET D=""
 | 
|---|
| 362 |         . . . SET TMGRESULT="-1^Error choosing '"_X_"' in set '"_Z_"'"
 | 
|---|
| 363 |         . . NEW DONE SET DONE=0
 | 
|---|
| 364 |         . . FOR X=1:1 DO  QUIT:(D="")!DONE
 | 
|---|
| 365 |         . . . SET D=$PIECE(Z,";",X) QUIT:D=""  
 | 
|---|
| 366 |         . . . IF Y=$PIECE(D,":") DO
 | 
|---|
| 367 |         . . . . SET Y=""""_$$CONVQQ^DILIBF($P(D,":"))_"""^"_$P(D,":",2)
 | 
|---|
| 368 |         . . . . SET DONE=1
 | 
|---|
| 369 |         . NEW N,FND,C 
 | 
|---|
| 370 |         . SET Y=""""_Y_""""
 | 
|---|
| 371 |         . SET N="DE"_DN_$E(" [?<=>",DQ)_Y
 | 
|---|
| 372 |         . FOR X=1:1 DO  QUIT:(D="")
 | 
|---|
| 373 |         . . SET D=$PIECE(Z,";",X)
 | 
|---|
| 374 |         . . SET DE=$PIECE(D,":",2) 
 | 
|---|
| 375 |         . . IF D="" QUIT  
 | 
|---|
| 376 |         . . SET DIS(U,DC,$P(D,":"))=DE
 | 
|---|
| 377 |         . . NEW MATCH SET MATCH=0
 | 
|---|
| 378 |         . . IF @N SET MATCH=1  ;"Note: IF '(@N) QUIT <-- won't work
 | 
|---|
| 379 |         . . IF 'MATCH QUIT
 | 
|---|
| 380 |         . . SET FND="'"_DE_"'" 
 | 
|---|
| 381 |         . IF $D(FND)=0 KILL X QUIT
 | 
|---|
| 382 |         IF +TMGRESULT=-1 GOTO PREPDN
 | 
|---|
| 383 |         KILL DIS("XFORM",DC) 
 | 
|---|
| 384 |         IF $DATA(X)=0 DO  GOTO PREPDN
 | 
|---|
| 385 |         . KILL DIS(U,DC) 
 | 
|---|
| 386 |         . SET TMGRESULT="-1^Search value '"_TMGSAVX_"' is invalid for SET type field."
 | 
|---|
| 387 |         GOTO GOT
 | 
|---|
| 388 |         ;     
 | 
|---|
| 389 | OTHR    IF Y?.E2A.E DO
 | 
|---|
| 390 |         . SET DIS("XFORM",DC)="$$UP^DILIBF(;)"
 | 
|---|
| 391 |         . SET Y=$$UP^DILIBF(Y)
 | 
|---|
| 392 |         DO
 | 
|---|
| 393 |         . N P,YY,C 
 | 
|---|
| 394 |         . SET C=""""
 | 
|---|
| 395 |         . SET YY=C_$$CONVQQ^DILIBF($P(Y,U)) 
 | 
|---|
| 396 |         . FOR P=2:1:$L(Y,U)  DO
 | 
|---|
| 397 |         . . SET YY="("_YY_"""_$C(94)_"""_$$CONVQQ^DILIBF($P(Y,U,P)),C=C_")"
 | 
|---|
| 398 |         . SET Y=YY_C
 | 
|---|
| 399 |         ;
 | 
|---|
| 400 |         ;===============================================
 | 
|---|
| 401 | GOT     ;"At this point, Y should be search value
 | 
|---|
| 402 |         SET X=DN_$EXTRACT(" [?<=>",DQ)_$P(Y,U) 
 | 
|---|
| 403 |         IF E["D" DO
 | 
|---|
| 404 |         . IF ($PIECE(Y,U)'["."),$E(Y,6,7) DO
 | 
|---|
| 405 |         . . SET %=$PIECE("^^^^ any time during^ the entire day",U,DQ) 
 | 
|---|
| 406 |         . . IF %']"" QUIT
 | 
|---|
| 407 |         . . SET DIS("XFORM",DC)="$P(;,""."")"
 | 
|---|
| 408 |         . . SET O=O_%
 | 
|---|
| 409 |         . SET Y=$P(Y,U,3)_U_$P(Y,U,2)
 | 
|---|
| 410 |         IF $GET(DIS("XFORM",DC))="$$UP^DILIBF(;)" SET O=O_" (case-insensitive)"
 | 
|---|
| 411 |         SET O(DC)=O(DC)_" "_O_" "_Y
 | 
|---|
| 412 |         ;
 | 
|---|
| 413 | OK      SET DC(DC)=DV_DU_U_X
 | 
|---|
| 414 |         SET %=DL-1_U_(N#100)
 | 
|---|
| 415 |         IF DL>1,O(DC)'[R SET O(DC)=R_" "_O(DC)
 | 
|---|
| 416 |         IF DU["W" SET %=DL-2_U_(N#100-1)
 | 
|---|
| 417 |         SET DX(DC)=%
 | 
|---|
| 418 |         SET DC=DC+1 ;"Incr logical part (i.e. 'A'->'B'->'C'->D)
 | 
|---|
| 419 |         IF DC=27 SET DC=33
 | 
|---|
| 420 | B       GOTO F:(DU'["W"&(DC<59))
 | 
|---|
| 421 |         ;
 | 
|---|
| 422 |         ;"==============
 | 
|---|
| 423 | UP      IF (DC'>1)!(DL'<2) GOTO U2
 | 
|---|
| 424 |         ;"Done with entering conditions.  Continue processing in ^TMGDIS0
 | 
|---|
| 425 |         DO DIS0^TMGDIS0(.TMGINFO,.TMGOUT,.TMGBYROOT) ;"Sets TMGRESULT
 | 
|---|
| 426 |         GOTO PREPDN
 | 
|---|
| 427 |         ;
 | 
|---|
| 428 | U2      SET DL=DL-1
 | 
|---|
| 429 |         SET DV=DV(DL)
 | 
|---|
| 430 |         SET DK=DL(DL)
 | 
|---|
| 431 |         SET N=N(DL)
 | 
|---|
| 432 |         SET R=$SELECT($DATA(R(DL)):R(DL),1:R)
 | 
|---|
| 433 |         KILL R(DL)
 | 
|---|
| 434 |         SET %=N
 | 
|---|
| 435 |         FOR  DO  IF %<0 GOTO F   ;"go back and get more field information.
 | 
|---|
| 436 |         . SET %=$ORDER(I(%))
 | 
|---|
| 437 |         . IF %="" SET %=-1
 | 
|---|
| 438 |         . IF %<0 QUIT
 | 
|---|
| 439 |         . KILL I(%),J(%)
 | 
|---|
| 440 | Q2      IF '$D(DIARU) GOTO PREPDN
 | 
|---|
| 441 |         . SET TMGRESULT="-1^No search terms found"
 | 
|---|
| 442 |         ;"GOTO DIS2^TMGDIS2
 | 
|---|
| 443 |         SET TMGRESULT=$$DIS2^TMGDIS2
 | 
|---|
| 444 |         ;
 | 
|---|
| 445 |         ;"==========================================        
 | 
|---|
| 446 | PREPDN  ;"Purpose: New common exit point for function
 | 
|---|
| 447 |         DO Q ;"kill vars
 | 
|---|
| 448 |         QUIT TMGRESULT 
 | 
|---|
| 449 |         ;
 | 
|---|
| 450 |         ;
 | 
|---|
| 451 |         ;--Code below from TMGDIS2----
 | 
|---|
| 452 |         ;"==========================================
 | 
|---|
| 453 |         ;SFISC/GFT-SEARCH, TEMPLATES & COMPUTED FIELDS;4JUN2005
 | 
|---|
| 454 |         ;;22.0;VA FileMan;**6,144**;Mar 30, 1999;Build 5
 | 
|---|
| 455 |         ;"==========================================
 | 
|---|
| 456 |         ;        
 | 
|---|
| 457 | COMP    SET E=X  ;"e.g. X="(#.02)"
 | 
|---|
| 458 |         SET DICMX="X DIS(DIXX)"
 | 
|---|
| 459 |         SET DICOMP=N_"?"
 | 
|---|
| 460 |         SET DQI="Y("
 | 
|---|
| 461 |         SET DA="DIS("""_$C(DC+64)_DL_"""," 
 | 
|---|
| 462 |         IF $D(O(DC))[0 
 | 
|---|
| 463 |         SET O(DC)=X
 | 
|---|
| 464 |         IF X?.E1":" DO COLON GOTO R
 | 
|---|
| 465 |         IF (X?.E1":.01"),($D(O(DC))[0) SET O(DC)=$E(X,1,$L(X)-4)
 | 
|---|
| 466 |         DO EN^DICOMP ;"Eval computed expression.  Output in X
 | 
|---|
| 467 |         DO XA
 | 
|---|
| 468 |         IF $GET(X)="" DO  GOTO PREPDN^TMGDIS
 | 
|---|
| 469 |         . SET TMGRESULT="-1^Unable to evaluate computed expression '"_E_"'"
 | 
|---|
| 470 |         IF Y["m" DO  GOTO PREPDN^TMGDIS
 | 
|---|
| 471 |         . SET TMGRESULT="-1^Found unexpected 'm' in '"_Y_"'" 
 | 
|---|
| 472 |         ;"GOTO X:'$D(X)
 | 
|---|
| 473 |         ;"GOTO X:Y["m" ;IF Y["m" SET X=E_":" G COMP
 | 
|---|
| 474 |         SET DA(DC)=X
 | 
|---|
| 475 |         SET DU=-DC
 | 
|---|
| 476 |         SET E=$E("B",Y["B")_$E("D",Y["D") 
 | 
|---|
| 477 |         IF Y["p" SET E="p"_+$P(Y,"p",2)
 | 
|---|
| 478 |         GOTO G
 | 
|---|
| 479 |         ;
 | 
|---|
| 480 | COLON   ; NOTE: code reached only by DO call
 | 
|---|
| 481 |         DO ^DICOMPW
 | 
|---|
| 482 |         DO XA  ;"Setup DIS array
 | 
|---|
| 483 |         IF $GET(X)="" DO  GOTO PREPDN^TMGDIS
 | 
|---|
| 484 |         . SET TMGRESULT="-1^Unable to evaluate computed expression '"_E_"'"
 | 
|---|
| 485 |         ;"G X:'$D(X)
 | 
|---|
| 486 |         SET R(DL)=R
 | 
|---|
| 487 |         SET N(DL)=N
 | 
|---|
| 488 |         SET N=+Y
 | 
|---|
| 489 |         SET DY=DY+1
 | 
|---|
| 490 |         SET DV(DL)=DV
 | 
|---|
| 491 |         SET DL(DL)=DK
 | 
|---|
| 492 |         SET DL=DL+1
 | 
|---|
| 493 |         SET DV=DV_-DY_C
 | 
|---|
| 494 |         SET DY(DY)=DP_U_$S(Y["m":DC_"."_DL,1:"")_U_X
 | 
|---|
| 495 |         SET R=U_$P(DP,U,2)
 | 
|---|
| 496 |         KILL X 
 | 
|---|
| 497 |         QUIT
 | 
|---|
| 498 |         ;
 | 
|---|
| 499 |         ;"==========================================
 | 
|---|
| 500 | XA      SET %=0
 | 
|---|
| 501 |         FOR  DO  Q:%=""
 | 
|---|
| 502 |         . SET %=$O(X(%))
 | 
|---|
| 503 |         . Q:%=""
 | 
|---|
| 504 |         . SET @(DA_%_")")=X(%)
 | 
|---|
| 505 |         SET %=-1
 | 
|---|
| 506 |         QUIT 
 | 
|---|
| 507 |         ;
 | 
|---|
| 508 | Q ;
 | 
|---|
| 509 |         KILL DIC,DA,DX,O,D,DC,DI,DK,DL,DQ,DU,DV
 | 
|---|
| 510 |         KILL E,DE,DJ,N,P,Z,R,DY,DTOUT,DIRUT,DUOUT,DIROUT,^UTILITY($J)
 | 
|---|
| 511 |         QUIT
 | 
|---|
| 512 | 
 | 
|---|
| 513 | TEM     ;"Note: code execution reached here by GOTO 
 | 
|---|
| 514 |         ;"Note: This code is user-interactive, so will not be used.
 | 
|---|
| 515 |         KILL DIC 
 | 
|---|
| 516 |         SET X=$P($E(X,2,99),"]",1)
 | 
|---|
| 517 |         SET DIC="^DIBT("
 | 
|---|
| 518 |         SET DIC(0)="EQ"
 | 
|---|
| 519 |         DO
 | 
|---|
| 520 |         . NEW S SET S=$S($D(DIAR):"$P(^(0),U,8)",1:"'$P(^(0),U,8)")
 | 
|---|
| 521 |         . SET DIC("S")="I "_S_",$P(^(0),U,4)=DK,$P(^(0),U,5)=DUZ!'$P(^(0),U,5),$D(^(""DIS""))"
 | 
|---|
| 522 |         . SET DIC("W")="X ""FOR %=1:1 Q:'$D(^DIBT(Y,""""O"""",%,0))  "
 | 
|---|
| 523 |         . SET DIC("W")=DIC("W")_"WRITE !?9 SET I=^(0) W:$L(I)+$X>79 !?9 WRITE I"""
 | 
|---|
| 524 |         DO ^DIC 
 | 
|---|
| 525 |         KILL DIC 
 | 
|---|
| 526 |         IF Y<0 GOTO F
 | 
|---|
| 527 |         SET P="DIS"
 | 
|---|
| 528 |         SET Z=-1,%X="^DIBT(+Y,P,",%Y="DIS(" D %XY^%RCR
 | 
|---|
| 529 |         SET %Y="^UTILITY($J,",P="O" D %XY^%RCR
 | 
|---|
| 530 |         SET TMGRESULT=$$DIS2^TMGDIS2()   ;"G DIS2^TMGDIS2
 | 
|---|
| 531 |         GOTO PREPDN
 | 
|---|