| 1 | TMGSRCH0 ;TMG/kst/Search API ;05/19/10  ; 6/4/10 | 
|---|
| 2 | ;;1.0;TMG-LIB;**1**;05/19/10 | 
|---|
| 3 | ; | 
|---|
| 4 | ;"TMG FILEMAN SEARCH API | 
|---|
| 5 | ; | 
|---|
| 6 | ;"Copyright Kevin Toppenberg MD 5/19/10 | 
|---|
| 7 | ;"Released under GNU General Public License (GPL) | 
|---|
| 8 | ;" | 
|---|
| 9 | ;"NOTE: this function depends on new version of LIST^DIC, from G. Timpson Patch | 
|---|
| 10 | ;"======================================================================= | 
|---|
| 11 | ;" RPC -- Public Functions. | 
|---|
| 12 | ;"======================================================================= | 
|---|
| 13 | ;"FMSRCH(OUT,FILENUM,COMPEXPR) --A wrapper for Fileman search call | 
|---|
| 14 | ;"ARRYSRCH(FILENUM,PRESULT,ARRAY) -- Process parsed array, doing search | 
|---|
| 15 | ;"======================================================================= | 
|---|
| 16 | ;"PRIVATE API FUNCTIONS | 
|---|
| 17 | ;"======================================================================= | 
|---|
| 18 | ;"USRPGFN(TMGPGFN,TMGSTAT) -- Do user Progress Function, if any. | 
|---|
| 19 | ;"SAMEFILE(PARRAY,STARTNUM,CURFILE) --Return range of search terms that are all in the same Fileman file | 
|---|
| 20 | ;"COMPEXPR(FILENUM,PARRAY,STARTN,ENDN,SRCHFILE,FIELDS) -- prepair a FILEMAN COMPUTED EXPRSSION from elements in ARRAY | 
|---|
| 21 | ;"FIXCOMB(COMB) -- Fix COMBINER term | 
|---|
| 22 | ;"COMP1XP(PARRAY,FIELDS) -- prepair 1 FILEMAN COMPUTED EXPRSSION from elements in ARRAY | 
|---|
| 23 | ;"FIXSET(TMGRSLT,TARGETFILE,SRCHFILE,FLDS,TMGSET) -- Change output of FMSRCH into needed format. | 
|---|
| 24 | ;"RESOLV(FILE,FLDSTR,IEN,ERR) -- follow pointer path to final value. | 
|---|
| 25 | ;"DOCOMB(COMB,TMG1SET,PRESULT) -- combine TMG1SET with @PRESULT based on logical operation COMBiner | 
|---|
| 26 | ;"======================================================================= | 
|---|
| 27 | ;"======================================================================= | 
|---|
| 28 | ;"Dependencies: | 
|---|
| 29 | ;" DIC (custom version), TMGDEBUG, TMGMISC, TMGSTUTL | 
|---|
| 30 | ;"======================================================================= | 
|---|
| 31 | ;"======================================================================= | 
|---|
| 32 | ; | 
|---|
| 33 | ; | 
|---|
| 34 | ARRYSRCH(FILENUM,PRESULT,TMGARRAY,TMGPGFN) ; | 
|---|
| 35 | ;"Purpose: Process parsed array, doing search on terms, and combining them. | 
|---|
| 36 | ;"Input:  FILENUM -- This is the target file | 
|---|
| 37 | ;"        PRESULT-- Pass by NAME.  AN OUT PARAMETER. (see output below) | 
|---|
| 38 | ;"        TMGARRAY -- Pass by reference.  Contains search terms.  Format | 
|---|
| 39 | ;"              TMGARRAY("FILE")=FileNumber  (This is target output file) | 
|---|
| 40 | ;"              TMGARRAY(index,"FLD")=Field to search | 
|---|
| 41 | ;"              TMGARRAY(index,"FNUMPTR")=FileNum:FLD[:FLD[:FLD...]] | 
|---|
| 42 | ;"              TMGARRAY(index,"SRCH")=Value to search for | 
|---|
| 43 | ;"              TMGARRAY(index,"LOGIC",num)=... | 
|---|
| 44 | ;"              TMGARRAY(index,"WP")=1 if field is a WP field | 
|---|
| 45 | ;"              TMGARRAY(index,"COMP")=comparator  Allowed Comparators: =, '=, '<, '>, [, IN | 
|---|
| 46 | ;"              TMGARRAY(index,"SUBTERMS")=1 if has subterms | 
|---|
| 47 | ;"              TMGARRAY(index,indexB,...)... | 
|---|
| 48 | ;"         TMGPGFN -- OPTIONAL. Mumps code that will be called periodically | 
|---|
| 49 | ;"                            to allow display of progress of slow searches. | 
|---|
| 50 | ;"                           Code may depend on the following variables: | 
|---|
| 51 | ;"                           TMGSTAT -- The most recent status text | 
|---|
| 52 | ;"                           TMGPCT -- a very gross estimate of % done (0-100%) | 
|---|
| 53 | ;"Output:  PRESULT is filled in.  Format: | 
|---|
| 54 | ;"             @PRESULT@(0)=-1^Error Message, if needed | 
|---|
| 55 | ;"           -or- | 
|---|
| 56 | ;"             @PRESULT@(IEN)="" | 
|---|
| 57 | ;"             @PRESULT@(IEN)="" | 
|---|
| 58 | ;"Result: Returns number of matches found. | 
|---|
| 59 | NEW ENTRYNUM,ENDNUM,TEMP,TMGEXPR,TMGFLDS,TMGFILE,MAXNUM | 
|---|
| 60 | NEW CT | 
|---|
| 61 | KILL @PRESULT | 
|---|
| 62 | NEW ERR SET ERR=0 | 
|---|
| 63 | NEW DONE SET DONE=0 | 
|---|
| 64 | SET MAXNUM=+$ORDER(TMGARRAY("@"),-1) | 
|---|
| 65 | IF MAXNUM<1 SET MAXNUM=1 ;"Avoid any divide by zero error | 
|---|
| 66 | SET ENTRYNUM=1 | 
|---|
| 67 | FOR  DO  QUIT:(DONE=1)!(+ERR=-1) | 
|---|
| 68 | . SET TEMP=$$SAMEFILE("TMGARRAY",ENTRYNUM) | 
|---|
| 69 | . SET ENDNUM=$PIECE(TEMP,"^",2) | 
|---|
| 70 | . IF ENDNUM<ENTRYNUM SET DONE=1 QUIT | 
|---|
| 71 | . SET TMGEXPR=$$COMPEXPR(FILENUM,"TMGARRAY",ENTRYNUM,ENDNUM,.TMGFILE,.TMGFLDS) | 
|---|
| 72 | . IF +TMGEXPR=-1 SET ERR=TMGEXPR QUIT | 
|---|
| 73 | . NEW COMB SET COMB=$PIECE($GET(TMGARRAY(ENTRYNUM,"LOGIC")),"^",2) | 
|---|
| 74 | . DO FIXCOMB(.COMB) | 
|---|
| 75 | . NEW TMGOUT,TMGOPT | 
|---|
| 76 | . IF TMGFLDS'="" SET TMGOPT("FIELDS")="@;"_+TMGFLDS_"I" | 
|---|
| 77 | . DO USRPGFN(.TMGPGFN,"Searching file #"_TMGFILE_" for: "_TMGEXPR_" ...") | 
|---|
| 78 | . SET CT=$$FMSRCH(TMGFILE,TMGEXPR,.TMGOUT,.TMGOPT) | 
|---|
| 79 | . IF $DATA(TMGOUT("ERR")) SET ERR="-1^FILEMAN ERROR^"_$GET(TMGOUT("ERR",0)) QUIT | 
|---|
| 80 | . DO USRPGFN(.TMGPGFN,"Organizing "_CT_" search results so far...") | 
|---|
| 81 | . NEW TMG1SET | 
|---|
| 82 | . SET ERR=$$FIXSET(.TMGOUT,FILENUM,TMGFILE,TMGFLDS,.TMG1SET) | 
|---|
| 83 | . IF +ERR=-1 QUIT | 
|---|
| 84 | . DO USRPGFN(.TMGPGFN,"Combining search term with net results...") | 
|---|
| 85 | . IF COMB="" MERGE @PRESULT=TMG1SET | 
|---|
| 86 | . ELSE  DO DOCOMB(COMB,.TMG1SET,PRESULT) | 
|---|
| 87 | . SET ENTRYNUM=ENDNUM+1 | 
|---|
| 88 | IF +ERR=-1 DO | 
|---|
| 89 | . KILL @PRESULT | 
|---|
| 90 | . SET @PRESULT@(0)=ERR | 
|---|
| 91 | . SET CT=0 | 
|---|
| 92 | ELSE  DO | 
|---|
| 93 | . SET TMGSTAT="Counting search results..." | 
|---|
| 94 | . DO USRPGFN(.TMGPGFN) | 
|---|
| 95 | . SET CT=$$LISTCT^TMGMISC(PRESULT) | 
|---|
| 96 | . SET CT=CT-1 ;"Remove count of "DETAILS" node | 
|---|
| 97 | QUIT CT | 
|---|
| 98 | ; | 
|---|
| 99 | USRPGFN(TMGPGFN,TMGSTAT) ;"Do user Progress Function, if any. | 
|---|
| 100 | IF $GET(TMGPGFN)'="" DO | 
|---|
| 101 | . NEW $ETRAP SET $ETRAP="S $ETRAP="""",$ECODE=""""" | 
|---|
| 102 | . NEW TMGPCT SET TMGPCT=(((ENTRYNUM-1)/MAXNUM)*100)\1 | 
|---|
| 103 | . XECUTE TMGPGFN  ;"Run user's progress function code | 
|---|
| 104 | QUIT | 
|---|
| 105 | ; | 
|---|
| 106 | SAMEFILE(PARRAY,STARTNUM,CURFILE) ; | 
|---|
| 107 | ;"Purpose: Return range of search terms that are all in the same Fileman file | 
|---|
| 108 | ;"         OLD-> NOTE: if WP field is encountered, this is kicked out as NOT | 
|---|
| 109 | ;"               in same file, to overcome LIST^DIC limitation. (REMOVED AFTER LIMITATION FIXED) | 
|---|
| 110 | ;"Input: PARRAY -- PASS BY NAME.  This is ARRAY as passed to DOSRCH | 
|---|
| 111 | ;"       STARTNUM -- OPTIONAL.  The index to start consideration of. Default=1 | 
|---|
| 112 | ;"       CURFILE -- OPTIONAL.  Used when calling self reiteratively. Leave blank first time. | 
|---|
| 113 | ;"Result: StartIndex^EndIndex of entries dealing with same file. | 
|---|
| 114 | ; | 
|---|
| 115 | SET STARTNUM=$GET(STARTNUM,1) | 
|---|
| 116 | NEW RESULT SET RESULT=STARTNUM_"^-1" | 
|---|
| 117 | NEW I SET I=STARTNUM-1 | 
|---|
| 118 | SET CURFILE=+$GET(CURFILE) | 
|---|
| 119 | NEW DONE SET DONE=0 | 
|---|
| 120 | FOR  SET I=$ORDER(@PARRAY@(I)) QUIT:(+I'>0)!(DONE=1)  DO | 
|---|
| 121 | . NEW THISFNUM SET THISFNUM=+$GET(@PARRAY@(I,"FNUMPTR")) | 
|---|
| 122 | . IF $GET(@PARRAY@(I,"SUBTERMS"))=1 DO  QUIT:DONE=1 | 
|---|
| 123 | . . SET THISFNUM=CURFILE | 
|---|
| 124 | . . NEW TEMP SET TEMP=$$SAMEFILE($NAME(@PARRAY@(I)),1,.THISFNUM) | 
|---|
| 125 | . . NEW NUM2 SET NUM2=$PIECE(TEMP,"^",2) | 
|---|
| 126 | . . IF NUM2=-1 SET DONE=1 QUIT | 
|---|
| 127 | . . IF +$ORDER(@PARRAY@(I,NUM2))>0 SET DONE=1 | 
|---|
| 128 | . IF (CURFILE>0) DO  QUIT:DONE=1 | 
|---|
| 129 | . . IF (THISFNUM'=CURFILE) SET DONE=1 QUIT | 
|---|
| 130 | . . ;"IF $GET(@PARRAY@(I,"WP"))=1 SET DONE=1 QUIT | 
|---|
| 131 | . SET CURFILE=THISFNUM | 
|---|
| 132 | . SET $PIECE(RESULT,"^",2)=I | 
|---|
| 133 | QUIT RESULT | 
|---|
| 134 | ; | 
|---|
| 135 | COMPEXPR(FILENUM,PARRAY,STARTN,ENDN,SRCHFILE,FIELDS) ; | 
|---|
| 136 | ;"Purpose: to prepair a FILEMAN COMPUTED EXPRSSION from elements in ARRAY | 
|---|
| 137 | ;"Input: ARRAY -- Pass by reference.  Contains search terms.  Format | 
|---|
| 138 | ;"              @PARRAY@("FILE")=FileNumber  (This is target output file) | 
|---|
| 139 | ;"              @PARRAY@(index,"FLD")=Field to search | 
|---|
| 140 | ;"              @PARRAY@(index,"FNUMPTR")=FileNum:FLD[:FLD[:FLD...]] | 
|---|
| 141 | ;"              @PARRAY@(index,"SRCH")=Value to search for | 
|---|
| 142 | ;"              @PARRAY@(index,"COMP")=comparator  Allowed Comparators: =, '=, '<, '>, [, IN | 
|---|
| 143 | ;"              @PARRAY@(index,"SUBTERMS")=1 if has subterms | 
|---|
| 144 | ;"       STARTN -- The starting index to consider | 
|---|
| 145 | ;"       ENDN -- the ending index to consider | 
|---|
| 146 | ;"       SRCHFILE --PASS BY REFERENCE.  This is the file to search for fields in | 
|---|
| 147 | ;"       FIELDS -- Pass by reference. This is the desired output fields. | 
|---|
| 148 | ;"Results: Will return a COMPUTED EXPRESSION, or -1^Message | 
|---|
| 149 | ;" | 
|---|
| 150 | NEW RESULT SET RESULT="" | 
|---|
| 151 | NEW I,CURFIL | 
|---|
| 152 | SET CURFIL=0 | 
|---|
| 153 | FOR I=STARTN:1:ENDN DO  QUIT:(+RESULT=-1) | 
|---|
| 154 | . IF RESULT'="" DO | 
|---|
| 155 | . . NEW COMB SET COMB=$PIECE($GET(@PARRAY@(I,"LOGIC")),"^",2) | 
|---|
| 156 | . . DO FIXCOMB(.COMB) | 
|---|
| 157 | . . SET RESULT=RESULT_COMB | 
|---|
| 158 | . IF $GET(@PARRAY@(I,"SUBTERMS"))=1 DO  QUIT | 
|---|
| 159 | . . NEW ENUM SET ENUM=+$ORDER(@PARRAY@(I,"@"),-1) | 
|---|
| 160 | . . NEW TEMP SET TEMP=$$COMPEXPR(FILENUM,$NAME(@PARRAY@(I)),1,ENUM,.SRCHFILE,.FIELDS) | 
|---|
| 161 | . . IF +TEMP=-1 SET RESULT=TEMP | 
|---|
| 162 | . . SET RESULT=RESULT_TEMP | 
|---|
| 163 | . NEW PRIOREXP SET PRIOREXP=$GET(@PARRAY@(I,"FM COMP EXPR")) | 
|---|
| 164 | . IF PRIOREXP'="" SET RESULT=RESULT_PRIOREXP QUIT | 
|---|
| 165 | . NEW FNUMPTR SET FNUMPTR=$GET(@PARRAY@(I,"FNUMPTR")) | 
|---|
| 166 | . IF FNUMPTR="" DO  QUIT | 
|---|
| 167 | . . SET RESULT="-1^No FNUMPTR found in array.  Can't create computed expression" | 
|---|
| 168 | . IF CURFIL=0 SET CURFIL=+FNUMPTR | 
|---|
| 169 | . IF CURFIL'=+FNUMPTR DO  QUIT | 
|---|
| 170 | . . SET RESULT="-1^Can't make computed expression involving different files." | 
|---|
| 171 | . SET SRCHFILE=CURFIL | 
|---|
| 172 | . NEW EXPR SET EXPR=$$COMP1XP($NAME(@PARRAY@(I)),.FIELDS) | 
|---|
| 173 | . IF +EXPR=-1 SET RESULT=EXPR QUIT | 
|---|
| 174 | . SET @PARRAY@(I,"FM COMP EXPR")=EXPR | 
|---|
| 175 | . SET RESULT=RESULT_EXPR | 
|---|
| 176 | QUIT RESULT | 
|---|
| 177 | ; | 
|---|
| 178 | FIXCOMB(COMB) ; "Fix COMBINER terms | 
|---|
| 179 | IF COMB="AND" SET COMB="&" | 
|---|
| 180 | ELSE  IF COMB="OR" SET COMB="!" | 
|---|
| 181 | ELSE  IF COMB="NOT" SET COMB="&'" | 
|---|
| 182 | QUIT | 
|---|
| 183 | ; | 
|---|
| 184 | COMP1XP(PARRAY,FIELDS) ; | 
|---|
| 185 | ;"Purpose: to prepair ONE FILEMAN COMPUTED EXPRSSION from elements in ARRAY | 
|---|
| 186 | ;"Input: PARRAY -- Pass by NAME.  Contains search terms.  Format | 
|---|
| 187 | ;"              @PARRAY@("FLD")=Field to search | 
|---|
| 188 | ;"              @PARRAY@("FNUMPTR")=FileNum:FLD[:FLD[:FLD...]] | 
|---|
| 189 | ;"              @PARRAY@("SRCH")=Value to search for (or Value..Value2 if IN comparator) | 
|---|
| 190 | ;"              @PARRAY@("COMP")=comparator  Allowed Comparators: =, '=, '<, '>, [, IN | 
|---|
| 191 | ;"       FIELDS -- Pass by reference. This is the desired output fields. | 
|---|
| 192 | ;"Results: Will return a COMPUTED EXPRESSION, or -1^Message | 
|---|
| 193 | ; | 
|---|
| 194 | NEW RESULT SET RESULT="" | 
|---|
| 195 | NEW FLD SET FLD=$GET(@PARRAY@("FLD")) | 
|---|
| 196 | IF +FLD=0 DO  GOTO CP1DN | 
|---|
| 197 | . SET RESULT="-1^No field number found" | 
|---|
| 198 | SET FIELDS=$PIECE($GET(@PARRAY@("FNUMPTR")),":",2,999) | 
|---|
| 199 | NEW COMP SET COMP=$GET(@PARRAY@("COMP")) | 
|---|
| 200 | IF COMP="" DO  GOTO CP1DN | 
|---|
| 201 | . SET RESULT="-1^No comparator found" | 
|---|
| 202 | NEW VALUE SET VALUE=$GET(@PARRAY@("SRCH")) | 
|---|
| 203 | IF VALUE="" DO  GOTO CP1DN | 
|---|
| 204 | . SET RESULT="-1^No value to search for found." | 
|---|
| 205 | IF COMP'="IN" DO | 
|---|
| 206 | . SET RESULT="(#"_FLD_COMP_""""_VALUE_""")" | 
|---|
| 207 | ELSE  DO  ;"Handle .01IN"5..10" | 
|---|
| 208 | . NEW V1,V2 | 
|---|
| 209 | . SET V1=$PIECE(VALUE,"..",1) | 
|---|
| 210 | . SET V2=$PIECE(VALUE,"..",2) | 
|---|
| 211 | . IF (V1="")!(V2="") DO  QUIT | 
|---|
| 212 | . . SET RESULT="-1^Range values (e.g. V1..V2) not found for IN comparator." | 
|---|
| 213 | . SET RESULT="((#"_FLD_"'<"""_V1_""")&(#"_FLD_"'>"""_V2_"""))" | 
|---|
| 214 | IF +RESULT=-1 GOTO CP1DN | 
|---|
| 215 | ; | 
|---|
| 216 | CP1DN   QUIT RESULT | 
|---|
| 217 | ; | 
|---|
| 218 | FMSRCH(TMGFILE,TMGCOMPEXPR,TMGOUT,TMGOPTION)  ; | 
|---|
| 219 | ;"Purpose: This is a wrapper for new Fileman search call LIST^DIC | 
|---|
| 220 | ;"Input: TMGFILE -- File name or number to search in. | 
|---|
| 221 | ;"         TMGFILE(0) -- If FILE refers to a subfile, then FILE(0) must be set to | 
|---|
| 222 | ;"                  the IENS that identifies which subfile to search. | 
|---|
| 223 | ;"                  If supplied, then FILE should be PASSED BY REFERENCE | 
|---|
| 224 | ;"       TMGCOMPEXPR -- This is a FILEMAN COMPUTED EXPRESSION used for search. | 
|---|
| 225 | ;"       TMGOUT -- PASS BY REFERENCE.  an OUT PARAMETER.  Pre-existing data killed. | 
|---|
| 226 | ;"              This is array that will be filled with results. | 
|---|
| 227 | ;"                e.g. OUT(IEN)=IEN^FieldValue(s) | 
|---|
| 228 | ;"              If OPTION("BYROOT")=1, then OUT must hold the *name* of a variable to be filled. | 
|---|
| 229 | ;"                e.g. @OUT@(IEN)=IEN^FieldValue(s) | 
|---|
| 230 | ;"         TMGOUT("ERR") -- will be filled with error messages, if encountered | 
|---|
| 231 | ;"       TMGOPTION -- (OPTIONAL) -- Used to past customizations to LIST^DIC. | 
|---|
| 232 | ;"          TMGOPTION("BYROOT") If 1, then TMGOUT holds name of variable to be filled with results. | 
|---|
| 233 | ;"           ** See details in documentation for LIST^DIC for items below ** | 
|---|
| 234 | ;"          TMGOPTION("FIELDS") -- Optional.  Fields to return with each entry. | 
|---|
| 235 | ;"          TMGOPTION("FLAGS") -- Optional.  Default="PX"  Note: "X" will always be passed to LIST^DIC | 
|---|
| 236 | ;"          TMGOPTION("NUMBER") -- Optional. Max number of entries to return.  Default is "*" (all) | 
|---|
| 237 | ;"          TMGOPTION("FROM") -- Optional.  Index entry from which to begin the list. | 
|---|
| 238 | ;"          TMGOPTION("PART") -- Optional.  A partial match restriction. | 
|---|
| 239 | ;"          TMGOPTION("SCREEN") -- Optional.  Screening code to apply to each potential entry. | 
|---|
| 240 | ;"          TMGOPTION("ID") -- Optional.  Identifier: text to accompany each entry returned in the list. | 
|---|
| 241 | ;"Results: returns # of matches. | 
|---|
| 242 | NEW TMGRESULT SET TMGRESULT=0 | 
|---|
| 243 | SET TMGFILE=$GET(TMGFILE) | 
|---|
| 244 | IF +TMGFILE'=TMGFILE DO | 
|---|
| 245 | . NEW X,Y,DIC | 
|---|
| 246 | . SET DIC=1,DIC(0)="M" | 
|---|
| 247 | . SET X=TMGFILE | 
|---|
| 248 | . DO ^DIC | 
|---|
| 249 | . SET TMGFILE=+Y | 
|---|
| 250 | NEW TMGIENS SET TMGIENS=$GET(FILE(0)) | 
|---|
| 251 | NEW TMGFLDS SET TMGFLDS=$GET(TMGOPTION("FIELDS"),"@;") | 
|---|
| 252 | NEW TMGFLAGS SET TMGFLAGS=$GET(TMGOPTION("FLAGS"),"P") | 
|---|
| 253 | IF TMGFLAGS'["X" SET TMGFLAGS=TMGFLAGS_"X" | 
|---|
| 254 | NEW TMGMAX SET TMGMAX=$GET(TMGOPTION("NUMBER"),"*") | 
|---|
| 255 | NEW TMGFROM MERGE TMGFROM=TMGOPTION("FROM") | 
|---|
| 256 | NEW TMGPART MERGE TMGPART=TMGOPTION("PART") | 
|---|
| 257 | NEW TMGSCR SET TMGSCR=$GET(TMGOPTION("SCREEN")) | 
|---|
| 258 | NEW TMGID SET TMGID=$GET(TMGOPTION("ID")) | 
|---|
| 259 | SET TMGCOMPEXPR=$GET(TMGCOMPEXPR) | 
|---|
| 260 | NEW TMGRSLT,TMGMSG | 
|---|
| 261 | NEW TMGDB,TMGX SET TMGDB=0  ;"Can be changed when stepping through code. | 
|---|
| 262 | IF TMGDB=1 DO | 
|---|
| 263 | . SET TMGX="DO LIST^DIC("_TMGFILE_"," | 
|---|
| 264 | . IF $GET(TMGIENS)'="" SET TMGX=TMGX_""""_TMGIENS_"""" | 
|---|
| 265 | . SET TMGX=TMGX_","""_TMGFLDS_"""," | 
|---|
| 266 | . SET TMGX=TMGX_""""_TMGFLAGS_""","""_TMGMAX_"""," | 
|---|
| 267 | . IF $DATA(TMGFROM) SET TMGX=TMGX_".TMGFROM" | 
|---|
| 268 | . SET TMGX=TMGX_"," | 
|---|
| 269 | . IF $DATA(TMGPART) SET TMGX=TMGX_".TMGPART" | 
|---|
| 270 | . SET TMGX=TMGX_","""_$$QTPROTECT^TMGSTUTL(TMGCOMPEXPR)_"""," | 
|---|
| 271 | . IF $GET(TMGSCR)'="" SET TMGMAX=TMGMAX_""""_TMGSCR_"""" | 
|---|
| 272 | . SET TMGX=TMGX_"," | 
|---|
| 273 | . IF $GET(TMGID)'="" SET TMGMAX=TMGMAX_""""_TMGID_"""" | 
|---|
| 274 | . SET TMGX=TMGX_"," | 
|---|
| 275 | . SET TMGX=TMGX_"""TMGRSLT"",""TMGMSG"")" | 
|---|
| 276 | DO LIST^DIC(TMGFILE,TMGIENS,TMGFLDS,TMGFLAGS,TMGMAX,.TMGFROM,.TMGPART,TMGCOMPEXPR,TMGSCR,TMGID,"TMGRSLT","TMGMSG") | 
|---|
| 277 | NEW BYROOT SET BYROOT=+$GET(TMGOPTION("BYROOT")) | 
|---|
| 278 | NEW OUTROOT | 
|---|
| 279 | IF BYROOT SET OUTROOT=TMGOUT | 
|---|
| 280 | ELSE  SET OUTROOT="TMGOUT" | 
|---|
| 281 | KILL @OUTROOT | 
|---|
| 282 | IF $DATA(TMGMSG("DIERR")) DO  GOTO FMSDN | 
|---|
| 283 | . MERGE @OUTROOT@("ERR")=TMGMSG("DIERR") ;"copy in errors, if any | 
|---|
| 284 | . SET TMGRESULT=0 | 
|---|
| 285 | MERGE @OUTROOT@(0)=TMGRSLT("DILIST",0) | 
|---|
| 286 | NEW I SET I=0 | 
|---|
| 287 | NEW IENPCE SET IENPCE=0 | 
|---|
| 288 | FOR I=1:1:999 IF $PIECE(TMGRSLT("DILIST",0,"MAP"),"^",I)="IEN" SET IENPCE=I QUIT | 
|---|
| 289 | SET I=0 FOR  SET I=$ORDER(TMGRSLT("DILIST",I)) QUIT:(+I'>0)  DO | 
|---|
| 290 | . NEW VALUE SET VALUE=$GET(TMGRSLT("DILIST",I,0)) | 
|---|
| 291 | . NEW IEN SET IEN=$PIECE(VALUE,"^",IENPCE) | 
|---|
| 292 | . SET @OUTROOT@(IEN)=VALUE | 
|---|
| 293 | MERGE @OUTROOT@("ID")=TMGRSLT("ID") ;"Copy in identifiers, if any | 
|---|
| 294 | SET TMGRESULT=+$PIECE(TMGRSLT("DILIST",0),"^",1) | 
|---|
| 295 | FMSDN   QUIT TMGRESULT | 
|---|
| 296 | ; | 
|---|
| 297 | ; | 
|---|
| 298 | FIXSET(TMGIN,TARGETFN,SRCHFILE,FLDS,TMG1SET) ; | 
|---|
| 299 | ;"Purpose: Change output of FMSRCH into needed format. | 
|---|
| 300 | ;"         Note: FMSRCH() won't allow ouput fields in format of .02:.01:.1 etc. | 
|---|
| 301 | ;"Input: TMGIN -- PASS BY REFERENCE.  The results of FMSRCH.  Format: | 
|---|
| 302 | ;"                TMGIN(SrchFileIEN)=SrchFileIEN^FieldValue  <-- FieldValue is a pointer/IEN | 
|---|
| 303 | ;"       TARGETFN -- The this the target file number. | 
|---|
| 304 | ;"       SRCHFILE -- The file that the results are from. | 
|---|
| 305 | ;"       FLDS --  The desired fields.  e.g. .02,  or .02:.01 etc. | 
|---|
| 306 | ;"       TMG1SET -- PASS BY REFERENCE.  AN OUT PARAMETER.  Prior results killed | 
|---|
| 307 | ;"              TMG1SET(SrchFileIEN)="" | 
|---|
| 308 | ;"              TMG1SET(SrchFileIEN)="" | 
|---|
| 309 | ;"              TMG1SET("DETAILS",TargetFileIEN,SrchFileNum,SrchFileIEN) | 
|---|
| 310 | ;"              TMG1SET("DETAILS",TargetFileIEN,SrchFileNum,SrchFileIEN) | 
|---|
| 311 | ;"Results: 0 if OK, or -1^Message if error. | 
|---|
| 312 | KILL TMG1SET | 
|---|
| 313 | NEW RESULT SET RESULT=0 | 
|---|
| 314 | NEW VALUE | 
|---|
| 315 | NEW ERR SET ERR=0 | 
|---|
| 316 | NEW IEN SET IEN=0 | 
|---|
| 317 | FOR  SET IEN=$ORDER(TMGIN(IEN)) QUIT:(+IEN'>0)!(+RESULT=-1)  DO | 
|---|
| 318 | . IF SRCHFILE'=TARGETFN DO | 
|---|
| 319 | . . SET VALUE=$PIECE($GET(TMGIN(IEN)),"^",2) QUIT:(+VALUE'>0) | 
|---|
| 320 | . . IF FLDS[":" SET VALUE=$$RESOLV(SRCHFILE,FLDS,VALUE,.ERR) | 
|---|
| 321 | . ELSE  DO | 
|---|
| 322 | . . SET VALUE=+$GET(TMGIN(IEN)) | 
|---|
| 323 | . QUIT:(+VALUE'>0) | 
|---|
| 324 | . IF +ERR=-1 SET RESULT=ERR QUIT | 
|---|
| 325 | . SET TMG1SET(VALUE)="" | 
|---|
| 326 | . SET TMG1SET("DETAILS",VALUE,SRCHFILE,IEN)="" ;"<-- Value=IEN in target file, IEN=IEN in SRCHFILE | 
|---|
| 327 | QUIT RESULT | 
|---|
| 328 | ; | 
|---|
| 329 | RESOLV(FILE,FLDSTR,IEN,ERR) ;"  NOTE: THIS NEEDS TO BE COMPILED.  INEFFECIENT TO DO EACH TIME. | 
|---|
| 330 | ;"Purpose: To follow pointer path to final value. | 
|---|
| 331 | ;"Input: FILE -- File that IEN is in. | 
|---|
| 332 | ;"       FLDSTR -- e.g. ".02:.01:10:.01" | 
|---|
| 333 | ;"       IEN -- This is the value in FILE of the first field in FLDSTR (e.g. ".02") | 
|---|
| 334 | ;"       ERR -- PASS BY REFERENCE.  AN OUT PARAMETER.  -1^Err Msg, if any | 
|---|
| 335 | ;"Result: Returns resolved value (INTERNAL FORMAT) | 
|---|
| 336 | NEW P2FILE,INFO | 
|---|
| 337 | SET ERR="" | 
|---|
| 338 | NEW RESULT SET RESULT="" | 
|---|
| 339 | IF FLDSTR[":" DO  GOTO:(+ERR=-1) RLVDN | 
|---|
| 340 | . NEW ZNODE SET ZNODE=$GET(^DD(FILE,+FLDSTR,0)) | 
|---|
| 341 | . IF ZNODE="" DO  QUIT | 
|---|
| 342 | . . SET ERR="-1^Can't find declaration in DD for File #"_FILE_", FLD #"_+FLDSTR | 
|---|
| 343 | . SET INFO=$PIECE(ZNODE,"^",2) | 
|---|
| 344 | . SET P2FILE=+$PIECE(INFO,"P",2) | 
|---|
| 345 | . IF P2FILE'>0 DO  QUIT | 
|---|
| 346 | . . SET ERR="-1^File #"_FILE_", FLD #"_+FLDSTR_" is not a pointer field." | 
|---|
| 347 | . NEW ROOT SET ROOT="^"_$PIECE(ZNODE,"^",3)_IEN_")" | 
|---|
| 348 | . NEW NEXTFLDS SET NEXTFLDS=$PIECE(FLDSTR,":",2,999) | 
|---|
| 349 | . SET ZNODE=$GET(^DD(P2FILE,+NEXTFLDS,0)) | 
|---|
| 350 | . NEW NODE SET NODE=$PIECE($PIECE(ZNODE,"^",4),";",1) | 
|---|
| 351 | . NEW PCE SET PCE=$PIECE($PIECE(ZNODE,"^",4),";",2) | 
|---|
| 352 | . NEW NEXTIEN SET NEXTIEN=$PIECE($GET(@ROOT@(NODE)),"^",PCE) | 
|---|
| 353 | . SET RESULT=$$RESOLV(P2FILE,NEXTFLDS,NEXTIEN,.ERR) | 
|---|
| 354 | ELSE  SET RESULT=IEN | 
|---|
| 355 | RLVDN   QUIT RESULT | 
|---|
| 356 | ; | 
|---|
| 357 | DOCOMB(COMB,TMG1SET,PRESULT) ; | 
|---|
| 358 | ;"Purpose: combine TMG1SET with @PRESULT based on logical operation COMBiner | 
|---|
| 359 | ;"Input: COMB= &, !, &' | 
|---|
| 360 | ;"       TMG1SET -- PASS BY REFERENCE. | 
|---|
| 361 | ;"       PRESULT -- PASS BY NAME. | 
|---|
| 362 | IF COMB="!" MERGE @PRESULT=TMG1SET | 
|---|
| 363 | ELSE  IF COMB="&" DO | 
|---|
| 364 | . NEW TEMPSET | 
|---|
| 365 | . NEW I SET I=0 | 
|---|
| 366 | . FOR  SET I=$ORDER(TMG1SET(I)) QUIT:(+I'>0)  DO | 
|---|
| 367 | . . IF $DATA(@PRESULT@(I))=0 QUIT | 
|---|
| 368 | . . SET TEMPSET(I)="" | 
|---|
| 369 | . . MERGE TEMPSET("DETAILS",I)=TMG1SET("DETAILS",I) | 
|---|
| 370 | . . MERGE TEMPSET("DETAILS",I)=@PRESULT@("DETAILS",I) | 
|---|
| 371 | . KILL @PRESULT MERGE @PRESULT=TEMPSET | 
|---|
| 372 | ELSE  IF COMB="&'" DO | 
|---|
| 373 | . NEW I SET I=0 | 
|---|
| 374 | . FOR  SET I=$ORDER(TMG1SET(I)) QUIT:(+I'>0)  DO | 
|---|
| 375 | . . KILL @PRESULT@(I)  ;"Remove any entry in TMG1SET from @PRESULT@ | 
|---|
| 376 | . KILL @PRESULT MERGE @PRESULT=TEMPSET | 
|---|
| 377 | QUIT | 
|---|
| 378 |  | 
|---|