[796] | 1 | TMGSRCH ;TMG/kst/Search API ; 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 | ;"SRCH(OUT,FILENUM,STR) --A search function, to support calls by RPC from CPRS
|
---|
| 14 | ;"BKSRCH(FILENUM,STR) -- designed to be called via JOB --> separate job thread
|
---|
| 15 | ;"FMSRCH(OUT,FILENUM,COMPEXPR) --A wrapper for Fileman search call
|
---|
| 16 | ;"=======================================================================
|
---|
| 17 | ;"PRIVATE API FUNCTIONS
|
---|
| 18 | ;"=======================================================================
|
---|
| 19 | ;"PARSESTR(FILENUM,STR,ARRAY,FNUMPTR) -- Parse user input into formatted array
|
---|
| 20 | ;"PARSE1(FILENUM,STR,FNUMPTR,ARRAY) --Parse a simple search term
|
---|
| 21 | ;"BKPGFN(MSG,PCT) -- Callable progress function code for background thread.
|
---|
| 22 | ;"DOSRCH(PTMGOUT,FILENUM,STR,PGFN) --Common search codes
|
---|
| 23 | ;"=======================================================================
|
---|
| 24 | ;"=======================================================================
|
---|
| 25 | ;"Dependencies:
|
---|
| 26 | ;" TMGDBAPI, DIE, XLFSTR, TMGSRCH0, TMGSRCH1, TMGSTUTL
|
---|
| 27 | ;"=======================================================================
|
---|
| 28 | ;"=======================================================================
|
---|
| 29 | ;
|
---|
| 30 | ;
|
---|
| 31 | ;"=======================================================================
|
---|
| 32 | ;" SEARCH STRING DOCUMENTATION
|
---|
| 33 | ;"=======================================================================
|
---|
| 34 | ;"Search string examples:
|
---|
| 35 | ;" 8925:.02(.01="SMITH,JOHN")
|
---|
| 36 | ;" 1234:.01(.03in"32..55") <-- this is a range test
|
---|
| 37 | ;" 1234:.99((.01="SMITH,JOHN") OR (.01="SMITH,BILL")) AND 4567:.01(.02'="4/2/10") NOT (1["HAPPY")
|
---|
| 38 | ;" 8925:(REPORT TEXT[DM-2)!(REPORT TEXT[HTN) AND 120.5:((VITAL TYPE=PULSE)&(RATE>70)) Targetfile=2
|
---|
| 39 | ;"
|
---|
| 40 | ;"SYNTAX:
|
---|
| 41 | ;" -- File specifier. To specify searching in a file OTHER THAN target filenumber, an optional
|
---|
| 42 | ;" FILENUM:FLD[:FLD[:FLD...]] may be specified. However, ultimately, this must point back
|
---|
| 43 | ;" to the target filenumber. E.g. Search in file 8925, but for each entry found, use the IEN
|
---|
| 44 | ;" specified by FLD (or FLDA:FLDB or FLDA:FLDB:FLDC:...). NOTE: If just FILENUM is provided
|
---|
| 45 | ;" without specifying FLD(s) to point to target filenumber, then the code will find a path
|
---|
| 46 | ;" (if possible), using first one found.
|
---|
| 47 | ;" FILENUM:(...)
|
---|
| 48 | ;" The logic is read from left to right, honoring parentheses. If a filenumber
|
---|
| 49 | ;" is not specified, then the last specified filenumber is used.
|
---|
| 50 | ;" E.g. 1234:.01( LogicA ) OR 234:.99( LogicB ) AND ( LogicC )
|
---|
| 51 | ;" LogicA fields refer to file 1234:.01.
|
---|
| 52 | ;" LogicB fields refer to file 234:.99
|
---|
| 53 | ;" LogicA fields refer to file 234:.99 (last specified file number)
|
---|
| 54 | ;" E.g. 5678:.01( (LogicA1) OR 5432:.88(LogicA2) NOT (LogicA3) ) or (LogicB)
|
---|
| 55 | ;" LogicA1 fields refer to file 5678:.01
|
---|
| 56 | ;" LogicA2 fields refer to file 5432:.88
|
---|
| 57 | ;" LogicA3 fields refer to file 5432:.88 (last specified file number inside parentheses)
|
---|
| 58 | ;" LogicB fields refer to file 5678 (last specified file number at same parentheses level)
|
---|
| 59 | ;" -- Each individual search term must be enclosed in parentheses, and may contain sub-terms
|
---|
| 60 | ;" enclosed in nested parentheses
|
---|
| 61 | ;" -- Each individual search term is comprised of:
|
---|
| 62 | ;" FIELD then COMPARATOR then VALUE
|
---|
| 63 | ;" 1. FIELDS -- can be name or number. This is for currently active file (see below)
|
---|
| 64 | ;" may also be FIELDA:FIELDB:... when FIELDA is a pointer, then FIELDB
|
---|
| 65 | ;" is taken from the pointed-to file. If FIELDB is not provided, and FIELDA
|
---|
| 66 | ;" is a pointer, then the .01 field of pointed-to-file. Individual field
|
---|
| 67 | ;" names may be inclosed in quotes
|
---|
| 68 | ;" 2. COMPARATOR -- can be:
|
---|
| 69 | ;" "=" -- means exact match
|
---|
| 70 | ;" "'=", "<>", -- any of these means Does-not-equal
|
---|
| 71 | ;" ">=", "'<" -- means greater-than-or-equal-to (same as not-less-than)
|
---|
| 72 | ;" "<=", "'>" -- means less-than-or-equal-to (same sa not-greater-than)
|
---|
| 73 | ;" "in","IN","In","{" -- means field is in specified rage (see Value below)
|
---|
| 74 | ;" When using IN, if field name is provided by NAME (not number),
|
---|
| 75 | ;" then field name should be inclosed in quotes to separate the
|
---|
| 76 | ;" letters of the field name from the letters of 'IN'.
|
---|
| 77 | ;" "[" -- means 'contains'. Interpreted as follows:
|
---|
| 78 | ;" -- For Word processor (WP) fields, this means that any line in the entire field
|
---|
| 79 | ;" can contain search term, to be matched positive.
|
---|
| 80 | ;" -- For free text field, then just text of field is searched.
|
---|
| 81 | ;" 3. VALUE -- The search term to search for. Should be in quotes.
|
---|
| 82 | ;" Note: if comparator is "IN", then syntax is "Value1..Value2"
|
---|
| 83 | ;" There should be a ".." between the two values.
|
---|
| 84 | ;" -- Logical combiners of separate search terms allowed are:
|
---|
| 85 | ;" "OR" or "|" or "||" or "!"
|
---|
| 86 | ;" "AND" or "&" or "&&"
|
---|
| 87 | ;" "NOT" or "'" or "ANDNOT"
|
---|
| 88 | ;"=======================================================================
|
---|
| 89 | ;"=======================================================================
|
---|
| 90 | ;
|
---|
| 91 | ;
|
---|
| 92 | TEST ;
|
---|
| 93 | NEW STR,OUT
|
---|
| 94 | ;"SET STR="8925:(STATUS=COMPLETED)&((PATIENT[CUTSHALL)!(PATIENT[CUTSHAW))"
|
---|
| 95 | SET STR="8925:(REPORT TEXT[DM-2)!(REPORT TEXT[HTN) AND 120.5:((VITAL TYPE=PULSE)&(RATE>70))"
|
---|
| 96 | ;"SET STR="8925:(REPORT TEXT[DM-2) AND 120.5:((VITAL TYPE=PULSE)&(RATE>70))"
|
---|
| 97 | ;"SET STR="8925:(REPORT TEXT[HTN) AND 120.5:((VITAL TYPE=PULSE)&(RATE{70..75))"
|
---|
| 98 | ;"SET STR="8925:(REPORT TEXT[DM-2)!(REPORT TEXT[HTN)"
|
---|
| 99 | ;"WRITE STR,!
|
---|
| 100 | ;"DO SRCH(.OUT,2,STR)
|
---|
| 101 | ;"NEW CT SET CT=+$GET(OUT("COUNT"))
|
---|
| 102 | ;"WRITE "Found ",CT," total matches.",!
|
---|
| 103 | ;
|
---|
| 104 | DO BKSRCH(2,STR)
|
---|
| 105 | NEW STATUS,PCT
|
---|
| 106 | NEW REF SET REF=$NAME(^TMP("TMG","TMGSRCH",$J))
|
---|
| 107 | FOR DO QUIT:(STATUS["#DONE#")
|
---|
| 108 | . HANG 1
|
---|
| 109 | . SET STATUS=$GET(@REF@("MSG"))
|
---|
| 110 | . WRITE "STATUS: ",STATUS,!
|
---|
| 111 | ;"IF $DATA(@REF) ZWR @REF
|
---|
| 112 | QUIT
|
---|
| 113 | ;
|
---|
| 114 | SRCH(OUT,FILENUM,STR) ;
|
---|
| 115 | ;"Purpose: A search function, to support calls by RPC from CPRS
|
---|
| 116 | ;"Input: OUT-- Pass by reference. AN OUT PARAMETER.
|
---|
| 117 | ;" FILENUM -- The target file number that resulting IENs will be in
|
---|
| 118 | ;" STR -- This is a logic string for searching. See details above.
|
---|
| 119 | ;"Results: OUT is filled in. Format:
|
---|
| 120 | ;" OUT(0)=1 for success, or -1^Error Message
|
---|
| 121 | ;" OUT(IEN)=""
|
---|
| 122 | ;" OUT(IEN)=""
|
---|
| 123 | ;" OUT("COUNT")=Count of number of found records.
|
---|
| 124 | ;"Results: None
|
---|
| 125 | ;"
|
---|
| 126 | DO DOSRCH("OUT",.FILENUM,.STR) ;
|
---|
| 127 | SRCHDN QUIT
|
---|
| 128 | ;
|
---|
| 129 | ;
|
---|
| 130 | BKSRCH(FILENUM,STR) ;
|
---|
| 131 | ;"Purpose: this function is designed to be called via JOB, to setup separate job thread
|
---|
| 132 | ;" E.g. JOB BKSRCH^TMGTMGSRCH(FILENUM,STR) NEW MSGJOB SET MSGJOB=$ZJOB
|
---|
| 133 | ;" NOTE: When job, output MSG will be "#DONE#" (see below)
|
---|
| 134 | ;"Input: Filenum: This this is the target file of the search.
|
---|
| 135 | ;" STR -- This is the logic string for searching. Format as per SRCH() docs
|
---|
| 136 | ;"Output: Output will go into ^TMP("TMG","TMGSRCH",$J,"OUT")
|
---|
| 137 | ;" Messages will go into ^TMP("TMG","TMGSRCH",$J,"MSG")
|
---|
| 138 | ;" % Done will go into ^TMP("TMG","TMGSRCH",$J,"PCT")
|
---|
| 139 | ;"Results: none
|
---|
| 140 | NEW PGFN SET PGFN="DO BKPGFN^TMGSRCH(.TMGSTAT,.TMGPCT)"
|
---|
| 141 | NEW POUT SET POUT=$NAME(^TMP("TMG","TMGSRCH",$J,"OUT"))
|
---|
| 142 | KILL @POUT
|
---|
| 143 | DO DOSRCH(POUT,.FILENUM,.STR,PGFN) ;
|
---|
| 144 | DO BKPGFN("#DONE#",100)
|
---|
| 145 | QUIT ;"This should terminate thread (if called by JOB as above)
|
---|
| 146 | ;
|
---|
| 147 | BKPGFN(MSG,PCT) ;
|
---|
| 148 | ;"Callable progress function code for background thread.
|
---|
| 149 | SET ^TMP("TMG","TMGSRCH",$J,"MSG")=$GET(MSG)
|
---|
| 150 | SET ^TMP("TMG","TMGSRCH",$J,"PCT")=$GET(PCT)
|
---|
| 151 | QUIT
|
---|
| 152 | ;
|
---|
| 153 | ;
|
---|
| 154 | DOSRCH(PTMGOUT,FILENUM,STR,PGFN) ;
|
---|
| 155 | ;"Common entry endpoint for search entry tags. See docs in SRCH()
|
---|
| 156 | ;"Input: PTMGOUT -- Pass by NAME. The name of the output array
|
---|
| 157 | ;" FILENUM -- See SRCH()
|
---|
| 158 | ;" STR -- See SRCH()
|
---|
| 159 | ;" TMGPGFN -- OPTIONAL. Mumps code that will be called periodically
|
---|
| 160 | ;" to allow display of progress of slow searches.
|
---|
| 161 | ;" Code may depend on the following variables:
|
---|
| 162 | ;" TMGSTAT -- The most recent status text
|
---|
| 163 | ;" TMGPCT -- a very gross estimate of % done (0-100%)
|
---|
| 164 | ;"Results -- None.
|
---|
| 165 | NEW TMGARRAY,RESULT,CT
|
---|
| 166 | SET RESULT=$$PARSESTR(.FILENUM,STR,.TMGARRAY)
|
---|
| 167 | ;
|
---|
| 168 | ;"MERGE ^TMG("TMP","RPC","TMGRPCSR","TMGARRAY")=TMGARRAY ;"TEMP!!!
|
---|
| 169 | ;
|
---|
| 170 | IF +RESULT=-1 SET @PTMGOUT@(0)=RESULT GOTO DSRCHDN
|
---|
| 171 | SET CT=$$ARRYSRCH^TMGSRCH0(FILENUM,PTMGOUT,.TMGARRAY,.PGFN)
|
---|
| 172 | SET @PTMGOUT@("COUNT")=CT
|
---|
| 173 | SET @PTMGOUT@("FILENUM")=FILENUM
|
---|
| 174 | IF $GET(@PTMGOUT@(0))="" SET @PTMGOUT@(0)=1 ;"Success
|
---|
| 175 | DSRCHDN QUIT
|
---|
| 176 | ;
|
---|
| 177 | ;
|
---|
| 178 | PARSESTR(FILENUM,STR,ARRAY,FNUMPTR) ;
|
---|
| 179 | ;"Purpose: To take user input, validate it, and parse into an formatted array
|
---|
| 180 | ;"Input: FILENUM -- The file number that is the target of the search.
|
---|
| 181 | ;" STR: This is the user input string. Format as documented in SRCH() above.
|
---|
| 182 | ;" ARRAY -- PASS BY REFERENCE. An OUT PARAMETER. Format as follows.
|
---|
| 183 | ;" ARRAY(1,"FNUMPTR")= FNUM:FLDA[:FLDB[:FLDC...]] FNUM is filenumber that
|
---|
| 184 | ;" contain search field, and then fields used to point
|
---|
| 185 | ;" back to *TARGET* FILENUM for entire search
|
---|
| 186 | ;" ARRAY(1,"FLD")=Fieldnumber to search
|
---|
| 187 | ;" ARRAY(1,"COMP")=Comparator, will be "=", "'=", "'<", or "'>", "[", "{", "IN"
|
---|
| 188 | ;" ARRAY(1,"SRCH")=The value of to be used in search.
|
---|
| 189 | ;" ARRAY(1,"WP")=1 if field is a WP field
|
---|
| 190 | ;" ARRAY(2,...) The second search term.
|
---|
| 191 | ;" ARRAY(2,"LOGIC")=#^Combiner
|
---|
| 192 | ;" # means the set so far.
|
---|
| 193 | ;" Combiner will be "AND", "OR", or "NOT"
|
---|
| 194 | ;" ARRAY(3,...) The third search term (which is comprised of sub terms)
|
---|
| 195 | ;" ARRAY(3,1,... The first subterm (same format as higher level)
|
---|
| 196 | ;" ARRAY(3,2,... The second subterm (same format as higher level)
|
---|
| 197 | ;" ARRAY(n,...) The N'th search term.
|
---|
| 198 | ;" removed-> ARRAY("SETCOMP",i)= NumA^Combiner^NumB
|
---|
| 199 | ;" NumA and NumB refer to seach term number (e.g. 1, 2, ... n above)
|
---|
| 200 | ;" If NumA="#", then it means 'the resulting set of results so far'
|
---|
| 201 | ;" Combiner will be "AND", "OR", or "NOT"
|
---|
| 202 | ;" i is the index variable, and logic should be evaluated in numerical order
|
---|
| 203 | ;" FNUMPTR: Will be used when calling self reiteratively. Leave blank in first call.
|
---|
| 204 | ;" DON'T pass by reference. This is 'FileNum:FLD[:FLD[:FLD...]] specifier
|
---|
| 205 | ;"Results: 1 if OK, or -1^Message if error during processing.
|
---|
| 206 | ;
|
---|
| 207 | NEW SUBSTRA,SUBSTRB,POS
|
---|
| 208 | NEW RESULT SET RESULT=1 ;"default to success
|
---|
| 209 | NEW TERMNUM SET TERMNUM=0
|
---|
| 210 | SET FILENUM=+$GET(FILENUM)
|
---|
| 211 | IF FILENUM'>0 DO GOTO PSDN
|
---|
| 212 | . SET RESULT="-1^Target file number not provided."
|
---|
| 213 | SET FNUMPTR=$GET(FNUMPTR,FILENUM)
|
---|
| 214 | SET ARRAY("FILE")=FILENUM
|
---|
| 215 | NEW LOGICNUM SET LOGICNUM=0
|
---|
| 216 | NEW DONE SET DONE=0
|
---|
| 217 | FOR DO QUIT:(DONE=1)!(+RESULT=-1)
|
---|
| 218 | . NEW TEMPARRAY
|
---|
| 219 | . SET TERMNUM=TERMNUM+1
|
---|
| 220 | . ;"--- Get file number, if any
|
---|
| 221 | . SET STR=$$TRIM^XLFSTR(STR)
|
---|
| 222 | . IF +$PIECE(STR,"(",1)>0 DO QUIT:(+RESULT=-1)
|
---|
| 223 | . . SET FNUMPTR=$PIECE(STR,"(",1) ;"Convert 1234:.01:.02:(...) --> 1234:.01:.02:
|
---|
| 224 | . . IF $EXTRACT(FNUMPTR,$LENGTH(FNUMPTR))=":" SET FNUMPTR=$EXTRACT(FNUMPTR,1,$LENGTH(FNUMPTR)-1)
|
---|
| 225 | . . IF ($PIECE(FNUMPTR,":",2)="")&(+FNUMPTR'=FILENUM) DO QUIT:(+RESULT=-1)
|
---|
| 226 | . . . NEW SAVPTR SET SAVPTR=FNUMPTR
|
---|
| 227 | . . . SET FNUMPTR=$PIECE($$PATHTO^TMGSRCH1(+FNUMPTR,FILENUM),"^",1)
|
---|
| 228 | . . . IF FNUMPTR="" SET RESULT="-1^Unable to find path to file #"_FILENUM_" from "_SAVPTR
|
---|
| 229 | . . ELSE IF $$FNPTR^TMGSRCH1(FNUMPTR)'=FILENUM DO QUIT
|
---|
| 230 | . . . SET RESULT="-1^'"_FNUMPTR_"' points to file #"_$$FNPTR^TMGSRCH1(FNUMPTR)_", not file #"_FILENUM_" as expected"
|
---|
| 231 | . ;"Split STR --> SUBSTRA + SUBSTRB
|
---|
| 232 | . SET SUBSTRA=$$MATCHXTR^TMGSTUTL(STR,"(",,,"(")
|
---|
| 233 | . IF SUBSTRA="" SET DONE=1 QUIT
|
---|
| 234 | . SET POS=$FIND(STR,SUBSTRA) ;"Return pos of following character
|
---|
| 235 | . SET SUBSTRB=$EXTRACT(STR,POS+1,9999) ;"Should be " [LOGICTERM] [SearchTerm]..."
|
---|
| 236 | . ;"Process SUBSTRA, either directly if single term, or recursively if compound term.
|
---|
| 237 | . IF $$HNQTSUB^TMGSTUTL(SUBSTRA,"(") DO
|
---|
| 238 | . . SET RESULT=$$PARSESTR(FILENUM,SUBSTRA,.TEMPARRAY,FNUMPTR)
|
---|
| 239 | . . SET ARRAY(TERMNUM,"SUBTERMS")=1
|
---|
| 240 | . ELSE DO
|
---|
| 241 | . . SET RESULT=$$PARSE1(FILENUM,SUBSTRA,FNUMPTR,.TEMPARRAY)
|
---|
| 242 | . IF +RESULT=-1 QUIT
|
---|
| 243 | . SET SUBSTRA=""
|
---|
| 244 | . MERGE ARRAY(TERMNUM)=TEMPARRAY
|
---|
| 245 | . ;"Now get Logic term connecting this to next term (if any)
|
---|
| 246 | . SET SUBSTRB=$$TRIM^XLFSTR(SUBSTRB) ;"Remove opening (and closing) spaces
|
---|
| 247 | . NEW LOGICTERM SET LOGICTERM=""
|
---|
| 248 | . NEW P,CH
|
---|
| 249 | . NEW DNCOMB SET DNCOMB=0
|
---|
| 250 | . FOR P=1:1:$LENGTH(SUBSTRB) DO QUIT:DNCOMB!(+RESULT=-1)
|
---|
| 251 | . . SET CH=$$UP^XLFSTR($EXTRACT(SUBSTRB,P))
|
---|
| 252 | . . IF ("&|'!ANDORNOT"'[CH) SET DNCOMB=1 QUIT
|
---|
| 253 | . . SET LOGICTERM=LOGICTERM_CH
|
---|
| 254 | . SET STR=$EXTRACT(SUBSTRB,$LENGTH(LOGICTERM)+1,9999),SUBSTRB=""
|
---|
| 255 | . IF LOGICTERM="" QUIT
|
---|
| 256 | . SET LOGICTERM=$$FIXCOMB^TMGSRCH1(LOGICTERM,.RESULT) QUIT:(+RESULT=-1)
|
---|
| 257 | . NEW CURSET SET CURSET=$SELECT(TERMNUM=1:"1",1:"#")
|
---|
| 258 | . SET LOGICNUM=LOGICNUM+1
|
---|
| 259 | . ;"SET ARRAY("SETCOMP",LOGICNUM)=CURSET_"^"_LOGICTERM_"^"_(TERMNUM+1) ;"will check later that TERMNUM+1 is supplied
|
---|
| 260 | . SET ARRAY(TERMNUM+1,"LOGIC")="#^"_LOGICTERM
|
---|
| 261 | PSDN QUIT RESULT
|
---|
| 262 | ;
|
---|
| 263 | ;
|
---|
| 264 | PARSE1(FILENUM,STR,FNUMPTR,ARRAY) ;
|
---|
| 265 | ;"Purpose: Parse a simple search term (e.g. .01="SMITH,JOHN"). Also validate that field exists in file.
|
---|
| 266 | ;"Input: FILENUM -- The TARGET filenumber that the entire search is referencing.
|
---|
| 267 | ;" STR: This is part of the user input string to parse
|
---|
| 268 | ;" FNUMPTR: FNUM:FLDA[:FLDB[:FLDC...]] FNUM is filenumber that contain search field, and then
|
---|
| 269 | ;" fields used to point back to *TARGET* FILENUM for entire search
|
---|
| 270 | ;" ARRAY -- PASS BY REFERENCE. An OUT PARAMETER. Format as follows.
|
---|
| 271 | ;" ARRAY("FNUMPTR")=Filenumber that contains field)
|
---|
| 272 | ;" ARRAY("FLD")=Fieldnumber to search
|
---|
| 273 | ;" ARRAY("COMP")=Comparator, will be "=", "'=", "'<", or "'>", "[","IN", "{"
|
---|
| 274 | ;" ARRAY("SRCH")=The value of to be used in search.
|
---|
| 275 | ;" ARRAY("WP")=1 if field is a WP field
|
---|
| 276 | ;"NOTE: If field specifies a DATE, then the search value will be converted to FileMan format
|
---|
| 277 | ;"Results: 1 if OK, or -1^Message if error during processing.
|
---|
| 278 | ;"
|
---|
| 279 | NEW RESULT SET RESULT=1 ;"default to success
|
---|
| 280 | NEW SAV SET SAV=STR
|
---|
| 281 | SET STR=$$TRIM^XLFSTR($GET(STR))
|
---|
| 282 | SET ARRAY("FNUMPTR")=FNUMPTR
|
---|
| 283 | NEW FLD,FLDS SET FLDS=""
|
---|
| 284 | NEW TMGTFILE SET TMGTFILE=+FNUMPTR
|
---|
| 285 | FOR QUIT:("'<>=[:({"[$EXTRACT(STR,1))!(STR="") DO
|
---|
| 286 | . SET FLD=$$GETFLD^TMGSRCH1(.STR) ;
|
---|
| 287 | . NEW SAVFIL SET SAVFIL=TMGTFILE
|
---|
| 288 | . NEW ONEFLD SET ONEFLD=$$FLDNUM^TMGSRCH1(.TMGTFILE,.FLD)
|
---|
| 289 | . IF ONEFLD'>0 DO QUIT
|
---|
| 290 | . . SET RESULT="-1^Field ["_FLD_"] was not found in file ["_SAVFIL_"]"
|
---|
| 291 | . IF FLDS'="" SET FLDS=FLDS_":"
|
---|
| 292 | . SET FLDS=FLDS_ONEFLD
|
---|
| 293 | IF +RESULT=-1 GOTO PS1DN
|
---|
| 294 | SET ARRAY("FLD")=FLDS
|
---|
| 295 | IF $$ISWPFLD^TMGDBAPI(+FNUMPTR,+FLDS) SET ARRAY("WP")=1
|
---|
| 296 | NEW FLDTYPE SET FLDTYPE=$PIECE($GET(^DD(+FNUMPTR,+FLDS,0)),"^",2)
|
---|
| 297 | IF FLDTYPE["M" DO GOTO PS1DN
|
---|
| 298 | . SET RESULT="-1^Searches in fields that are MULTIPLES not supported"
|
---|
| 299 | SET STR=$$TRIM^XLFSTR(STR)
|
---|
| 300 | NEW COMP
|
---|
| 301 | IF $$UP^XLFSTR($EXTRACT(STR,1,3))="'IN" SET COMP="'IN"
|
---|
| 302 | ELSE IF $$UP^XLFSTR($EXTRACT(STR,1,2))="IN" SET COMP="IN"
|
---|
| 303 | ELSE DO
|
---|
| 304 | . SET COMP="" NEW P,CH
|
---|
| 305 | . FOR P=1:1:$LENGTH(STR) SET CH=$EXTRACT(STR,P) QUIT:("'!<>=[{"'[CH) SET COMP=COMP_CH
|
---|
| 306 | SET STR=$EXTRACT(STR,$LENGTH(COMP)+1,9999)
|
---|
| 307 | SET COMP=$$FIXCOMP^TMGSRCH1(COMP,.RESULT)
|
---|
| 308 | IF +RESULT=-1 GOTO PS1DN
|
---|
| 309 | SET ARRAY("COMP")=COMP
|
---|
| 310 | SET STR=$$TRIM^XLFSTR(STR) ;"Remove any spaces after comparator
|
---|
| 311 | NEW SRCH SET SRCH=$$TRIM^XLFSTR(STR,,"""") ;"Trim quotes, if any.
|
---|
| 312 | IF FLDTYPE["D" DO GOTO:(+RESULT=-1) PS1DN ;"standardized dates
|
---|
| 313 | . NEW ADATE SET ADATE=SRCH
|
---|
| 314 | . NEW TEMPRSLT SET TEMPRSLT=""
|
---|
| 315 | . FOR QUIT:(ADATE="")!(+RESULT=-1) DO
|
---|
| 316 | . . IF TEMPRSLT'="" SET TEMPRSLT=TEMPRSLT_".."
|
---|
| 317 | . . SET TEMPRSLT=TEMPRSLT_$$STDDATE^TMGSRCH1($PIECE(ADATE,"..",1),.RESULT)
|
---|
| 318 | . . IF +RESULT=-1 QUIT
|
---|
| 319 | . . SET ADATE=$PIECE(SRCH,"..",2)
|
---|
| 320 | . SET SRCH=TEMPRSLT
|
---|
| 321 | ELSE IF FLDTYPE["S" DO ;"Convert FM SET type into internal format
|
---|
| 322 | . NEW OUT,TMGMSG
|
---|
| 323 | . DO VAL^DIE(+FNUMPTR,"+1,",FLD,"E",SRCH,.OUT,,"TMGMSG")
|
---|
| 324 | . SET SRCH=$GET(OUT)
|
---|
| 325 | IF SRCH'="" SET ARRAY("SRCH")=SRCH
|
---|
| 326 | ELSE DO GOTO PS1DN
|
---|
| 327 | . SET RESULT="-1^Search value is invalid"
|
---|
| 328 | ;
|
---|
| 329 | PS1DN IF +RESULT=-1 SET RESULT=RESULT_", found in ["_SAV_"]"
|
---|
| 330 | QUIT RESULT
|
---|
| 331 | ;
|
---|
| 332 | ;
|
---|
| 333 | FMSRCH(TMGFILE,TMGCOMPEXPR,TMGOUT,TMGOPTION) ;
|
---|
| 334 | QUIT $$FMSRCH^TMGSRCH0(.TMGFILE,.TMGCOMPEXPR,.TMGOUT,.TMGOPTION)
|
---|
| 335 |
|
---|