[796] | 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 |
|
---|