1 | TMGSELED ;TMG/kst/Group record selected editer ;03/25/06
|
---|
2 | ;;1.0;TMG-LIB;**1**;01/25/07
|
---|
3 |
|
---|
4 | ;"TMG -- Group record selected editer
|
---|
5 | ;"Kevin Toppenberg MD
|
---|
6 | ;"GNU General Public License (GPL) applies
|
---|
7 | ;"1-25-2007
|
---|
8 |
|
---|
9 | ;"=======================================================================
|
---|
10 | ;" API -- Public Functions.
|
---|
11 | ;"=======================================================================
|
---|
12 | ;"ASKSELED -- A record group selecter/editor, with asking user for options
|
---|
13 | ;"ASK1ED -- A record editor
|
---|
14 | ;"$$SELED(Options) -- entry point for group selecting and editing of records
|
---|
15 | ;" Options -- PASS BY REFERENCE. Format:
|
---|
16 | ;" Options("FILE")=Filenumber^FileName
|
---|
17 | ;" Options("FIELDS","MAX NUM")=MaxDisplaySequenceNumber
|
---|
18 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
19 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
20 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
21 | ;" Options("IEN LIST",IEN in FILE)=""
|
---|
22 | ;" Options("IEN LIST",IEN in FILE)=""
|
---|
23 | ;" Options("IEN LIST",IEN in FILE,"SEL")="" ;"<-- Optional. Makes preselected
|
---|
24 | ;" Note: alternative Format
|
---|
25 | ;" Options("FIELDS",DisplaySequence)=FldNum:FldNum2:FldNum3^Width
|
---|
26 | ;" FldNum:FldNum2:FldNum3 means FldNum is ptr to file2, and
|
---|
27 | ;" FldNum2 is in file2. This value is a pointer to file3, and
|
---|
28 | ;" FldNum3 is a value in file3
|
---|
29 | ;"
|
---|
30 | ;"$$EditRecs(pList,Options,LookupFn) -- get new values for fields in records
|
---|
31 | ;"$$GetFields(Options) -- Interact with user to choose fields, and their display widths
|
---|
32 |
|
---|
33 | ;"=======================================================================
|
---|
34 | ;" Private Functions.
|
---|
35 | ;"=======================================================================
|
---|
36 | ;"GetIENs(Options) -- Interact with user to choose IENs to be edited
|
---|
37 |
|
---|
38 | ;"GetFldVScreen(File,FieldNum,ScrnCode,pResults,Flags) -- get List of IENs in File matching ScreenCode
|
---|
39 | ;"GetFldValue(File,FieldNum,Value,pResults) --get List of IENs in File with missing Field
|
---|
40 | ;"FixValue(pList,FileNum,FieldNum) -- Ask user for a valid value & apply to all entries in pList
|
---|
41 |
|
---|
42 |
|
---|
43 |
|
---|
44 | ASKSELED
|
---|
45 | ;"Scope: PUBLIC
|
---|
46 | ;"Purpose: A record group selecter/editor
|
---|
47 | ;"Input: None
|
---|
48 | ;"Output: Data in database may be edited.
|
---|
49 | ;"Results: none
|
---|
50 |
|
---|
51 | write !,"Group Select-and-Edit Routine",!
|
---|
52 | write "-------------------------------",!
|
---|
53 | write "Here are the steps we will go through . . .",!
|
---|
54 | write "Step #1. Pick FILE to browse",!
|
---|
55 | write "Step #2. Pick FIELDS to show when browsing",!
|
---|
56 | write "Step #3. Pick Records to browse from",!
|
---|
57 | write "Step #4. Select sepecific Records to edit",!
|
---|
58 | write "Step #5. Edit values in selected records",!
|
---|
59 | write "Loop back to Step #4",!
|
---|
60 |
|
---|
61 | new DIC,X,Y
|
---|
62 | new FileNum,IEN
|
---|
63 | new UseDefault set UseDefault=1
|
---|
64 |
|
---|
65 | ;"Pick file to edit from
|
---|
66 | ASK1 set DIC=1
|
---|
67 | set DIC(0)="AEQM"
|
---|
68 | if UseDefault do ;"leave the redundant do loop, it protects $T, so second do ^DIC isn't called
|
---|
69 | . do ^DICRW ;" ^DICRW has default value of user's last response
|
---|
70 | else do ^DIC ;"^DIC doesn't use a default value...
|
---|
71 | write !
|
---|
72 | if +Y'>0 write ! goto ASKDone
|
---|
73 |
|
---|
74 | new Options
|
---|
75 | set Options("FILE")=Y
|
---|
76 | if $$GetFields(.Options)=0 goto ASKDone
|
---|
77 | if $$GetWidths(.Options)=0 goto ASKDone
|
---|
78 |
|
---|
79 | ASK2 if $$GetIENs(.Options)=0 goto ASKDone
|
---|
80 |
|
---|
81 | if $$SELED(.Options)=2 goto ASK2
|
---|
82 |
|
---|
83 | ASKDone
|
---|
84 | quit
|
---|
85 |
|
---|
86 |
|
---|
87 | ASK1ED
|
---|
88 | ;"Scope: PUBLIC
|
---|
89 | ;"Purpose: A record editor
|
---|
90 | ;"Input: None
|
---|
91 | ;"Output: Data in database may be edited.
|
---|
92 | ;"Results: none
|
---|
93 |
|
---|
94 | new DIC,X,Y
|
---|
95 | new FileNum,IEN
|
---|
96 | new UseDefault set UseDefault=0
|
---|
97 |
|
---|
98 | ;"Pick file to edit from
|
---|
99 | AK1 kill DIC
|
---|
100 | set DIC=1
|
---|
101 | set DIC(0)="AEQM"
|
---|
102 | set DIC("A")="Enter Name of File Containing Record to Edit: ^// "
|
---|
103 | if UseDefault do ;"leave the redundant do loop, it protects $T, so second do ^DIC isn't called
|
---|
104 | . do ^DICRW ;" ^DICRW has default value of user's last response
|
---|
105 | else do ^DIC ;"^DIC doesn't use a default value...
|
---|
106 | write !
|
---|
107 | if +Y'>0 write ! goto AKDone
|
---|
108 |
|
---|
109 | new Options
|
---|
110 | set Options("FILE")=Y
|
---|
111 | if $$GetFields(.Options)=0 goto AKDone
|
---|
112 |
|
---|
113 | AK2 kill DIC
|
---|
114 | set DIC("A")="Enter Record in "_$piece(Y,"^",2)_" to Edit: ^// "
|
---|
115 | set DIC=+Y
|
---|
116 | set DIC(0)="AEQM"
|
---|
117 | do ^DIC
|
---|
118 | if Y=-1 goto AK1
|
---|
119 | new list set list(+Y)=""
|
---|
120 | if $$EditRecs("list",.Options)=1 goto AK2
|
---|
121 |
|
---|
122 | AKDone
|
---|
123 | quit
|
---|
124 |
|
---|
125 |
|
---|
126 | GetFields(Options)
|
---|
127 | ;"Purpose: Interact with user to choose fields, and their display widths
|
---|
128 | ;"Input: Options -- PASS BY REFERENCE, (used for input and as OUT PARAMETER)
|
---|
129 | ;" Note: prior entries are NOT KILLED
|
---|
130 | ;" Options("FILE")=Filenumber^FileName
|
---|
131 | ;" Options("FILE")=Filenumber <---- FileName will be filled in.
|
---|
132 | ;"Output: Options is filled as follows:
|
---|
133 | ;" Options("FILE")=Filenumber^FileName <-- left in from input
|
---|
134 | ;" Options("FIELDS","MAX NUM")=MaxDisplaySequenceNumber
|
---|
135 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
136 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
137 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
138 | ;"Results: 1=OK To continue, 0=abort
|
---|
139 |
|
---|
140 | new result set result=1
|
---|
141 | new DIC,X,Y
|
---|
142 | new SeqNum set SeqNum=1
|
---|
143 | new Field
|
---|
144 |
|
---|
145 | new FName set FName=$piece($get(Options("FILE")),"^",2)
|
---|
146 | new FileNum set FileNum=+$get(Options("FILE"))
|
---|
147 | if FileNum=0 set result=0 goto GFDone
|
---|
148 | if FName="" do
|
---|
149 | . set FName=$$GetFName^TMGDBAPI(FileNum)
|
---|
150 | . set $piece(Options("FILE"),"^",2)=FName
|
---|
151 | set DIC="^DD("_FileNum_","
|
---|
152 | set DIC(0)="MEQ"
|
---|
153 | GFLoop
|
---|
154 | write "Enter "
|
---|
155 | if SeqNum=1 write "first "
|
---|
156 | else write "next "
|
---|
157 | write "field to display/edit (^ to abort): "
|
---|
158 | read Field:$get(DTIME,3600)
|
---|
159 | if Field="^" set result=0 goto GFDone
|
---|
160 | if Field="" goto GFDone
|
---|
161 | if Field[":" do
|
---|
162 | . new i,CurFile,abort
|
---|
163 | . new NewField set NewField=""
|
---|
164 | . new NewFldNames set NewFldNames=""
|
---|
165 | . set CurFile=FileNum,abort=0
|
---|
166 | . for i=1:1:$length(Field,":") do quit:(abort=1)
|
---|
167 | . . new fld,DIC,X,Y
|
---|
168 | . . set fld=$piece(Field,":",i)
|
---|
169 | . . set DIC="^DD("_CurFile_","
|
---|
170 | . . set DIC(0)="MEQ"
|
---|
171 | . . set X=fld
|
---|
172 | . . do ^DIC
|
---|
173 | . . if Y=-1 set abort=1 quit
|
---|
174 | . . if NewField'="" set NewField=NewField_":"
|
---|
175 | . . if NewFldNames'="" set NewFldNames=NewFldNames_":"
|
---|
176 | . . set NewField=NewField_+Y
|
---|
177 | . . set NewFldNames=NewFldNames_$piece(Y,"^",2)
|
---|
178 | . . new FldInfo set FldInfo=$piece($get(^DD(CurFile,+Y,0)),"^",2)
|
---|
179 | . . if FldInfo["P" do
|
---|
180 | . . . set CurFile=+$piece(FldInfo,"P",2)
|
---|
181 | . . . write "->"
|
---|
182 | . set Field=NewField_"^"_NewFldNames
|
---|
183 | . if Field="^" set Field=""
|
---|
184 | . write !
|
---|
185 | else do
|
---|
186 | . set X=Field
|
---|
187 | . do ^DIC write !
|
---|
188 | . if +Y>0 set Field=Y
|
---|
189 | . ;"NOTE: I need to ask for subfield if PTR to another file.
|
---|
190 | . else do
|
---|
191 | . . ;"if Field'["?" write "??",!
|
---|
192 | . . set Field=""
|
---|
193 | if Field="" goto GFLoop
|
---|
194 | set Options("FIELDS",SeqNum)=Field
|
---|
195 | set Options("FIELDS","MAX NUM")=SeqNum
|
---|
196 | new % set %=2
|
---|
197 | write " DISPLAY only (i.e. don't allow edit)" do YN^DICN write !
|
---|
198 | if %=1 set Options("FIELDS",SeqNum,"NO EDIT")=1
|
---|
199 | if %=-1 goto GFDone
|
---|
200 | set SeqNum=SeqNum+1
|
---|
201 | goto GFLoop
|
---|
202 |
|
---|
203 | GFDone
|
---|
204 | write !
|
---|
205 | quit result
|
---|
206 |
|
---|
207 |
|
---|
208 | GetWidths(Options)
|
---|
209 | ;"Purpose: Interact with user to choose adjust widths of displayed fields
|
---|
210 | ;"Input: Options -- PASS BY REFERENCE, (used for input and as OUT PARAMETER)
|
---|
211 | ;" Note: prior entries are NOT KILLED
|
---|
212 | ;" Options("FILE")=Filenumber^FileName
|
---|
213 | ;" Options("FIELDS","MAX NUM")=MaxDisplaySequenceNumber
|
---|
214 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName
|
---|
215 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName
|
---|
216 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName
|
---|
217 | ;"Output: Options is filled as follows:
|
---|
218 | ;" Options("FILE")=Filenumber^FileName <-- left in from input
|
---|
219 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
220 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
221 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
222 | ;"Results: 1=OK To continue, 0=abort
|
---|
223 |
|
---|
224 | ;"Note: Later I could rewrite this function to allow a more graphical
|
---|
225 | ;" resizing of the fields, by displaying the line with one field
|
---|
226 | ;" in reverse colors, indicating that it has been selected. Then
|
---|
227 | ;" left-right would adjust size, and TAB would rotate to next field.
|
---|
228 |
|
---|
229 | new result set result=1
|
---|
230 | new LMargin set LMargin=6
|
---|
231 | new TMGMINW set TMGMINW=3
|
---|
232 | new FldCount set FldCount=$get(Options("FIELDS","MAX NUM"),0)
|
---|
233 | if FldCount=0 set result=0 goto GWDone
|
---|
234 | new ScrnWidth set ScrnWidth=$get(IOM,80)-LMargin-1 ;"leave room for selector numbers
|
---|
235 | new tempW set tempW=ScrnWidth\FldCount
|
---|
236 |
|
---|
237 | ;"Set default values
|
---|
238 | new i for i=1:1:FldCount set $piece(Options("FIELDS",i),"^",3)=tempW
|
---|
239 |
|
---|
240 | write !,$$GetDispStr(.Options),!
|
---|
241 |
|
---|
242 | new %,i,Num,TMGW,Delta,MinW,TMGMAXW
|
---|
243 | new SufferCol,SufferW
|
---|
244 | new Menu,UsrSlct,MenuCount,MenuDflt
|
---|
245 | set MenuCount=1
|
---|
246 | set MenuDflt=1
|
---|
247 | new DIR,FldName
|
---|
248 |
|
---|
249 | set Menu(0)="Pick Option"
|
---|
250 | for i=1:1:FldCount do
|
---|
251 | . set Menu(MenuCount)="Adjust ["_$piece(Options("FIELDS",i),"^",2)_"]"_$char(9)_i
|
---|
252 | . set MenuCount=MenuCount+1
|
---|
253 | set Menu(MenuCount)="Enter ^ to abort"_$char(9)_"^"
|
---|
254 |
|
---|
255 | GWLoop
|
---|
256 | set %=2 ;"default to 'NO' the first time into loop.
|
---|
257 | write "Adjust column widths"
|
---|
258 | do YN^DICN write !
|
---|
259 | if %=2 goto GWDone
|
---|
260 |
|
---|
261 | set UsrSlct=$$Menu^TMGUSRIF(.Menu,MenuDflt,.MenuDflt)
|
---|
262 | if (UsrSlct="^")!(UsrSlct="") goto GWDone
|
---|
263 |
|
---|
264 | set Num=+UsrSlct
|
---|
265 | set TMGW=$piece($get(Options("FIELDS",Num)),"^",3)
|
---|
266 | set FldName=$piece($get(Options("FIELDS",Num)),"^",2)
|
---|
267 |
|
---|
268 | ;"Determine which column will have compensatory changes as Column is changed
|
---|
269 | set SufferCol=FldCount
|
---|
270 | if Num<FldCount set SufferCol=Num+1
|
---|
271 | else if Num>1 set SufferCol=Num-1
|
---|
272 | set SufferW=$piece($get(Options("FIELDS",SufferCol)),"^",3)
|
---|
273 |
|
---|
274 | set TMGMAXW=ScrnWidth-((FldCount-1)*TMGMINW) ;"min colum width is 3
|
---|
275 | if TMGMAXW<TMGMINW set TMGMAXW=TMGMINW
|
---|
276 | set DIR(0)="N^"_(TMGMINW-TMGW)_":"_(SufferW-TMGMINW)_":0^K:(TMGW-X<TMGMINW)!(TMGW+X>TMGMAXW) X"
|
---|
277 | set DIR("A")="Enter amount to adjust "_FldName_" width by"
|
---|
278 | set DIR("B")=""
|
---|
279 |
|
---|
280 | write $$GetDispStr(.Options)
|
---|
281 | do ^DIR write !
|
---|
282 | if (Y="")!(Y["^") goto GWDone
|
---|
283 |
|
---|
284 | set delta=+Y
|
---|
285 | if delta'=0 do
|
---|
286 | . do AdjCol(.Options,Num,delta)
|
---|
287 | . do AdjCol(.Options,SufferCol,-delta)
|
---|
288 |
|
---|
289 | ;"write #
|
---|
290 | write $$GetDispStr(.Options),!
|
---|
291 |
|
---|
292 | goto GWLoop
|
---|
293 | GWDone
|
---|
294 | quit result
|
---|
295 |
|
---|
296 | AdjCol(Options,Num,Delta)
|
---|
297 | ;"Purpose: To adust one column width
|
---|
298 | ;"Input: Options -- PASS BY REFERENCE, (used for input and as OUT PARAMETER)
|
---|
299 | ;" Note: prior entries are NOT KILLED
|
---|
300 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName
|
---|
301 | ;"Output:Width for one column is changed. No check for total width made
|
---|
302 | ;"Results: none
|
---|
303 |
|
---|
304 | new W
|
---|
305 | set W=$piece($get(Options("FIELDS",Num)),"^",3)
|
---|
306 | set W=W+Delta
|
---|
307 | set $piece(Options("FIELDS",Num),"^",3)=W
|
---|
308 | quit
|
---|
309 |
|
---|
310 |
|
---|
311 | GetDispStr(Options)
|
---|
312 | ;"Purpose: get a display representation of widths
|
---|
313 | ;"Input: Options -- PASS BY REFERENCE
|
---|
314 | ;" Options("FIELDS","MAX NUM")=MaxDisplaySequenceNumber
|
---|
315 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
316 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
317 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
318 | ;"Results: returns a display string
|
---|
319 |
|
---|
320 | new outS set $piece(outS," ",LMargin)=""
|
---|
321 | ;"Display current widths
|
---|
322 | for i=1:1:FldCount do
|
---|
323 | . new W set W=$piece(Options("FIELDS",i),"^",3)
|
---|
324 | . new name set name=$piece($get(Options("FIELDS",i)),"^",2)
|
---|
325 | . set name=$extract(name,1,W-2)
|
---|
326 | . set name=$$LJ^XLFSTR(name,W-2,".") if name="" set name="!"
|
---|
327 | . set outS=outS_"["_name_"]"
|
---|
328 |
|
---|
329 | quit outS
|
---|
330 |
|
---|
331 |
|
---|
332 | GetIENs(Options)
|
---|
333 | ;"Purpose: Interact with user to choose IENs to be edited
|
---|
334 | ;" User will be able to pick IENs from a SORT TEMPLATE, or
|
---|
335 | ;" a custom search.
|
---|
336 | ;"Input: Options -- PASS BY REFERENCE, (used for input and as OUT PARAMETER)
|
---|
337 | ;" Note: prior entries are NOT KILLED
|
---|
338 | ;" Options("FILE")=Filenumber^FileName
|
---|
339 | ;"Output: Options is filled as follows:
|
---|
340 | ;" Options("FILE")=Filenumber^FileName <-- left from input
|
---|
341 | ;" Options("IEN LIST",IEN in FILE)=""
|
---|
342 | ;" Options("IEN LIST",IEN in FILE)=""
|
---|
343 | ;"Results: 1=OK To continue, 0=abort
|
---|
344 |
|
---|
345 | new Menu,UsrSlct
|
---|
346 | new FileNum set FileNum=$piece($get(Options("FILE")),"^",1)
|
---|
347 | new FileName set FileName=$piece($get(Options("FILE")),"^",2)
|
---|
348 | new result set result=1
|
---|
349 |
|
---|
350 | set Menu(0)="Pick Records from "_FileName_" to Browse"
|
---|
351 | set Menu(1)="Choose a TEMPLATE from a former FILEMAN SEARCH"_$char(9)_"TEMPLATE"
|
---|
352 | set Menu(2)="Browse ALL records"_$char(9)_"ALL"
|
---|
353 | set Menu(3)="Browse records with a given Field VALUE"_$char(9)_"SCREEN"
|
---|
354 | set Menu(4)="Enter ^ to abort"_$char(9)_"^"
|
---|
355 | ;"write #
|
---|
356 | set UsrSlct=$$Menu^TMGUSRIF(.Menu,1)
|
---|
357 | if UsrSlct="^" set result=0 goto GIDone
|
---|
358 | if UsrSlct=0 set UsrSlct=""
|
---|
359 |
|
---|
360 | new abort set abort=0
|
---|
361 | if UsrSlct="TEMPLATE" do
|
---|
362 | . new DIC,Y
|
---|
363 | . set DIC=.401
|
---|
364 | . set DIC(0)="MAEQ"
|
---|
365 | TPLOOP . write "Select a TEMPLATE Containing Records for Browsing.",!
|
---|
366 | . set DIC("A")="Enter Template (^ to abort): "
|
---|
367 | . do ^DIC write !
|
---|
368 | . if +Y'>0 set abort=1 quit
|
---|
369 | . new node set node=$get(^DIBT(+Y,0))
|
---|
370 | . if $piece(node,"^",4)'=FileNum do goto TPLOOP
|
---|
371 | . . set Y=0 ;"signal to try again
|
---|
372 | . . new PriorErrorFound
|
---|
373 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"Error: That template doesn't contain records from "_FileName_". Please select another.")
|
---|
374 | . . do PressToCont^TMGUSRIF
|
---|
375 | . if (+Y>0)&($data(^DIBT(+Y,1))>1) do
|
---|
376 | . . merge Options("IEN LIST")=^DIBT(+Y,1)
|
---|
377 |
|
---|
378 | else if UsrSlct="ALL" do
|
---|
379 | . do GetFldValue(FileNum,.01,"ALL",$name(Options("IEN LIST")))
|
---|
380 |
|
---|
381 | else if UsrSlct="SCREEN" do
|
---|
382 | . new DIC,X,Y,DIR,FldNum,Value
|
---|
383 | . set DIC="^DD("_FileNum_","
|
---|
384 | . set DIC(0)="MAEQ"
|
---|
385 | . set DIC("A")="Enter FIELD to use for SCREEN: "
|
---|
386 | . do ^DIC write !
|
---|
387 | . if Y=-1 quit
|
---|
388 | . set FldNum=+Y
|
---|
389 | . set DIR(0)=FileNum_","_FldNum
|
---|
390 | . set DIR("?",1)="Enter value to search for. Records will be included"
|
---|
391 | . set DIR("?",2)="if the field chosed contains the value entered here."
|
---|
392 | . set DIR("?",3)="A @ may be entered to represent a NULL value for a field."
|
---|
393 | . set DIR("?",4)="For more complex searches, use Fileman search function,"
|
---|
394 | . set DIR("?",5)="store results in a template, and then chose that template"
|
---|
395 | . set DIR("?",6)="as the input source instead of choosing a screening value."
|
---|
396 | . do ^DIR write !
|
---|
397 | . if X="@" set Y="@"
|
---|
398 | . if Y="" quit
|
---|
399 | . set Value=$piece(Y,"^",1)
|
---|
400 | . do GetFldValue(FileNum,FldNum,Value,$name(Options("IEN LIST")))
|
---|
401 |
|
---|
402 | if abort=1 set result=0
|
---|
403 | GIDone
|
---|
404 | quit result
|
---|
405 |
|
---|
406 |
|
---|
407 | GetFldVScreen(File,FieldNum,ScrnCode,pResults,Flags)
|
---|
408 | ;"Purpose: get List of IENs in File with matching Field
|
---|
409 | ;"Input: File -- the File to scan
|
---|
410 | ;" FieldNum -- the Field number to get from file
|
---|
411 | ;" ScrnCode -- Screening code to be executed....
|
---|
412 | ;" Format: '$$MyFn^MyModule()', or
|
---|
413 | ;" '(some test)' such that the following is valid code:
|
---|
414 | ;" set @("flagToSkip="_ScrnCode)
|
---|
415 | ;" ---> If flagToSkip=1, then record is NOT selected
|
---|
416 | ;" The following variables will be available for use:
|
---|
417 | ;" File -- the File name or number
|
---|
418 | ;" FieldNum -- the field number
|
---|
419 | ;" IEN -- the IEN of the current record.
|
---|
420 | ;" RecValue -- the current value of the field
|
---|
421 | ;" pResults -- PASS BY NAME, an OUT PARAMETER.
|
---|
422 | ;" Flags -- OPTIONAL. Possible Flags
|
---|
423 | ;" "E" search for external forms (default is internal forms)
|
---|
424 | ;"Output: @pResults is filled as following. Note: prior results are not killed
|
---|
425 | ;" @pResults@(IEN)=""
|
---|
426 | ;" @pResults@(IEN)=""
|
---|
427 | ;"Results: none
|
---|
428 |
|
---|
429 | new Itr,IEN,RecValue,FMFlag
|
---|
430 | new abort set abort=0
|
---|
431 | set FMFlag="I" if $get(Flags)["E" set FMFlag=""
|
---|
432 |
|
---|
433 | set RecValue=$$ItrFInit^TMGITR(File,.Itr,.IEN,FieldNum,,FMFlag)
|
---|
434 | do PrepProgress^TMGITR(.Itr,20,0,"IEN")
|
---|
435 | for do quit:(($$ItrFNext^TMGITR(.Itr,.IEN,.RecValue)="@@@@@@@@")!(+IEN=0))!abort
|
---|
436 | . if $$UserAborted^TMGUSRIF set abort=1 quit
|
---|
437 | . new flagToSkip set @("flagToSkip="_ScrnCode)
|
---|
438 | . if flagToSkip quit
|
---|
439 | . set @pResults@(IEN)=""
|
---|
440 | do ProgressDone^TMGITR(.Itr)
|
---|
441 |
|
---|
442 | quit
|
---|
443 |
|
---|
444 |
|
---|
445 | GetFldValue(File,FieldNum,Value,pResults,Flags)
|
---|
446 | ;"Purpose: get List of IENs in File with matching Field
|
---|
447 | ;"Input: File -- the File to scan
|
---|
448 | ;" FieldNum -- the Field number to get from file
|
---|
449 | ;" Value -- the value to compare against. Poss Values
|
---|
450 | ;" VALUE: if field=VALUE, then record selected
|
---|
451 | ;" "@": if field=null (empty), then record selected
|
---|
452 | ;" "ALL": all records are selected
|
---|
453 | ;" pResults -- PASS BY NAME, an OUT PARAMETER.
|
---|
454 | ;" Flags -- OPTIONAL. Possible Flags
|
---|
455 | ;" "E" search for external forms (default is internal forms)
|
---|
456 | ;"Output: @pResults is filled as following. Note: prior results are not killed
|
---|
457 | ;" @pResults@(IEN)=""
|
---|
458 | ;" @pResults@(IEN)=""
|
---|
459 | ;"Results: none
|
---|
460 |
|
---|
461 |
|
---|
462 | new Itr,IEN,RecValue,FMFlag
|
---|
463 | if $get(Value)="ALL" goto GFV3
|
---|
464 |
|
---|
465 | GFV1 set FMFlag="I" if $get(Flags)["E" set FMFlag=""
|
---|
466 | set RecValue=$$ItrFInit^TMGITR(File,.Itr,.IEN,FieldNum,,FMFlag)
|
---|
467 | do PrepProgress^TMGITR(.Itr,20,0,"IEN")
|
---|
468 | for do quit:(($$ItrFNext^TMGITR(.Itr,.IEN,.RecValue)="@@@@@@@@")!(+IEN=0))
|
---|
469 | . if (RecValue=Value)!((Value="@")&(RecValue="")) do
|
---|
470 | . . set @pResults@(IEN)=""
|
---|
471 | write !
|
---|
472 | goto GFVDone
|
---|
473 |
|
---|
474 | GFV3 write "Gathering ALL records...",!
|
---|
475 | set IEN=$$ItrInit^TMGITR(File,.Itr,.IEN)
|
---|
476 | do PrepProgress^TMGITR(.Itr,100,0,"IEN")
|
---|
477 | for do quit:($$ItrNext^TMGITR(.Itr,.IEN)="")
|
---|
478 | . if +IEN'=IEN quit
|
---|
479 | . set @pResults@(IEN)=""
|
---|
480 | do ProgressDone^TMGITR(.Itr)
|
---|
481 | GFVDone
|
---|
482 | quit
|
---|
483 |
|
---|
484 |
|
---|
485 | SELED(Options)
|
---|
486 | ;"Scope: PUBLIC
|
---|
487 | ;"Purpose: the entry point for group selecting and editing of recrods
|
---|
488 | ;" Note: this can be used as an API entry point
|
---|
489 | ;"Input: Options -- PASS BY REFERENCE
|
---|
490 | ;" Format:
|
---|
491 | ;" Options("FILE")=Filenumber^FileName
|
---|
492 | ;" Options("FIELDS","MAX NUM")=MaxDisplaySequenceNumber
|
---|
493 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
494 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
495 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width
|
---|
496 | ;" Options("FIELDS",DisplaySequence,"LOOKUP FN") -- OPTIONAL
|
---|
497 | ;" A function for looking up new values.
|
---|
498 | ;" Must be in format like this:
|
---|
499 | ;" Options("FIELDS",DisplaySequence,"LOOKUP FN")="$$MyFn^MyModule(File,FldNum)"
|
---|
500 | ;" i.e. must be a function name. Function may take passed
|
---|
501 | ;" parameters 'File' and 'FldNum'
|
---|
502 | ;" Default value="$$ValueLookup(File,FldNum)"
|
---|
503 | ;" Options("IEN LIST",IEN in FILE)=""
|
---|
504 | ;" Options("IEN LIST",IEN in FILE)=""
|
---|
505 | ;" Options("IEN LIST",IEN in FILE,"SEL")="" ;"<-- optional. Makes preselected
|
---|
506 | ;" Note: alternative Format
|
---|
507 | ;" Options("FIELDS",DisplaySequence)=FldNum:FldNum2:FldNum3^Width
|
---|
508 | ;" FldNum:FldNum2:FldNum3 means FldNum is ptr to file2, and
|
---|
509 | ;" FldNum2 is in file2. This value is a pointer to file3, and
|
---|
510 | ;" FldNum3 is a value in file3
|
---|
511 | ;"Output: Data in database may be edited.
|
---|
512 | ;"Results: 1=Normal exit, 2=Needs rescan and recall
|
---|
513 |
|
---|
514 | new result set result=1
|
---|
515 | new SelList,pList,pIENList
|
---|
516 | set pList=$name(SelList)
|
---|
517 | set pIENList=$name(Options("IEN LIST"))
|
---|
518 |
|
---|
519 | new Fields,Widths
|
---|
520 | set Fields="",Widths=""
|
---|
521 |
|
---|
522 | new File set File=+$get(Options("FILE"))
|
---|
523 | if File="" goto SEDone
|
---|
524 |
|
---|
525 | new i for i=1:1:$get(Options("FIELDS","MAX NUM")) do
|
---|
526 | . set Fields=Fields_$piece($get(Options("FIELDS",i)),"^",1)_";"
|
---|
527 | . set Widths=Widths_$piece($get(Options("FIELDS",i)),"^",3)_";"
|
---|
528 |
|
---|
529 | new tempResult
|
---|
530 | new pSaveArray ;"will store ref of stored display array --> faster
|
---|
531 | SLoop kill @pList
|
---|
532 |
|
---|
533 | ;"Later change this to allow custom order of sort fields.
|
---|
534 | do IENSelector^TMGUSRIF(pIENList,pList,File,Fields,Widths,"Pick Records to Edit. [ESC],[ESC] when done",Fields,.pSaveArray)
|
---|
535 | new count set count=$$ListCt^TMGMISC(pList)
|
---|
536 | write count," items selected.",!
|
---|
537 |
|
---|
538 | if count>0 set tempResult=$$EditRecs(pList,.Options)
|
---|
539 |
|
---|
540 | write !,"Fix more"
|
---|
541 | new % set %=1
|
---|
542 | if count=0 set %=2
|
---|
543 | do YN^DICN write !
|
---|
544 | if %'=1 goto SEDone
|
---|
545 | if $data(@pList)=0 goto SLoop
|
---|
546 |
|
---|
547 | new needsRepack set needsRepack=0
|
---|
548 | write "Removing fixed items from list. Here are the old entries...",!
|
---|
549 | if $get(pSaveArray)="" do
|
---|
550 | . do ListNot^TMGMISC(pIENList,pList) ;"<-- probably a bug in this function
|
---|
551 | else do
|
---|
552 | . new Itr,IEN,DispLineNum
|
---|
553 | . ;"zwr @pList
|
---|
554 | . set IEN=$$ItrAInit^TMGITR(pList,.Itr)
|
---|
555 | . if IEN'="" for do quit:($$ItrANext^TMGITR(.Itr,.IEN)="")
|
---|
556 | . . set DispLineNum=+$get(@pList@(IEN))
|
---|
557 | . . if DispLineNum=0 quit
|
---|
558 | . . new tempS
|
---|
559 | . . set tempS=$get(@pSaveArray@(DispLineNum))
|
---|
560 | . . set tempS=$piece(tempS,$char(9),2)
|
---|
561 | . . write " --",tempS,!
|
---|
562 | . . kill @pSaveArray@(DispLineNum)
|
---|
563 | . . set needsRepack=1
|
---|
564 | . write !
|
---|
565 | write !
|
---|
566 | ;"IMPORTANT NOTE: It seems that that after deleting items in pSaveArray, the ordering
|
---|
567 | ;" gets out of sync, such that the display number is NOT the same as the index
|
---|
568 | ;" and the wrong references can be used!!! Must renumber somehow...
|
---|
569 |
|
---|
570 | set %=2
|
---|
571 | write "Rescan file (slow)"
|
---|
572 | do YN^DICN write !
|
---|
573 | if %=1 set result=2 goto SEDone
|
---|
574 | if %=-1 goto SEDone
|
---|
575 |
|
---|
576 | write "Packing display list..."
|
---|
577 | do ListPack^TMGMISC(pSaveArray)
|
---|
578 | write !
|
---|
579 |
|
---|
580 | goto SLoop
|
---|
581 | SEDone
|
---|
582 | quit result
|
---|
583 |
|
---|
584 | EditRecs(pList,Options,LookupFn)
|
---|
585 | ;"Purpose: To get new values for display fields in records
|
---|
586 | ;"Input: pList -- PASS BY NAME. A list of IENs to process
|
---|
587 | ;" @pList@(IEN)=IgnoredValue
|
---|
588 | ;" @pList@(IEN)=IgnoredValue
|
---|
589 | ;" @pList@(IEN)=IgnoredValue
|
---|
590 | ;" Options -- PASS BY REFERENCE. Format:
|
---|
591 | ;" Options("FILE")=Filenumber^FileName
|
---|
592 | ;" Options("FIELDS","MAX NUM")=MaxDisplaySequenceNumber
|
---|
593 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width <-- Width is ignored
|
---|
594 | ;" Options("FIELDS",DisplaySequence)=FldNum^FldName^Width <-- Width is ignored
|
---|
595 | ;" Options("FIELDS",DisplaySequence)=FldNum <-- FldName OPTIONAL
|
---|
596 | ;" Options("FIELDS",DisplaySequence,"LOOKUP FN") -- OPTIONAL
|
---|
597 | ;" A function for looking up new values.
|
---|
598 | ;" Must be in format like this:
|
---|
599 | ;" Options("FIELDS",DisplaySequence,"LOOKUP FN")="$$MyFn^MyModule(File,FldNum)"
|
---|
600 | ;" i.e. must be a function name. Function may take passed
|
---|
601 | ;" parameters 'File' and 'FldNum'
|
---|
602 | ;" Default value="$$ValueLookup(File,FldNum)"
|
---|
603 | ;" Options("FIELDS",DisplaySequence,"NO EDIT")=1 <-- indicates this field NOT to be edited.
|
---|
604 | ;" Note: alternative Format
|
---|
605 | ;" Options("FIELDS",DisplaySequence)=FldNum:FldNum2:FldNum3^Width
|
---|
606 | ;" FldNum:FldNum2:FldNum3 means FldNum is ptr to file2, and
|
---|
607 | ;" FldNum2 is in file2. This value is a pointer to file3, and
|
---|
608 | ;" FldNum3 is a value in file3
|
---|
609 | ;"
|
---|
610 | ;"Results: 1=OK to continue, 0 if error
|
---|
611 |
|
---|
612 | new result set result=0 ;"default to error
|
---|
613 | new Menu,UsrSlct,MenuCount,FldCount,File
|
---|
614 | new TMGFDA,TMGMSG
|
---|
615 | set FldCount=+$get(Options("FIELDS","MAX NUM")) if FldCount=0 goto GNVDone
|
---|
616 | set File=+$get(Options("FILE")) if File=0 goto GNVDone
|
---|
617 | new LookupFn
|
---|
618 | new DIR,FldNum,NewValue
|
---|
619 |
|
---|
620 | GNVL1 kill Menu
|
---|
621 | set Menu(0)="Pick Field to EDIT"
|
---|
622 | set MenuCount=1
|
---|
623 | for i=1:1:FldCount do
|
---|
624 | . new CommonValue,FieldNum,FieldName
|
---|
625 | . if $get(Options("FIELDS",i,"NO EDIT"))=1 quit ;"don't edit this field
|
---|
626 | . set FieldNum=$piece($get(Options("FIELDS",i)),"^",1)
|
---|
627 | . set FieldName=$piece($get(Options("FIELDS",i)),"^",2)
|
---|
628 | . if FieldName="" set FieldName=$$GetFldName^TMGDBAPI(File,FieldNum)
|
---|
629 | . set CommonValue=$$GetCommonValue(File,FieldNum,pList)
|
---|
630 | . set Menu(MenuCount)=FieldName_": ["_CommonValue_"]"_$char(9)_i
|
---|
631 | . set MenuCount=MenuCount+1
|
---|
632 | ;"set Menu(MenuCount)="Enter ^ to abort"_$char(9)_"^"
|
---|
633 |
|
---|
634 | GNVL2
|
---|
635 | set UsrSlct=$$Menu^TMGUSRIF(.Menu)
|
---|
636 | ;"if FldCount>1 do
|
---|
637 | ;". set UsrSlct=$$Menu^TMGUSRIF(.Menu)
|
---|
638 | ;"else set UsrSlct=1 ;"If only 1 option, then auto-select
|
---|
639 | if (UsrSlct="^")!(UsrSlct="") goto GWDone
|
---|
640 |
|
---|
641 | set LookupFn=$get(Options("FIELDS",UsrSlct,"LOOKUP FN"),"$$ValueLookup(File,FldNum)")
|
---|
642 |
|
---|
643 | kill DIR,NewValue
|
---|
644 | set FldNum=+$piece($get(Options("FIELDS",UsrSlct)),"^",1)
|
---|
645 | if FldNum=0 goto GNVDone
|
---|
646 |
|
---|
647 | set @("Y="_LookupFn)
|
---|
648 | ;"write !,"Enter new value for field below."
|
---|
649 | ;"set DIR(0)=File_","_FldNum
|
---|
650 | ;"do ^DIR write !
|
---|
651 |
|
---|
652 | if Y="" goto GNVL2
|
---|
653 | if Y="^" goto GNVDone
|
---|
654 | set NewValue=$piece(Y,"^",1)
|
---|
655 | if NewValue=+NewValue do
|
---|
656 | . new array
|
---|
657 | . do GetFieldInfo^TMGDBAPI(File,FldNum,"array")
|
---|
658 | . if $get(array("SPECIFIER"))["S" quit ;"check if field is a SET, if so, don't add ` mark
|
---|
659 | . set NewValue="`"_NewValue ;"indicate that number is a pointer
|
---|
660 |
|
---|
661 | new Itr,IEN,Value,results
|
---|
662 | set result=1
|
---|
663 | set IEN=$$ItrAInit^TMGITR(pList,.Itr)
|
---|
664 | if IEN'="" for do quit:($$ItrANext^TMGITR(.Itr,.IEN)="")
|
---|
665 | . kill TMGFDA,TMGMSG
|
---|
666 | . set TMGFDA(File,IEN_",",FldNum)=NewValue
|
---|
667 | . do FILE^DIE("EK","TMGFDA","TMGMSG")
|
---|
668 | . if $data(TMGMSG("DIERR")) do
|
---|
669 | . . set result=0
|
---|
670 | . . new PriorErrorFound
|
---|
671 | . . do ShowDIERR^TMGDEBUG(.TMGMSG,.PriorErrorFound)
|
---|
672 |
|
---|
673 | goto GNVL1
|
---|
674 |
|
---|
675 | GNVDone
|
---|
676 | quit result
|
---|
677 |
|
---|
678 |
|
---|
679 | ValueLookup(File,FldNum)
|
---|
680 | ;"Purpose: To interact with user and obtain a value for field in file
|
---|
681 | ;"Input: File: A valid file number
|
---|
682 | ;" FldNum: A valid field number in File
|
---|
683 | ;"Result: Returns value of user input.
|
---|
684 |
|
---|
685 | new DIR
|
---|
686 | write !,"Enter new value for field below."
|
---|
687 | set DIR(0)=File_","_FldNum
|
---|
688 | do ^DIR write !
|
---|
689 | quit Y
|
---|
690 |
|
---|
691 |
|
---|
692 | GetCommonValue(File,Field,pList,Flags)
|
---|
693 | ;"Purpose: Return a value held by all records in pList, or "" if mixed values
|
---|
694 | ;"Input: File -- file number
|
---|
695 | ;" Field -- field number or 'num:num2:num3" etc
|
---|
696 | ;" Flags -- value to pass to GET1^DIQ during lookup
|
---|
697 | ;"Output: returns a common value, or "" if not common value
|
---|
698 |
|
---|
699 | new Itr,IEN,Value,abort,result
|
---|
700 | set abort=0,result=""
|
---|
701 |
|
---|
702 | new Itr,IEN,Value,abort
|
---|
703 | set abort=0
|
---|
704 | set IEN=$$ItrAInit^TMGITR(pList,.Itr)
|
---|
705 | if IEN'="" for do quit:($$ItrANext^TMGITR(.Itr,.IEN)="")!(abort=1)
|
---|
706 | . set Value=$$GET1^DIQ(File,IEN_",",Field)
|
---|
707 | . if result="" set result=Value
|
---|
708 | . if Value'=result set result="<MIXED VALUES>",abort=1
|
---|
709 |
|
---|
710 | quit result
|
---|
711 |
|
---|
712 |
|
---|
713 |
|
---|