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 |
|
---|