| 1 | TMGXMLE2 ;TMG/kst/XML Exporter -- Core functionality ;03/25/06
 | 
|---|
| 2 |          ;;1.0;TMG-LIB;**1**;07/12/05
 | 
|---|
| 3 | 
 | 
|---|
| 4 |  ;"TMG XML EXPORT FUNCTIONS (CORE FUNCTIONALITY)
 | 
|---|
| 5 |  ;"Kevin Toppenberg MD
 | 
|---|
| 6 |  ;"GNU General Public License (GPL) applies
 | 
|---|
| 7 |  ;"7-12-2005
 | 
|---|
| 8 |  ;"=======================================================================
 | 
|---|
| 9 |  ;" API -- Public Functions.
 | 
|---|
| 10 |  ;"=======================================================================
 | 
|---|
| 11 |  ;"WriteXMLData(pArray,Flags,IndentS)
 | 
|---|
| 12 |  ;"Write1File(File,Recs,Flags,IndentS,SavFieldInfo)
 | 
|---|
| 13 |  ;"Write1Rec(File,IEN,Fields,Flags,SRef,IENS,IndentS,RWriter,FWriter,LWriter,WPLWriter,SavFieldInfo)
 | 
|---|
| 14 |  ;"Write1Fld(FileNum,IEN,Field,Fields,Flags,SRef,IENS,IndentS,RWriter,FWriter,LWriter,WPLWriter,SavFieldInfo)
 | 
|---|
| 15 | 
 | 
|---|
| 16 |  ;"=======================================================================
 | 
|---|
| 17 |  ;"PRIVATE API FUNCTIONS
 | 
|---|
| 18 |  ;"=======================================================================
 | 
|---|
| 19 | 
 | 
|---|
| 20 | 
 | 
|---|
| 21 |  ;"=======================================================================
 | 
|---|
| 22 |  ;"DEPENDENCIES
 | 
|---|
| 23 |  ;" TMGDBAPI,TMGDEBUG,TMGMISC,TMGUSRIF
 | 
|---|
| 24 |  ;"=======================================================================
 | 
|---|
| 25 |  ;"=======================================================================
 | 
|---|
| 26 | 
 | 
|---|
| 27 |  ;"The basic format is to be as follows:
 | 
|---|
| 28 | 
 | 
|---|
| 29 |  ;"Array(File,Record,Field,subRec,SubField...)=""   <--- means export this entry to XML
 | 
|---|
| 30 |  ;"Array(File,"TEMPLATE",Field)
 | 
|---|
| 31 |  ;"Array(File,"TEMPLATE","ORDER",OrderNum)=Field
 | 
|---|
| 32 |  ;"Array(File,"TEMPLATE","TAG NAME",FieldNumber)="Custom field name to put in XML file"
 | 
|---|
| 33 |  ;"Array("FLAGS","b")=""  b -- show tags for ALL fields, even if field has no data
 | 
|---|
| 34 |  ;"Array("FLAGS","i")=""  i -- indent tags for pretty, but technically useless, file formating.
 | 
|---|
| 35 |  ;"Array("FLAGS","I")=""  I -- output INTERNAL values
 | 
|---|
| 36 |  ;"Array("FLAGS","D")=""  D -- output the data dictionary
 | 
|---|
| 37 |  ;"Array("!DOCTYPE")=MyLabel
 | 
|---|
| 38 |  ;"Array("EXPORT_SYSTEM_NAME")=LabelForExportingSystem   -- OPTIONAL
 | 
|---|
| 39 |  ;"
 | 
|---|
| 40 |  ;"-----------------------------------------------------------------------------------------------
 | 
|---|
| 41 |  ;"Note: File numbers can be replaces with full FILE NAMES, e.g.
 | 
|---|
| 42 |  ;"   Array("NEW PERSON",1234,.01)=""
 | 
|---|
| 43 |  ;"
 | 
|---|
| 44 |  ;"Example:  For ALL records, output ALL fields, and ALL subfields
 | 
|---|
| 45 |  ;"     Array(8925,"*")=""   <--- this is default if Recs is not specified/passed
 | 
|---|
| 46 |  ;"
 | 
|---|
| 47 |  ;"Example: to print from:
 | 
|---|
| 48 |  ;"   file 8925, records 1234,1235,1236,1237
 | 
|---|
| 49 |  ;"   file 200, ALL records
 | 
|---|
| 50 |  ;"   file 22705, records 3,5
 | 
|---|
| 51 |  ;"   file 2, ALL records
 | 
|---|
| 52 |  ;"
 | 
|---|
| 53 |  ;"   Array(8925,1234)=""
 | 
|---|
| 54 |  ;"   Array(8925,1235)=""
 | 
|---|
| 55 |  ;"   Array(8925,1236)=""
 | 
|---|
| 56 |  ;"   Array(8925,1237)=""
 | 
|---|
| 57 |  ;"   Array(200,"*")=""
 | 
|---|
| 58 |  ;"   Array(22705,3)=""
 | 
|---|
| 59 |  ;"   Array(22705,5)=""
 | 
|---|
| 60 |  ;"   Array(2,"*")=""
 | 
|---|
| 61 |  ;"
 | 
|---|
| 62 |  ;"Example:  Output extra info in record node
 | 
|---|
| 63 |  ;"   Array(8925,1232)="tag=value^tag2=value2" <-- optional extra info for record
 | 
|---|
| 64 |  ;"     e.g. -->  <Record id=1232 tag="value" tag2="value2">
 | 
|---|
| 65 |  ;"
 | 
|---|
| 66 |  ;"Example:  For record 1231, output fields .01 and .02
 | 
|---|
| 67 |  ;"              For record 1232, output field .01 only
 | 
|---|
| 68 |  ;"              For record 1234, output field "NAME" only
 | 
|---|
| 69 |  ;"              For record 1235, output ALL fields
 | 
|---|
| 70 |  ;"     Array(8925,1231,.01)=""
 | 
|---|
| 71 |  ;"     Array(8925,1231,.02)=""
 | 
|---|
| 72 |  ;"     Array(8925,1232,.01)=""
 | 
|---|
| 73 |  ;"     Array(8925,1234,"NAME")=""
 | 
|---|
| 74 |  ;"     Array(8925,1235,"*")=""
 | 
|---|
| 75 |  ;"
 | 
|---|
| 76 |  ;"Example:
 | 
|---|
| 77 |  ;"   Array(8925,"TEMPLATE",.01)=""   <-- define a template for file 8925, with fields .01,.02,.03
 | 
|---|
| 78 |  ;"   Array(8925,"TEMPLATE",.02)=""
 | 
|---|
| 79 |  ;"   Array(8925,"TEMPLATE",.03)=""
 | 
|---|
| 80 |  ;"   Array(8925,1234)   <-- print record 1234  (will use the template)
 | 
|---|
| 81 |  ;"   Array(8925,1235)   <-- print record 1235
 | 
|---|
| 82 |  ;"
 | 
|---|
| 83 |  ;"Example:
 | 
|---|
| 84 |  ;"   Array(8925,"TEMPLATE","*"))=""  <-- include all fields in template
 | 
|---|
| 85 |  ;"   Array(8925,"TEMPLATE","Field Exclude",.04)=""   <-- but exclude field .04
 | 
|---|
| 86 |  ;"   Array(8925,1235)   <-- print record 1235, all fields but .04
 | 
|---|
| 87 |  ;"
 | 
|---|
| 88 |  ;"Example:  For all records, output fields .01 and .02 and "NAME"
 | 
|---|
| 89 |  ;"    Array(8925,"*",.01)=""
 | 
|---|
| 90 |  ;"    Array(8925,"*",.02)=""
 | 
|---|
| 91 |  ;"    Array(8925,"*","NAME")=""
 | 
|---|
| 92 |  ;"
 | 
|---|
| 93 |  ;"Example:
 | 
|---|
| 94 |  ;"    Array(8925,1231,"*")=""    <--- indicates that ALL fields, ALL subrecs,and ALL subfields are wanted
 | 
|---|
| 95 |  ;"
 | 
|---|
| 96 |  ;"Example:  For all records, output field "ENTRY", which is a multiple.  In
 | 
|---|
| 97 |  ;"            subfile, output all records, fields  .01, and .02
 | 
|---|
| 98 |  ;"    Array(8925,"*","ENTRY","*",.01)=""
 | 
|---|
| 99 |  ;"    Array(8925,"*","ENTRY","*",.02)=""
 | 
|---|
| 100 |  ;"
 | 
|---|
| 101 |  ;"Example:  For ALL records, output ALL fields, and ALL subfields, with 2 exceptions
 | 
|---|
| 102 |  ;"    Array(8925,"Rec Exclude",1234)=""  <-- All records except 1234 & 1235 will be output
 | 
|---|
| 103 |  ;"    Array(8925,"Rec Exclude",1235)=""
 | 
|---|
| 104 |  ;"    Array(8925,"*")=""
 | 
|---|
| 105 |  ;"
 | 
|---|
| 106 |  ;"Example:
 | 
|---|
| 107 |  ;"    Array(8925,"TEMPLATE","Field Exclude",.04)=""  <-- don't show field .04
 | 
|---|
| 108 |  ;"    Array(8925,"TEMPLATE","Field Exclude","STATE")=""  <-- don't show field "STATE"
 | 
|---|
| 109 |  ;"    Array(8925,1231,"*")=""   <-- in record 1231, show all fields but .04 and "STATE"
 | 
|---|
| 110 |  ;"
 | 
|---|
| 111 |  ;"Example: Field .04 is multiple. ALL sub records and ALL subfields to be written
 | 
|---|
| 112 |  ;"    Array(8925,1231,.04,"*","*")=""
 | 
|---|
| 113 |  ;"    Array(8925,1231,.04,"*")=""  <--- "*" assumed for subfields
 | 
|---|
| 114 |  ;"    Array(8925,1231,.04)=""   <-- "*" assumed for subrecords and subfields.
 | 
|---|
| 115 |  ;"
 | 
|---|
| 116 |  ;"Example: Field .03 is multiple. All sub records to be written (except for #5) , and .01 and .02 fields to be written
 | 
|---|
| 117 |  ;"    Array(8925,1231,.03,"*",.01)=""  <-- In all sub recs, sub field .01 is to be written
 | 
|---|
| 118 |  ;"    Array(8925,1231,.03,"*",.02)=""  <-- In all sub recs, sub field .02 is to be written
 | 
|---|
| 119 |  ;"    Array(8925,1231,.03,"Rec Exclude",5)=""  <-- Exclude subrec 5
 | 
|---|
| 120 |  ;"
 | 
|---|
| 121 |  ;"Example: Field .03 is multiple. All sub records to be written, and .01 and .02 fields to be written
 | 
|---|
| 122 |  ;"    Array(8925,1231,"TEMPLATE",.03,"*","TEMPLATE",.01)=""  <-- In all sub recs, sub field .01 is to be written
 | 
|---|
| 123 |  ;"    Array(8925,1231,"TEMPLATE",.03,"*","TEMPLATE",.02)=""  <-- In all sub recs, sub field .02 is to be written
 | 
|---|
| 124 | 
 | 
|---|
| 125 |  ;"Example: Field .03 is multiple. Sub records 1,2,3 to be written, fields as below
 | 
|---|
| 126 |  ;"    Array(8925,1231,.03,1,.01)=""   <-- In sub rec 1, sub field .01 is to be written
 | 
|---|
| 127 |  ;"    Array(8925,1231,.03,1,.02)=""   <-- In sub rec 1, sub field .02 is to be written
 | 
|---|
| 128 |  ;"    Array(8925,1231,.03,2,.01)=""   <-- In sub rec 2, sub field .01 is to be written
 | 
|---|
| 129 |  ;"    Array(8925,1231,.03,3,"*")=""   <-- In sub rec 3, all sub fields are to be written
 | 
|---|
| 130 |  ;"    Array(8925,1231,.03,4)=""        <-- In sub rec 4, all sub fields are to be written (defalt)
 | 
|---|
| 131 |  ;"    Array(8925,1231,.03,5,"*")=""   <-- In sub rec 5, all sub fields are to be written, with one exception
 | 
|---|
| 132 |  ;"    Array(8925,1231,.03,5,"Field Exclude",.01)="" <-- In sub rec 5, sub fields .01 is not to be written.
 | 
|---|
| 133 |  ;"
 | 
|---|
| 134 |  ;"Example:   Shows optional substitution of a new tag name for a given field
 | 
|---|
| 135 |  ;"   Array(8925,"TEMPLATE","TAG NAME",.01)="Patent Name"  <-- use "Patient Name" instead of field name for .01 field
 | 
|---|
| 136 |  ;"   Array(8925,"TEMPLATE","TAG NAME",.02)="City"  <-- use "City" instead of field name for .02 field
 | 
|---|
| 137 |  ;"
 | 
|---|
| 138 |  ;"Note: pattern continues for sub-sub-multiples etc.
 | 
|---|
| 139 |  ;"
 | 
|---|
| 140 |  ;"Example:
 | 
|---|
| 141 |  ;"   Array(8925,1231,.01)=""
 | 
|---|
| 142 |  ;"   Array(8925,1231,.02)=""
 | 
|---|
| 143 |  ;"   Array(8925,1231,"NAME")=""  <--- note that field name is allowed in place of number
 | 
|---|
| 144 |  ;"   Array(8925,1231,.03,1,.01)=""   <-- In sub rec 1, sub field .01 is to be written
 | 
|---|
| 145 |  ;"   Array(8925,1231,.03,1,.02)=""   <-- In sub rec 1, sub field .02 is to be written
 | 
|---|
| 146 |  ;"   Array(8925,1231,.03,2,.01)=""   <-- In sub rec 2, sub field .01 is to be written
 | 
|---|
| 147 |  ;"   Array(8925,1231,.03,3,"*")=""   <-- In sub rec 3, all sub fields are to be written
 | 
|---|
| 148 |  ;"   Array(8925,1231,.03,4)=""        <-- In sub rec 4, all sub fields are to be written (defalt)
 | 
|---|
| 149 |  ;"
 | 
|---|
| 150 |  ;"Example:  Field .03 is a multiple
 | 
|---|
| 151 |  ;"   Array(8925,1231,.03,"TEMPLATE",.01)=""
 | 
|---|
| 152 |  ;"   Array(8925,1231,.03,"TEMPLATE",.02)=""
 | 
|---|
| 153 |  ;"   Array(8925,1231,.03,1)=""   <-- In sub rec 1, export fields .01,.02 from template
 | 
|---|
| 154 |  ;"   Array(8925,1231,.03,2)=""   <-- In sub rec 2, export fields .01,.02 from template
 | 
|---|
| 155 |  ;"   Array(8925,1231,.03,4)=""   <-- In sub rec 4, export fields .01,.02 from template
 | 
|---|
| 156 |  ;"
 | 
|---|
| 157 |  ;"Example:
 | 
|---|
| 158 |  ;"  Array(8925,"TEMPLATE","ORDER",1)=.03            <-- 1st field to output
 | 
|---|
| 159 |  ;"  Array(8925,"TEMPLATE","ORDER",2)=.02            <-- 2nd field to output
 | 
|---|
| 160 |  ;"  Array(8925,"TEMPLATE","ORDER",3)="NAME"    <-- 3rd field to output
 | 
|---|
| 161 |  ;"  Array(8925,"TEMPLATE","ORDER",4)=.01            <-- 4th field to output
 | 
|---|
| 162 |  ;"  Note: Specifying an 'ORDER' is not compatible with specifying "*" fields
 | 
|---|
| 163 |  ;"          If "ORDER" is specified, only fields with a given order will be output
 | 
|---|
| 164 |  ;"          Both Field("ORDER",x)=FieldNum *AND* Field(FieldNum)="" should be defined
 | 
|---|
| 165 |  ;"                  This will be primarily important for fields that are multiples, with sub recs.
 | 
|---|
| 166 |  ;"
 | 
|---|
| 167 |  ;"Example:
 | 
|---|
| 168 |  ;"  Array(8925,"TEMPLATE","TRANSFORM",.01)="write ""Custom .01 output transform M code here..."""
 | 
|---|
| 169 |  ;"  Array(8925,"TEMPLATE","TRANSFORM",.02)="write ""Custom .02 output transform M code here..."""
 | 
|---|
| 170 | 
 | 
|---|
| 171 | 
 | 
|---|
| 172 | 
 | 
|---|
| 173 | WriteXMLData(pArray,Flags,IndentS,ShowProgress)
 | 
|---|
| 174 |         ;"Scope: PUBLIC
 | 
|---|
| 175 |         ;"Purpose: to dump out a specified set of files and records in XML Format
 | 
|---|
| 176 |         ;"Input: pArray -- pointer to (i.e. name of) array containting formatting/output info.
 | 
|---|
| 177 |         ;"              REQUIRED An array specifying which files and records to display
 | 
|---|
| 178 |         ;"              Format as follows:
 | 
|---|
| 179 |         ;"              ;"-----------------------------------------
 | 
|---|
| 180 |         ;"              Array(File,IEN,FieldInfo)   ; For FieldInfo, see Write1File, and Write1Rec
 | 
|---|
| 181 |         ;"              Array(File,["TEMPLATE"],...)   ;For Template info see function Write1File
 | 
|---|
| 182 |         ;"              Array("FLAGS","b")=""  b -- show tags for ALL fields, even if field has no data
 | 
|---|
| 183 |         ;"              Array("FLAGS","i")=""  i -- indent tags for pretty, but technically useless, file formating.
 | 
|---|
| 184 |         ;"              Array("FLAGS","I")=""  I -- output INTERNAL values
 | 
|---|
| 185 |         ;"              Array("FLAGS","D")=""  D -- output the data dictionary
 | 
|---|
| 186 |         ;"              Array("FLAGS","S")=""  S -- output export settings.
 | 
|---|
| 187 |         ;"              Array("!DOCTYPE")=MyLabel
 | 
|---|
| 188 |         ;"              Array("EXPORT_SYSTEM_NAME")=LabelForExportingSystem   -- OPTIONAL
 | 
|---|
| 189 |         ;"              ;"-----------------------------------------
 | 
|---|
| 190 |         ;"
 | 
|---|
| 191 |         ;"      e.g.    Array(8925,1234)=""
 | 
|---|
| 192 |         ;"              Array(8925,1235)=""
 | 
|---|
| 193 |         ;"              Array(8925,1236)=""
 | 
|---|
| 194 |         ;"              Array(8925,1237)=""
 | 
|---|
| 195 |         ;"              Array(8925,1232)="tag=value^tag2=value2" <-- optional extra info for record
 | 
|---|
| 196 |         ;"                  e.g. -->  <Record id=1232 tag="value" tag2="value2">
 | 
|---|
| 197 |         ;"              Array(200,"*")=""
 | 
|---|
| 198 |         ;"              Array(22705,3)=""
 | 
|---|
| 199 |         ;"              Array(22705,5)=""
 | 
|---|
| 200 |         ;"              Array(2,"*")=""
 | 
|---|
| 201 |         ;"
 | 
|---|
| 202 |         ;"              This would print from:
 | 
|---|
| 203 |         ;"                      file 8925, records 1234,1235,1236,1237
 | 
|---|
| 204 |         ;"                      file 200, ALL records
 | 
|---|
| 205 |         ;"                      file 22705, records 3,5
 | 
|---|
| 206 |         ;"                      file 2, ALL records
 | 
|---|
| 207 |         ;"
 | 
|---|
| 208 |         ;"           Example:
 | 
|---|
| 209 |         ;"              Array(8925,"TEMPLATE",.01)=""   <-- define a template for file 8925
 | 
|---|
| 210 |         ;"              Array(8925,"TEMPLATE",.02)=""
 | 
|---|
| 211 |         ;"              Array(8925,"TEMPLATE",.02)=""
 | 
|---|
| 212 |         ;"              Array(8925,1234)   <-- print record 1234
 | 
|---|
| 213 |         ;"              Array(8925,1235)   <-- print record 1235
 | 
|---|
| 214 |         ;"
 | 
|---|
| 215 |         ;"           Example:
 | 
|---|
| 216 |         ;"              Array(8925,1234)   <-- print record 1234
 | 
|---|
| 217 |         ;"              Array(8925,1235)   <-- print record 1235
 | 
|---|
| 218 |         ;"
 | 
|---|
| 219 |         ;"           Example:
 | 
|---|
| 220 |         ;"              Array(8925,1234,.01)   <-- print record 1234, only field .01
 | 
|---|
| 221 |         ;"              Array(8925,1235,.04)   <-- print record 1235, only field .04
 | 
|---|
| 222 |         ;"
 | 
|---|
| 223 |         ;"              Note: File numbers can be replaces with full FILE NAMES, e.g.
 | 
|---|
| 224 |         ;"              Array("NEW PERSON","*")=""
 | 
|---|
| 225 |         ;"
 | 
|---|
| 226 |         ;"            Note: All File numbers and field numbers can be replaced with NAMES
 | 
|---|
| 227 |         ;"
 | 
|---|
| 228 |         ;"         Flags -- OPTIONAL  (Note Flags can also be specified with a "FLAGS" node)
 | 
|---|
| 229 |         ;"                      b -- show tags for ALL fields, even if field has no data
 | 
|---|
| 230 |         ;"                      i -- indent tags for pretty, but technically useless, file formating.
 | 
|---|
| 231 |         ;"                      I -- output INTERNAL values
 | 
|---|
| 232 |         ;"                      D -- output Data dictionary
 | 
|---|
| 233 |         ;"                      e.g. Flags="b"  or "bi"  or "ib"  or "iI" etc.
 | 
|---|
| 234 |         ;"         IndentS -- OPTIONAL -- current string to write to indent line.
 | 
|---|
| 235 |         ;"                    IndentS("IncIndent")=IncIndent
 | 
|---|
| 236 |         ;"        ShowProgress -- OPTIONAL -- if =1, then a progress bar will be shown.
 | 
|---|
| 237 |         ;"Output: results are written to the current device.
 | 
|---|
| 238 |         ;"result : none
 | 
|---|
| 239 | 
 | 
|---|
| 240 |         new File,tArray,SavFieldInfo
 | 
|---|
| 241 |         merge tArray=@pArray
 | 
|---|
| 242 |         set Flags=$get(Flags)
 | 
|---|
| 243 |         new IncIndent set IncIndent=$get(IndentS("IncIndent")," ")
 | 
|---|
| 244 | 
 | 
|---|
| 245 |         if ($data(tArray("FLAGS","b"))>0)&(Flags'["b") set Flags=Flags_"b"
 | 
|---|
| 246 |         if ($data(tArray("FLAGS","i"))>0)&(Flags'["i") set Flags=Flags_"i"
 | 
|---|
| 247 |         if ($data(tArray("FLAGS","I"))>0)&(Flags'["I") set Flags=Flags_"I"
 | 
|---|
| 248 |         if ($data(tArray("FLAGS","D"))>0)&(Flags'["D") set Flags=Flags_"D"
 | 
|---|
| 249 |         if ($data(tArray("FLAGS","S"))>0)&(Flags'["S") set Flags=Flags_"S"
 | 
|---|
| 250 | 
 | 
|---|
| 251 |         do WriteHeader
 | 
|---|
| 252 |         write "<!DOCTYPE "_$get(tArray("!DOCTYPE"),"UNDEFINED"),">",!
 | 
|---|
| 253 |         new SrcName set SrcName=$get(tArray("EXPORT_SYSTEM_NAME"),"?Unnamed?")
 | 
|---|
| 254 |         write "<EXPORT source=""",$$SYMENC^MXMLUTL(SrcName),""">",!
 | 
|---|
| 255 |         set IndentS=$get(IndentS)_IncIndent
 | 
|---|
| 256 |         if Flags["S" do WriteSettings(.Flags,.IndentS)  ;"output writing settings
 | 
|---|
| 257 | 
 | 
|---|
| 258 |         set File=""
 | 
|---|
| 259 |         for  set File=$order(tArray(File)) quit:(+File'>0)  do
 | 
|---|
| 260 |         . new IEN,Template,Recs
 | 
|---|
| 261 |         . merge Template=tArray(File,"TEMPLATE")
 | 
|---|
| 262 |         . kill tArray(File,"TEMPLATE")
 | 
|---|
| 263 |         . merge Recs=tArray(File)
 | 
|---|
| 264 |         . set IEN=$order(tArray(File,""))
 | 
|---|
| 265 |         . if IEN'="" do
 | 
|---|
| 266 |         . . if $data(TMGXDEBUG) do
 | 
|---|
| 267 |         . . . use $P write "Writing file: ",File,! use IO
 | 
|---|
| 268 |         . . if IEN="*" do
 | 
|---|
| 269 |         . . . do Write1File(File,.Recs,.Flags,.IndentS,.Template,.ShowProgress,,,,,.SavFieldInfo)
 | 
|---|
| 270 |         . . else  do
 | 
|---|
| 271 |         . . . new Recs merge Recs=tArray(File)
 | 
|---|
| 272 |         . . . do Write1File(File,.Recs,.Flags,.IndentS,,.ShowProgress,,,,,.SavFieldInfo)
 | 
|---|
| 273 | 
 | 
|---|
| 274 |         write "</EXPORT>",!
 | 
|---|
| 275 | 
 | 
|---|
| 276 |         quit
 | 
|---|
| 277 | 
 | 
|---|
| 278 | 
 | 
|---|
| 279 | WriteHeader
 | 
|---|
| 280 |         ;"Scope: PUBLIC
 | 
|---|
| 281 |         ;"Purpose: A shell to write out a proper XML header.  This should be done prior
 | 
|---|
| 282 |         ;"              to writing out XML formatted data to a device
 | 
|---|
| 283 |         ;"Output: Header is output to current device
 | 
|---|
| 284 |         ;"Results: none
 | 
|---|
| 285 | 
 | 
|---|
| 286 |         new s
 | 
|---|
| 287 |         set s=$$XMLHDR^MXMLUTL
 | 
|---|
| 288 |         write s,!
 | 
|---|
| 289 |         quit
 | 
|---|
| 290 | 
 | 
|---|
| 291 | 
 | 
|---|
| 292 | Write1File(File,Recs,Flags,IndentS,Template,ShowProgress,RWriter,FWriter,LWriter,WPLWriter,SavFieldInfo)
 | 
|---|
| 293 |         ;"Scope: PUBLIC
 | 
|---|
| 294 |         ;"Purpose: to dump out (in XML) one file, for specified records
 | 
|---|
| 295 |         ;"Input: File -- name or number of file to dump
 | 
|---|
| 296 |         ;"       Recs -- OPTIONAL. PASS BY REFERENCE (default is to write ALL records)
 | 
|---|
| 297 |         ;"          To specify records to write out, use Recs array with following format:
 | 
|---|
| 298 |         ;"          -------------------------------------------------------------------
 | 
|---|
| 299 |         ;"          Recs(IEN,Field,FieldInfo);  (Default for all is "*")
 | 
|---|
| 300 |         ;"                For format of FieldInfo, see function Write1Rec
 | 
|---|
| 301 |         ;"          Recs("Rec Exclude",IEN) <-- exclude IEN from output
 | 
|---|
| 302 |         ;"          -------------------------------------------------------------------
 | 
|---|
| 303 |         ;"          Example:
 | 
|---|
| 304 |         ;"                  Recs(1231)=""
 | 
|---|
| 305 |         ;"                  Recs(1232)=""
 | 
|---|
| 306 |         ;"                  Recs(1234)=""            this would be used to print records 1231,1232,1234
 | 
|---|
| 307 |         ;"                  Recs(1232)="tag=value^tag2=value2" <-- optional extra info for record
 | 
|---|
| 308 |         ;"                      e.g. <Record id=1232 tag="value" tag2="value2">
 | 
|---|
| 309 |         ;"
 | 
|---|
| 310 |         ;"           Example:  For ALL records, output ALL fields, and ALL subfields
 | 
|---|
| 311 |         ;"                   Recs("*")=""   <--- this is default if Recs is not specified/passed
 | 
|---|
| 312 |         ;"           Example:  For all records, output fields .01 and .02 and "NAME"
 | 
|---|
| 313 |         ;"                   Recs("*",.01)=""
 | 
|---|
| 314 |         ;"                   Recs("*",.02)=""
 | 
|---|
| 315 |         ;"                   Recs("*","NAME")=""
 | 
|---|
| 316 |         ;"           Example:  For record 1231, output fields .01 and .02
 | 
|---|
| 317 |         ;"                          For record 1232, output field .01 only
 | 
|---|
| 318 |         ;"                          For record 1234, output field "NAME" only
 | 
|---|
| 319 |         ;"                          For record 1235, output ALL fields
 | 
|---|
| 320 |         ;"                   Recs(1231,.01)=""
 | 
|---|
| 321 |         ;"                   Recs(1231,.02)=""
 | 
|---|
| 322 |         ;"                   Recs(1232,.01)=""
 | 
|---|
| 323 |         ;"                   Recs(1234,"NAME")=""
 | 
|---|
| 324 |         ;"                   Recs(1235,"*")=""
 | 
|---|
| 325 |         ;"           Example:  For all records, output field "ENTRY", which is a multiple.  In
 | 
|---|
| 326 |         ;"                           subfile, output records .01, and .02
 | 
|---|
| 327 |         ;"                   Recs("*","ENTRY",.01)=""
 | 
|---|
| 328 |         ;"                   Recs("*","ENTRY",.02)=""
 | 
|---|
| 329 |         ;"           Example:  For ALL records, output ALL fields, and ALL subfields, with 2 exceptions
 | 
|---|
| 330 |         ;"                   Recs("*")=""
 | 
|---|
| 331 |         ;"                   Recs("Rec Exclude",1234)=""  <-- All records except 1234 & 1235 will be output
 | 
|---|
| 332 |         ;"                   Recs("Rec Exclude",1235)=""
 | 
|---|
| 333 |         ;"       Flags -- OPTIONAL
 | 
|---|
| 334 |         ;"                    b -- show tags for ALL fields, even if field has no data
 | 
|---|
| 335 |         ;"                    i -- indent tags for pretty, but technically useless, file formating.
 | 
|---|
| 336 |         ;"                    I -- output INTERNAL values
 | 
|---|
| 337 |         ;"                    D -- include data dictionary for file.
 | 
|---|
| 338 |         ;"                    S -- output export settings
 | 
|---|
| 339 |         ;"       IndentS -- OPTIONAL -- current string to write to indent line.
 | 
|---|
| 340 |         ;"                    IndentS("IncIndent")=IncIndent
 | 
|---|
| 341 |         ;"       Template -- OPTIONAL.  PASS BY REFERENCE
 | 
|---|
| 342 |         ;"                    This can be used for instances where the same set of fields are desired for
 | 
|---|
| 343 |         ;"                    multiple records.
 | 
|---|
| 344 |         ;"                    Example:
 | 
|---|
| 345 |         ;"                      Recs(1231)=""
 | 
|---|
| 346 |         ;"                      Recs(1232)=""
 | 
|---|
| 347 |         ;"                      Recs(1234)=""
 | 
|---|
| 348 |         ;"                      with  Template(.01)=""
 | 
|---|
| 349 |         ;"                              Template(.02)=""
 | 
|---|
| 350 |         ;"                      Is the same as specifying:
 | 
|---|
| 351 |         ;"                      Recs(1231,.01)=""
 | 
|---|
| 352 |         ;"                      Recs(1231,.02)=""
 | 
|---|
| 353 |         ;"                      Recs(1232,.01)=""
 | 
|---|
| 354 |         ;"                      Recs(1232,.02)=""
 | 
|---|
| 355 |         ;"                      Recs(1234,.01)=""
 | 
|---|
| 356 |         ;"                      Recs(1234,.02)=""
 | 
|---|
| 357 |         ;"       ShowProgress   -- OPTIONAL -- if >0, then a progress bar will be shown.
 | 
|---|
| 358 |         ;"       RWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 359 |         ;"                actual starting and ending <record> </record>.  e.g.
 | 
|---|
| 360 |         ;"                "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 361 |         ;"                as custom function must accept same parameters as WriteRLabel
 | 
|---|
| 362 |         ;"       FWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 363 |         ;"                actual line of text out.  e.g. "WriteFLabel" or
 | 
|---|
| 364 |         ;"                "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 365 |         ;"       LWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 366 |         ;"                actual line of text out for WP fields.  e.g. "WriteLine" or
 | 
|---|
| 367 |         ;"                "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 368 |         ;"                as custom function must accept same parameters as WriteLine
 | 
|---|
| 369 |         ;"                as custom function must accept same parameters as WriteFLabel
 | 
|---|
| 370 |         ;"       WPLWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 371 |         ;"                actual line of text out for WP fields.  If not provided, then
 | 
|---|
| 372 |         ;"                LWriter will be used instead.
 | 
|---|
| 373 |         ;"                e.g. "WriteWPLine" or "MyWPCustomFn".  Note do NOT include parameters.
 | 
|---|
| 374 |         ;"                Function named as custom function must accept same parameters as WriteLine
 | 
|---|
| 375 |         ;"       SavFieldInfo -- OPTIONAL -- PASS BY REFERENCE.  An array to hold lookup values about
 | 
|---|
| 376 |         ;"                fields, so it doesn't have to be done each time (faster)
 | 
|---|
| 377 |         ;"Output: results are written to the current device.
 | 
|---|
| 378 |         ;"result : none
 | 
|---|
| 379 | 
 | 
|---|
| 380 |         new ORoot,GRef
 | 
|---|
| 381 |         new FileNum,FName
 | 
|---|
| 382 |         new prgsCt set prgsCt=0
 | 
|---|
| 383 |         new prgsMax
 | 
|---|
| 384 | 
 | 
|---|
| 385 |         new IncIndent set IncIndent=$get(IndentS("IncIndent")," ")
 | 
|---|
| 386 |         if $data(Template)=0 set Template("*")=""
 | 
|---|
| 387 |         new RecsSpecified set RecsSpecified=(($data(Recs)>1)&($data(Recs("*"))=0))
 | 
|---|
| 388 |         new keyin set keyin=32
 | 
|---|
| 389 |         new startTime set startTime=$H
 | 
|---|
| 390 |         set RWriter=$get(RWriter,"WriteRLabel")
 | 
|---|
| 391 |         set IndentS=$get(IndentS)
 | 
|---|
| 392 | 
 | 
|---|
| 393 |         set FileNum=+$get(File)
 | 
|---|
| 394 |         if FileNum=0 do
 | 
|---|
| 395 |         . set FileNum=$$GetFileNum^TMGDBAPI(.File)
 | 
|---|
| 396 |         . set FName=File
 | 
|---|
| 397 |         else  do
 | 
|---|
| 398 |         . set FName=$order(^DD(FileNum,0,"NM",""))
 | 
|---|
| 399 |         if FileNum=0 do  goto WFDone
 | 
|---|
| 400 |         . do ShowError^TMGDEBUG(.PriorErrorFound,"Can't convert file '"_$get(File)_", to a number.")
 | 
|---|
| 401 | 
 | 
|---|
| 402 |         set ORoot=$$GET1^DID(FileNum,"","","GLOBAL NAME") ;" Get global root   (Thanks, Don Donati...)
 | 
|---|
| 403 |         set GRef=$$CREF^DILF(ORoot) ;" Convert open to closed root
 | 
|---|
| 404 | 
 | 
|---|
| 405 |         if $get(ShowProgress) do
 | 
|---|
| 406 |         . if RecsSpecified do
 | 
|---|
| 407 |         . . set prgsMax=$$ListCt^TMGMISC("Recs")
 | 
|---|
| 408 |         . else  do
 | 
|---|
| 409 |         . . set prgsMax=0
 | 
|---|
| 410 |         . . set IEN=$order(@GRef@("")) ;"count ALL records in file.
 | 
|---|
| 411 |         . . for  do  quit:(IEN'>0)
 | 
|---|
| 412 |         . . . set IEN=$order(@GRef@(IEN))
 | 
|---|
| 413 |         . . . if +IEN>0 set prgsMax=prgsMax+1
 | 
|---|
| 414 | 
 | 
|---|
| 415 |         set Flags=$get(Flags)
 | 
|---|
| 416 |         if Flags["i" write IndentS
 | 
|---|
| 417 |         write "<FILE id=""",FileNum,""" label=""",$$SYMENC^MXMLUTL(FName),""">",!
 | 
|---|
| 418 | 
 | 
|---|
| 419 |         if Flags["D" do WriteDD(FileNum,Flags,IndentS_IncIndent)  ;"write out data dictionary file
 | 
|---|
| 420 | 
 | 
|---|
| 421 |         new IndS2 set IndS2=IndentS_IncIndent
 | 
|---|
| 422 |         new IEN set IEN=0
 | 
|---|
| 423 |         for  do  quit:(IEN'>0)
 | 
|---|
| 424 |         . if $data(Fields)'>1 set Fields("*")=""
 | 
|---|
| 425 |         . if RecsSpecified do
 | 
|---|
| 426 |         . . set IEN=$order(Recs(IEN))  ;"Cycle through specified records
 | 
|---|
| 427 |         . . new Extra set Extra=$get(Recs(IEN))
 | 
|---|
| 428 |         . . if Extra'="" do  ;"parse extra info into IEN array for output
 | 
|---|
| 429 |         . . . new s,n,tag,value
 | 
|---|
| 430 |         . . . for n=1:1:$length(Extra,"^") do
 | 
|---|
| 431 |         . . . . set s=$piece(Extra,"^",n)
 | 
|---|
| 432 |         . . . . if s'["=" quit
 | 
|---|
| 433 |         . . . . set tag=$piece(s,"=",1)
 | 
|---|
| 434 |         . . . . set value=$piece(s,"=",2)
 | 
|---|
| 435 |         . . . . set IEN(tag)=value
 | 
|---|
| 436 |         . else  do
 | 
|---|
| 437 |         . . set IEN=$order(@GRef@(IEN)) ;"Cycle through ALL records in file.
 | 
|---|
| 438 |         . if (IEN'>0) quit
 | 
|---|
| 439 |         . if $data(Recs("Rec Exclude",IEN)) quit ;"skip excluded records
 | 
|---|
| 440 |         . new Fields merge Fields=Recs(IEN)
 | 
|---|
| 441 |         . if $data(Fields)'>1 merge Fields=Template
 | 
|---|
| 442 |         . if $get(Flags)["i" write $get(IndS2)
 | 
|---|
| 443 |         . new exFn set exFn="do "_RWriter_"(.IEN,0)"
 | 
|---|
| 444 |         . xecute exFn
 | 
|---|
| 445 |         . if $data(TMGXDEBUG) do
 | 
|---|
| 446 |         . . use $P
 | 
|---|
| 447 |         . . write "Writing record: ",IEN,"  prgsCt=",prgsCt," prgsMax=",prgsMax,!
 | 
|---|
| 448 |         . . use IO
 | 
|---|
| 449 |         . do Write1Rec(FileNum,IEN,.Fields,.Flags,"","",IndS2_IncIndent,.RWriter,.FWriter,.LWriter,.WPLWriter,.SavFieldInfo)
 | 
|---|
| 450 |         . if $get(Flags)["i" write $get(IndS2)
 | 
|---|
| 451 |         . set exFn="do "_RWriter_"(.IEN,1)"
 | 
|---|
| 452 |         . xecute exFn
 | 
|---|
| 453 |         . set prgsCt=prgsCt+1
 | 
|---|
| 454 |         . if $get(ShowProgress)&(prgsCt#2=1) do
 | 
|---|
| 455 |         . . use $P
 | 
|---|
| 456 |         . . do ProgressBar^TMGUSRIF(prgsCt,"Writing "_FName,1,prgsMax,,startTime)
 | 
|---|
| 457 |         . . use IO
 | 
|---|
| 458 |         . ;"use $P read *keyin use IO
 | 
|---|
| 459 |         . if keyin=27 do
 | 
|---|
| 460 |         . . new Abort
 | 
|---|
| 461 |         . . use $P
 | 
|---|
| 462 |         . . write prgsCt," records written so far...",!
 | 
|---|
| 463 |         . . write !,"Do you want to abort XML export? NO// "
 | 
|---|
| 464 |         . . read Abort:$get(DTIME,3600),!
 | 
|---|
| 465 |         . . if Abort="" set Abort="NO"
 | 
|---|
| 466 |         . . if "YESyesYes"[Abort set IEN=0  ;"abort signal
 | 
|---|
| 467 |         . . write "OK.  Continuing...",!
 | 
|---|
| 468 |         . . use IO
 | 
|---|
| 469 | 
 | 
|---|
| 470 |         if $get(Flags)["i" write IndentS
 | 
|---|
| 471 |         write "</FILE>",!
 | 
|---|
| 472 | 
 | 
|---|
| 473 |         if $get(ShowProgress) do
 | 
|---|
| 474 |         . use $P
 | 
|---|
| 475 |         . do ProgressBar^TMGUSRIF(100,"Writing "_FName,1,100)
 | 
|---|
| 476 |         . use IO
 | 
|---|
| 477 | 
 | 
|---|
| 478 | WFDone
 | 
|---|
| 479 |         quit
 | 
|---|
| 480 | 
 | 
|---|
| 481 | WriteSettings(Flags,IndentS)
 | 
|---|
| 482 |         ;"Scope: PRIVATE
 | 
|---|
| 483 |         ;"Purpose: to output XML output settings.
 | 
|---|
| 484 |         ;"Input: Flags -- flags as declared above.  Only "i" used here
 | 
|---|
| 485 |         ;"       IndentS -- OPTIONAL -- current string to write to indent line.
 | 
|---|
| 486 |         ;"          IndentS("IncIndent")=IncIndent
 | 
|---|
| 487 | 
 | 
|---|
| 488 |         ;"NOTE: Uses GLOBAL SCOPED IncIndent variable.  But setting this is OPTIONAL.
 | 
|---|
| 489 |         ;"Results: none
 | 
|---|
| 490 | 
 | 
|---|
| 491 |         set IndentS=$get(IndentS)
 | 
|---|
| 492 |         set Flags=$get(Flags)
 | 
|---|
| 493 |         new IncIndent set IncIndent=$get(IndentS("IncIndent")," ")
 | 
|---|
| 494 | 
 | 
|---|
| 495 |         if Flags["i" write IndentS
 | 
|---|
| 496 |         write "<ExportSettings>",!
 | 
|---|
| 497 | 
 | 
|---|
| 498 |         new fArray,fl
 | 
|---|
| 499 |         set fArray("i")="Indent_Output"
 | 
|---|
| 500 |         set fArray("b")="Output_Blanks"
 | 
|---|
| 501 |         set fArray("I")="Output_Internal_Values"
 | 
|---|
| 502 |         set fArray("D")="Output_Data_Dictionary"
 | 
|---|
| 503 | 
 | 
|---|
| 504 |         set fl=""
 | 
|---|
| 505 |         for  set fl=$order(fArray(fl)) quit:(fl="")  do
 | 
|---|
| 506 |         . if Flags["i" write IndentS_IncIndent
 | 
|---|
| 507 |         . write "<Setting id=""",$$SYMENC^MXMLUTL($get(fArray(fl))),""">"
 | 
|---|
| 508 |         . write $select((Flags[fl):"TRUE",1:"FALSE")
 | 
|---|
| 509 |         . write "</Setting>",!
 | 
|---|
| 510 | 
 | 
|---|
| 511 |         if Flags["i" write IndentS
 | 
|---|
| 512 |         write "</ExportSettings>",!
 | 
|---|
| 513 | 
 | 
|---|
| 514 |         quit
 | 
|---|
| 515 | 
 | 
|---|
| 516 | WriteDD(FileNum,Flags,IndentS)
 | 
|---|
| 517 |         ;"Scope: PRIVATE
 | 
|---|
| 518 |         ;"Purpose: to write out data dictionary file, ^DIC,and file Header in XML format
 | 
|---|
| 519 |         ;"Input: FileNum -- the file number (not name) of the data dictionary to export
 | 
|---|
| 520 |         ;"       Flags -- flags as declared above.  Only "i" used here
 | 
|---|
| 521 |         ;"       IndentS -- OPTIONAL -- current string to write to indent line.
 | 
|---|
| 522 |         ;"NOTE: Uses GLOBAL SCOPED IncIndent variable.  But setting this is OPTIONAL.
 | 
|---|
| 523 |         ;"Results: none
 | 
|---|
| 524 | 
 | 
|---|
| 525 |         new ProgressFn
 | 
|---|
| 526 |         use $P write ! use IO
 | 
|---|
| 527 |         set IncIndent=$get(IncIndent,"  ")
 | 
|---|
| 528 | 
 | 
|---|
| 529 |         set ProgressFn="use $P do ProgressBar^TMGUSRIF(IncVar,""^DD("_FileNum_")"",0,100000,,"""_$H_""") use IO"
 | 
|---|
| 530 |         do WriteArray^TMGXMLT($name(^DD(FileNum)),"DataDictionary",FileNum,.Flags,.IndentS,.IncIndent,.ProgressFn)
 | 
|---|
| 531 | 
 | 
|---|
| 532 |         set ProgressFn="use $P do ProgressBar^TMGUSRIF(IncVar,""^(DIC("_FileNum_")"",0,1000000,,"""_$H_""") use IO"
 | 
|---|
| 533 |         new DIC ;"Pull just the fileman nodes.  ^DIC also contains some full files...
 | 
|---|
| 534 |         merge DIC(FileNum,0)=^DIC(FileNum,0)
 | 
|---|
| 535 |         merge DIC(FileNum,"%")=^DIC(FileNum,"%")
 | 
|---|
| 536 |         merge DIC(FileNum,"%A")=^DIC(FileNum,"%A")
 | 
|---|
| 537 |         merge DIC(FileNum,"%D")=^DIC(FileNum,"%D")
 | 
|---|
| 538 |         do WriteArray^TMGXMLT("DIC("_FileNum_")","DIC_File",FileNum,.Flags,.IndentS,.IncIndent,.ProgressFn)
 | 
|---|
| 539 | 
 | 
|---|
| 540 |         do
 | 
|---|
| 541 |         . new Ref set Ref=$get(^DIC(FileNum,0,"GL"))
 | 
|---|
| 542 |         . set Ref=$$CREF^DILF(Ref) ;" Convert open to closed root
 | 
|---|
| 543 |         . if $get(Flags)["i" write IndentS
 | 
|---|
| 544 |         . write "<FILE_HEADER id=""",FileNum,""">",!
 | 
|---|
| 545 |         . if $get(Flags)["i" write IndentS
 | 
|---|
| 546 |         . write $get(@Ref@(0)),!
 | 
|---|
| 547 |         . if $get(Flags)["i" write IndentS
 | 
|---|
| 548 |         . write "</FILE_HEADER>",!
 | 
|---|
| 549 | 
 | 
|---|
| 550 |         ;"use $P write ! use IO
 | 
|---|
| 551 |         quit
 | 
|---|
| 552 | 
 | 
|---|
| 553 | 
 | 
|---|
| 554 | Write1Rec(File,IEN,Fields,Flags,SRef,IENS,IndentS,RWriter,FWriter,LWriter,WPLWriter,SavFieldInfo)
 | 
|---|
| 555 |         ;"Scope: PUBLIC
 | 
|---|
| 556 |         ;"Purpose: To dump one record out in XML format
 | 
|---|
| 557 |         ;"Input:      File -- name or number of file to dump
 | 
|---|
| 558 |         ;"              IEN -- Record number (IEN) to dump (see also IENS below)
 | 
|---|
| 559 |         ;"              Fields -- OPTIONAL.  PASS BY REFERENCE.  Array of fields to write, format at follows
 | 
|---|
| 560 |         ;"                      Fields(Field,[SubRecNums,[SubFields,...]])=""
 | 
|---|
| 561 |         ;"                      Fields(Field,["Rec Exclude",Excluded IEN])=""
 | 
|---|
| 562 |         ;"                      Fields("Field Exclude",ExcludedField)=""                 <-- OPTIONAL
 | 
|---|
| 563 |         ;"                      Fields("ORDER",OrderNum)=Field                          <-- OPTIONAL
 | 
|---|
| 564 |         ;"                      Fields("TAG NAME",FieldNumber)="Custom field name to put in XML file"  <-- OPTIONAL
 | 
|---|
| 565 |         ;"
 | 
|---|
| 566 |         ;"                   Example:
 | 
|---|
| 567 |         ;"                      Fields(.01)=""
 | 
|---|
| 568 |         ;"                      Fields(.02)=""
 | 
|---|
| 569 |         ;"                      Fields("NAME")=""  <--- note that field name is allowed in place of number
 | 
|---|
| 570 |         ;"                      Fields(.03)=""
 | 
|---|
| 571 |         ;"
 | 
|---|
| 572 |         ;"                  Example:
 | 
|---|
| 573 |         ;"                      Fields("*")=""    <--- indicates that ALL fields, ALL subrecs,and ALL subfields are wanted
 | 
|---|
| 574 |         ;"
 | 
|---|
| 575 |         ;"                  Example:
 | 
|---|
| 576 |         ;"                      Fields("*")=""
 | 
|---|
| 577 |         ;"                      Fields("Field Exclude",.04)=""  <-- don't show field .04
 | 
|---|
| 578 |         ;"                      Fields("Field Exclude","STATE")=""  <-- don't show field "STATE"
 | 
|---|
| 579 |         ;"
 | 
|---|
| 580 |         ;"                  Example: Field .04 is multiple. ALL sub records and ALL subfields to be written
 | 
|---|
| 581 |         ;"                      Fields(.04,"*","*")=""
 | 
|---|
| 582 |         ;"                      Fields(.04,"*")=""  <--- "*" assumed for subfields
 | 
|---|
| 583 |         ;"                      Fields(.04)=""   <-- "*" assumed for subrecords and subfields.
 | 
|---|
| 584 |         ;"
 | 
|---|
| 585 |         ;"                  Example: Field .03 is multiple. All sub records to be written, and .01 and .02 fields to be written
 | 
|---|
| 586 |         ;"                      Fields(.03,"*",.01)=""  <-- In all sub recs, sub field .01 is to be written
 | 
|---|
| 587 |         ;"                      Fields(.03,"*",.02)=""  <-- In all sub recs, sub field .02 is to be written
 | 
|---|
| 588 |         ;"                      Fields(.03,"Rec Exclude",5)=""  <-- Exclude subrec 5
 | 
|---|
| 589 |         ;"
 | 
|---|
| 590 |         ;"                  Example: Field .03 is multiple. Sub records 1,2,3 to be written, fields as below
 | 
|---|
| 591 |         ;"                      Fields(.03,1,.01)=""   <-- In sub rec 1, sub field .01 is to be written
 | 
|---|
| 592 |         ;"                      Fields(.03,1,.02)=""   <-- In sub rec 1, sub field .02 is to be written
 | 
|---|
| 593 |         ;"                      Fields(.03,2,.01)=""   <-- In sub rec 2, sub field .01 is to be written
 | 
|---|
| 594 |         ;"                      Fields(.03,3,"*")=""   <-- In sub rec 3, all sub fields are to be written
 | 
|---|
| 595 |         ;"                      Fields(.03,4)=""        <-- In sub rec 4, all sub fields are to be written (defalt)
 | 
|---|
| 596 |         ;"                      Fields(.03,5,"*")=""   <-- In sub rec 5, all sub fields are to be written, with one exception
 | 
|---|
| 597 |         ;"                      Fields(.03,5,"Field Exclude",.01)="" <-- In sub rec 5, sub fields .01 is not to be written.
 | 
|---|
| 598 |         ;"
 | 
|---|
| 599 |         ;"                   Example:   Shows optional substitution of a new tag name for a given field
 | 
|---|
| 600 |         ;"                      Fields("TAG NAME",.01)="Patent Name"  <-- use "Patient Name" instead of field name for .01 field
 | 
|---|
| 601 |         ;"                      Fields("TAG NAME",.02)="City"  <-- use "City" instead of field name for .02 field
 | 
|---|
| 602 |         ;"
 | 
|---|
| 603 |         ;"                   Example:
 | 
|---|
| 604 |         ;"                      Array("TRANSFORM",.01)="write ""Custom .01 output transform M code here..."""
 | 
|---|
| 605 |         ;"                      Array("TRANSFORM",.02)="write ""Custom .02 output transform M code here..."""
 | 
|---|
| 606 |         ;"
 | 
|---|
| 607 |         ;"                   Note: pattern continues for sub-sub-multiples etc.
 | 
|---|
| 608 |         ;"
 | 
|---|
| 609 |         ;"                   Example:
 | 
|---|
| 610 |         ;"                      Fields(.01)=""
 | 
|---|
| 611 |         ;"                      Fields(.02)=""
 | 
|---|
| 612 |         ;"                      Fields("NAME")=""  <--- note that field name is allowed in place of number
 | 
|---|
| 613 |         ;"                      Fields(.03,1,.01)=""   <-- In sub rec 1, sub field .01 is to be written
 | 
|---|
| 614 |         ;"                      Fields(.03,1,.02)=""   <-- In sub rec 1, sub field .02 is to be written
 | 
|---|
| 615 |         ;"                      Fields(.03,2,.01)=""   <-- In sub rec 2, sub field .01 is to be written
 | 
|---|
| 616 |         ;"                      Fields(.03,3,"*")=""   <-- In sub rec 3, all sub fields are to be written
 | 
|---|
| 617 |         ;"                      Fields(.03,4)=""        <-- In sub rec 4, all sub fields are to be written (defalt)
 | 
|---|
| 618 |         ;"                      Fields("ORDER",1)=.03            <-- 1st field to output
 | 
|---|
| 619 |         ;"                      Fields("ORDER",2)=.02            <-- 2nd field to output
 | 
|---|
| 620 |         ;"                      Fields("ORDER",3)="NAME"    <-- 3rd field to output
 | 
|---|
| 621 |         ;"                      Fields("ORDER",4)=.01            <-- 4th field to output
 | 
|---|
| 622 |         ;"                      Note: Specifying an 'ORDER' is not compatible with specifying "*" fields
 | 
|---|
| 623 |         ;"                              If "ORDER" is specified, only fields with a given order will be output
 | 
|---|
| 624 |         ;"                              Both Field("ORDER",x)=FieldNum *AND* Field(FieldNum)="" should be defined
 | 
|---|
| 625 |         ;"                                      This will be primarily important for fields that are multiples, with sub recs.
 | 
|---|
| 626 |         ;"
 | 
|---|
| 627 |         ;"              Flags -- OPTIONAL
 | 
|---|
| 628 |         ;"                      b -- show tags for fields, even if field has no data
 | 
|---|
| 629 |         ;"                      i -- indent tags for pretty, but technically useless, file formating.
 | 
|---|
| 630 |         ;"                      I -- output INTERNAL values
 | 
|---|
| 631 |         ;"              SRef -- OPTIONAL (Used only when calling self recursively)
 | 
|---|
| 632 |         ;"              IENS -- OPTIONAL a standard IENS string
 | 
|---|
| 633 |         ;"                              e.g. "IEN,parent-IEN,grandparent-IEN," etc.
 | 
|---|
| 634 |         ;"                              This is used when calling self recursively, to handle subfiles
 | 
|---|
| 635 |         ;"              IndentS -- OPTIONAL -- current string to write to indent line.
 | 
|---|
| 636 |         ;"              RWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 637 |         ;"                               actual starting and ending <record> </record>.  e.g.
 | 
|---|
| 638 |         ;"                              "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 639 |         ;"                              as custom function must accept same parameters as WriteRLabel
 | 
|---|
| 640 |         ;"              FWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 641 |         ;"                              actual line of text out.  e.g. "WriteFLabel" or
 | 
|---|
| 642 |         ;"                              "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 643 |         ;"                              as custom function must accept same parameters as WriteFLabel
 | 
|---|
| 644 |         ;"              LWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 645 |         ;"                              actual line of text out for fields.  e.g. "WriteLine" or
 | 
|---|
| 646 |         ;"                              "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 647 |         ;"                              as custom function must accept same parameters as WriteLine
 | 
|---|
| 648 |         ;"            WPLWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 649 |         ;"                              actual line of text out for WP fields.  If not provided, then
 | 
|---|
| 650 |         ;"                              LWriter will be used instead.
 | 
|---|
| 651 |         ;"                              e.g. "WriteWPLine" or "MyWPCustomFn".  Note do NOT include parameters.
 | 
|---|
| 652 |         ;"                              Function named as custom function must accept same parameters as WriteLine
 | 
|---|
| 653 |         ;"            SavFieldInfo -- OPTIONAL -- PASS BY REFERENCE.  An array to hold lookup values about
 | 
|---|
| 654 |         ;"                              fields, so it doesn't have to be done each time (faster)
 | 
|---|
| 655 | 
 | 
|---|
| 656 |         ;"Output: Values are written to the current device
 | 
|---|
| 657 |         ;"Results: None
 | 
|---|
| 658 |         ;"Note: this code began its life as a function written by Greg Woodhouse (thanks Greg!)
 | 
|---|
| 659 | 
 | 
|---|
| 660 |         new Field,FldType,FieldInfo
 | 
|---|
| 661 |         new StoreLoc,Node,Pos
 | 
|---|
| 662 |         new IntValue,ORoot,GRef
 | 
|---|
| 663 |         new Range,FIRST,LAST
 | 
|---|
| 664 |         new SubFile,SRoot,CRoot
 | 
|---|
| 665 |         new SubRec,VAL2,Label
 | 
|---|
| 666 |         new FileNum
 | 
|---|
| 667 |         new IncIndent set IncIndent="  "
 | 
|---|
| 668 |         if $data(Fields)<10 set Fields("*")=""
 | 
|---|
| 669 |         new AllFields set AllFields=($data(Fields("*"))>0)
 | 
|---|
| 670 |         new OrdFields,OrdIndex set OrdFields=0,OrdIndex=0
 | 
|---|
| 671 |         if $order(Fields("ORDER"))>1 set AllFields=0,OrdFields=1
 | 
|---|
| 672 | 
 | 
|---|
| 673 |         new LastFileName
 | 
|---|
| 674 | 
 | 
|---|
| 675 |         set FileNum=+$get(File)
 | 
|---|
| 676 |         if FileNum=0 set FileNum=$$GetFileNum^TMGDBAPI(.File)
 | 
|---|
| 677 |         if FileNum=0 do  goto WRDone
 | 
|---|
| 678 |         . do ShowError^TMGDEBUG(.PriorErrorFound,"Can't convert file '"_$get(File)_", to a number.")
 | 
|---|
| 679 | 
 | 
|---|
| 680 |         if $get(IENS)="" set IENS=IEN_","
 | 
|---|
| 681 | 
 | 
|---|
| 682 |         set Field=0
 | 
|---|
| 683 |         set LastFileName=Field
 | 
|---|
| 684 | 
 | 
|---|
| 685 |         ;"Ensure all text exclusion fields are converted to numeric ones.
 | 
|---|
| 686 |         if $data(Fields("Field Exclude"))>0 do
 | 
|---|
| 687 |         . new field
 | 
|---|
| 688 |         . set field=$order(Fields("Field Exclude",""))
 | 
|---|
| 689 |         . if field'="" for  do  quit:(field="")
 | 
|---|
| 690 |         . . if +field'=field do
 | 
|---|
| 691 |         . . . new tempField
 | 
|---|
| 692 |         . . . set tempField=$$GetNumField^TMGDBAPI(FileNum,field)
 | 
|---|
| 693 |         . . . set Fields("Field Exclude",tempField)=""
 | 
|---|
| 694 |         . . set field=$order(Fields("Field Exclude",field))
 | 
|---|
| 695 | 
 | 
|---|
| 696 |         ;"Ensure all custom tag field names are converted to numeric ones.
 | 
|---|
| 697 |         if $data(Fields("TAG NAME"))>0 do
 | 
|---|
| 698 |         . new field
 | 
|---|
| 699 |         . set field=$order(Fields("TAG NAME",""))
 | 
|---|
| 700 |         . if field'="" for  do  quit:(field="")
 | 
|---|
| 701 |         . . if +field'=field do
 | 
|---|
| 702 |         . . . new tempField
 | 
|---|
| 703 |         . . . set tempField=$$GetNumField^TMGDBAPI(FileNum,field)
 | 
|---|
| 704 |         . . . set Fields("TAG NAME",tempField)=Fields("TAG NAME",field)
 | 
|---|
| 705 |         . . set field=$order(Fields("TAG NAME",field))
 | 
|---|
| 706 | 
 | 
|---|
| 707 |         ;"Ensure all custom TRANSFORM field names are converted to numeric ones.
 | 
|---|
| 708 |         if $data(Fields("TRANSFORM"))>0 do
 | 
|---|
| 709 |         . new field
 | 
|---|
| 710 |         . set field=$order(Fields("TRANSFORM",""))
 | 
|---|
| 711 |         . if field'="" for  do  quit:(field="")
 | 
|---|
| 712 |         . . if +field'=field do
 | 
|---|
| 713 |         . . . new tempField
 | 
|---|
| 714 |         . . . set tempField=$$GetNumField^TMGDBAPI(FileNum,field)
 | 
|---|
| 715 |         . . . set Fields("TRANSFORM",tempField)=Fields("TRANSFORM",field)
 | 
|---|
| 716 |         . . set field=$order(Fields("TRANSFORM",field))
 | 
|---|
| 717 | 
 | 
|---|
| 718 |         ;"NOTE: It is ineffecient to call a function for each field.  That requires
 | 
|---|
| 719 |         ;"      the field function to call $$GET1^DIQ.  A more effecient way would
 | 
|---|
| 720 |         ;"      be to call GETS^DIQ to get ALL the field's values at once, and then
 | 
|---|
| 721 |         ;"      pass the value to the field function.  FIX LATER...
 | 
|---|
| 722 | 
 | 
|---|
| 723 |         for  do  quit:(+Field'>0)
 | 
|---|
| 724 |         . if AllFields do
 | 
|---|
| 725 |         . . set Field=$order(^DD(FileNum,Field))
 | 
|---|
| 726 |         . else  if OrdFields do  quit:(Field="")
 | 
|---|
| 727 |         . . set OrdIndex=$order(Fields("ORDER",OrdIndex))
 | 
|---|
| 728 |         . . set Field=$get(Fields("ORDER",OrdIndex))
 | 
|---|
| 729 |         . else  do  quit:(+Field'>0)
 | 
|---|
| 730 |         . . set Field=$order(Fields(LastFileName))
 | 
|---|
| 731 |         . set LastFileName=Field
 | 
|---|
| 732 |         . if +Field=0 set Field=$$GetNumField^TMGDBAPI(FileNum,Field)
 | 
|---|
| 733 |         . if $data(Fields("Field Exclude",Field))>0 quit
 | 
|---|
| 734 |         . if +Field=0 quit
 | 
|---|
| 735 |         . do Write1Fld(FileNum,IEN,Field,.Fields,.Flags,.SRef,.IENS,.IndentS,.RWriter,.FWriter,.LWriter,.WPLWriter,.SavFieldInfo)
 | 
|---|
| 736 | 
 | 
|---|
| 737 | WRDone
 | 
|---|
| 738 |         quit
 | 
|---|
| 739 | 
 | 
|---|
| 740 | 
 | 
|---|
| 741 | Write1Fld(FileNum,IEN,Field,Fields,Flags,SRef,IENS,IndentS,RWriter,FWriter,LWriter,WPLWriter,SavFieldInfo)
 | 
|---|
| 742 |         ;"Scope: PUBLIC
 | 
|---|
| 743 |         ;"Purpose: To dump one field out in XML format
 | 
|---|
| 744 |         ;"Input: FileNum -- number of file containing field
 | 
|---|
| 745 |         ;"       IEN -- Record number (IEN) to dump (see also IENS below).  Ignored if IENS supplied
 | 
|---|
| 746 |         ;"       Field -- The field number to write from array below.
 | 
|---|
| 747 |         ;"       Fields -- The field to write.
 | 
|---|
| 748 |         ;"       Flags -- OPTIONAL
 | 
|---|
| 749 |         ;"               b -- show tags for fields, even if field has no data
 | 
|---|
| 750 |         ;"               i -- indent tags for pretty, but technically useless, file formating.
 | 
|---|
| 751 |         ;"               I -- output INTERNAL values
 | 
|---|
| 752 |         ;"       SRef -- OPTIONAL (Used only when calling self recursively)
 | 
|---|
| 753 |         ;"       IENS -- OPTIONAL a standard IENS string
 | 
|---|
| 754 |         ;"                       e.g. "IEN,parent-IEN,grandparent-IEN," etc.
 | 
|---|
| 755 |         ;"                       This is used when calling self recursively, to handle subfiles
 | 
|---|
| 756 |         ;"                       Late Note: if IENS is supplied, then IEN is ignored
 | 
|---|
| 757 |         ;"       IndentS -- OPTIONAL -- current string to write to indent line.
 | 
|---|
| 758 |         ;"       RWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 759 |         ;"                        actual starting and ending <record> </record>.  e.g.
 | 
|---|
| 760 |         ;"                       "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 761 |         ;"                       as custom function must accept same parameters as WriteRLabel
 | 
|---|
| 762 |         ;"       FWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 763 |         ;"                       actual line of text out.  e.g. "WriteFLabel" or
 | 
|---|
| 764 |         ;"                       "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 765 |         ;"                       as custom function must accept same parameters as WriteFLabel
 | 
|---|
| 766 |         ;"       LWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 767 |         ;"                       actual line of text out for WP fields.  e.g. "WriteLine" or
 | 
|---|
| 768 |         ;"                       "MyCustomFn".  Note do NOT include parameters.  Function named
 | 
|---|
| 769 |         ;"                       as custom function must accept same parameters as WriteLine
 | 
|---|
| 770 |         ;"       WPLWriter -- OPTIONAL -- the name of a custom function to use for writing
 | 
|---|
| 771 |         ;"                       actual line of text out for WP fields.  If not provided, then
 | 
|---|
| 772 |         ;"                       LWriter will be used instead.
 | 
|---|
| 773 |         ;"                       e.g. "WriteWPLine" or "MyWPCustomFn".  Note do NOT include parameters.
 | 
|---|
| 774 |         ;"                       Function named as custom function must accept same parameters as WriteLine
 | 
|---|
| 775 |         ;"       SavFieldInfo -- OPTIONAL -- PASS BY REFERENCE.  An array to hold lookup values about
 | 
|---|
| 776 |         ;"                        fields, so it doesn't have to be done each time (faster)
 | 
|---|
| 777 |         ;"Output: Values are written to the current device
 | 
|---|
| 778 |         ;"Results: None
 | 
|---|
| 779 |         ;"Note: this code began its life as a function written by Greg Woodhouse (thanks Greg!)
 | 
|---|
| 780 | 
 | 
|---|
| 781 |         new FldType,Label
 | 
|---|
| 782 |         new FieldInfo
 | 
|---|
| 783 | 
 | 
|---|
| 784 |         if $get(IENS)="" set IENS=IEN_","
 | 
|---|
| 785 |         if +$get(Field)=0 goto W1FDone
 | 
|---|
| 786 |         set FWriter=$get(FWriter,"WriteFLabel")
 | 
|---|
| 787 |         set RWriter=$get(RWriter,"WriteRLabel")
 | 
|---|
| 788 |         set LWriter=$get(LWriter,"WriteLine")
 | 
|---|
| 789 |         set WPLWriter=$get(WPLWriter,LWriter)
 | 
|---|
| 790 |         set Flags=$get(Flags)
 | 
|---|
| 791 | 
 | 
|---|
| 792 |         if 1=1 do
 | 
|---|
| 793 |         . if $data(SavFieldInfo(FileNum,Field))>0 do
 | 
|---|
| 794 |         . . merge FieldInfo=SavFieldInfo(FileNum,Field)
 | 
|---|
| 795 |         . else  do
 | 
|---|
| 796 |         . . do GetFieldInfo^TMGDBAPI(FileNum,Field,"FieldInfo","LABEL")
 | 
|---|
| 797 |         . . merge SavFieldInfo(FileNum,Field)=FieldInfo
 | 
|---|
| 798 |         else  if 1=0 do
 | 
|---|
| 799 |         . ;"try to get info directly to speed things up.... FINISH LATER
 | 
|---|
| 800 |         . new node set node=$get(^DD(FileNum,Field,0))
 | 
|---|
| 801 |         . set FieldInfo("SPECIFIER")=$piece(node,"^",2)
 | 
|---|
| 802 |         . set FieldInfo("LABEL")=$piece(node,"^",1)
 | 
|---|
| 803 |         . set FieldInfo("MULTIPLE-VALUED")=(+FieldInfo("SPECIFIER")>0)
 | 
|---|
| 804 |         . if FieldInfo("SPECIFIER")["W" set FieldInfo("TYPE")="WORD-PROCESSING"
 | 
|---|
| 805 |         . else  if FieldInfo("SPECIFIER")["D" set FieldInfo("TYPE")="DATE"
 | 
|---|
| 806 |         . else  if FieldInfo("SPECIFIER")["F" set FieldInfo("TYPE")="FREE TEXT"
 | 
|---|
| 807 |         . else  if FieldInfo("SPECIFIER")["P" set FieldInfo("TYPE")="POINTER"
 | 
|---|
| 808 |         . else  if FieldInfo("SPECIFIER")["N" set FieldInfo("TYPE")="NUMERIC"
 | 
|---|
| 809 |         . else  if FieldInfo("SPECIFIER")["S" set FieldInfo("TYPE")="SET"
 | 
|---|
| 810 |         . else  set FieldInfo("TYPE")=FieldInfo("SPECIFIER")
 | 
|---|
| 811 | 
 | 
|---|
| 812 |         set FldType=FieldInfo("SPECIFIER")
 | 
|---|
| 813 |         if $data(Fields("TAG NAME",Field))#10>1 set Label=Fields("TAG NAME",Field)
 | 
|---|
| 814 |         else  set Label=FieldInfo("LABEL")
 | 
|---|
| 815 | 
 | 
|---|
| 816 |         if $get(FieldInfo("MULTIPLE-VALUED"))=1 do
 | 
|---|
| 817 |         . if $get(FieldInfo("TYPE"))="WORD-PROCESSING" do
 | 
|---|
| 818 |         . . new TMGWP,TMGMsg,result
 | 
|---|
| 819 |         . . set result=$$ReadWP^TMGDBAPI(FileNum,IENS,Field,.TMGWP)
 | 
|---|
| 820 |         . . if result=1 do
 | 
|---|
| 821 |         . . . new i set i=$order(TMGWP(""))
 | 
|---|
| 822 |         . . . if i="" quit
 | 
|---|
| 823 |         . . . if Flags["i" write $get(IndentS)
 | 
|---|
| 824 |         . . . new exFn set exFn="do "_FWriter_"(Label,"""_$$QtProtect^TMGSTUTL(Field)_""","""_FieldInfo("TYPE")_""",0)"
 | 
|---|
| 825 |         . . . xecute exFn
 | 
|---|
| 826 |         . . . write !  ;"so first <LINE> will be on a separate line
 | 
|---|
| 827 |         . . . for  do  quit:(i="")
 | 
|---|
| 828 |         . . . . new line set line=$get(TMGWP(i))
 | 
|---|
| 829 |         . . . . set line=$$CmdChStrip^TMGSTUTL(line)  ;"shouldn't be needed!!! ??GT.M bug??
 | 
|---|
| 830 |         . . . . if Flags["i" write $get(IndentS)_IncIndent
 | 
|---|
| 831 |         . . . . set exFn="do "_WPLWriter_"("""_$$QtProtect^TMGSTUTL(line)_""")"
 | 
|---|
| 832 |         . . . . ;"WRITE exFn,!
 | 
|---|
| 833 |         . . . . xecute exFn
 | 
|---|
| 834 |         . . . . set i=$order(TMGWP(i))
 | 
|---|
| 835 |         . . . if Flags["i" write $get(IndentS)
 | 
|---|
| 836 |         . . . set exFn="do "_FWriter_"(Label,"""_$$QtProtect^TMGSTUTL(Field)_""","""_FieldInfo("TYPE")_""",1)"
 | 
|---|
| 837 |         . . . xecute exFn
 | 
|---|
| 838 |         . else  do   ;"Other multiple (subfile)
 | 
|---|
| 839 |         . . set SubFile=+FldType
 | 
|---|
| 840 |         . . new AllSubRecs,tempField
 | 
|---|
| 841 |         . . new ORoot,Node
 | 
|---|
| 842 |         . . if $get(SRef)'="" set ORoot=SRef
 | 
|---|
| 843 |         . . else  set ORoot=$get(^DIC(FileNum,0,"GL"))
 | 
|---|
| 844 |         . . if ORoot="" quit
 | 
|---|
| 845 |         . . if AllFields set tempField="*"
 | 
|---|
| 846 |         . . else  set tempField=LastFileName
 | 
|---|
| 847 |         . . set AllSubRecs=($data(Fields(tempField,"*"))>0)!($order(Fields(tempField,""))="")
 | 
|---|
| 848 |         . . set Node=$piece($get(FieldInfo("StoreLoc")),";",1)
 | 
|---|
| 849 |         . . if Node="" quit   ;"skip computed fields
 | 
|---|
| 850 |         . . if (+Node'=Node) set Node=""""_Node_""""  ;" enclose text indices with quotes
 | 
|---|
| 851 |         . . set SRoot=ORoot_IEN_","_Node_","  ;"open root
 | 
|---|
| 852 |         . . set CRoot=ORoot_IEN_","_Node_")" ;"closed root
 | 
|---|
| 853 |         . . set SubRec=$order(@CRoot@(0))
 | 
|---|
| 854 |         . . if (SubRec'="")!(Flags["b") do
 | 
|---|
| 855 |         . . . if Flags["i" write $get(IndentS)
 | 
|---|
| 856 |         . . . new exFn set exFn="do "_FWriter_"("""_$$QtProtect^TMGSTUTL(Label)_""","""_$$QtProtect^TMGSTUTL(Field)_""","""_FieldInfo("TYPE")_""",0)"
 | 
|---|
| 857 |         . . . xecute exFn
 | 
|---|
| 858 |         . . . write !
 | 
|---|
| 859 |         . . . new IndS2 set IndS2=$get(IndentS)_IncIndent
 | 
|---|
| 860 |         . . . if +SubRec>0 for  do  quit:+SubRec'>0
 | 
|---|
| 861 |         . . . . ;"descend into subfile (if allowed subrecord #)
 | 
|---|
| 862 |         . . . . if (AllSubRecs)!($data(Fields(tempField,SubRec))>0) do
 | 
|---|
| 863 |         . . . . . if $data(Fields(tempField,"Rec Exclude",SubRec))>0 quit
 | 
|---|
| 864 |         . . . . . new SubIENS,SubFields,tempSR
 | 
|---|
| 865 |         . . . . . if AllSubRecs set tempSR="*"
 | 
|---|
| 866 |         . . . . . else  set tempSR=SubRec
 | 
|---|
| 867 |         . . . . . set SubIENS=SubRec_","_IENS
 | 
|---|
| 868 |         . . . . . merge SubFields=Fields(tempField,tempSR)
 | 
|---|
| 869 |         . . . . . if (AllFields)!($data(SubFields)=0) set SubFields("*")=""
 | 
|---|
| 870 |         . . . . . if Flags["i" write $get(IndS2)
 | 
|---|
| 871 |         . . . . . new exFn set exFn="do "_RWriter_"("_$$QtProtect^TMGSTUTL(SubRec)_",0)"
 | 
|---|
| 872 |         . . . . . xecute exFn
 | 
|---|
| 873 |         . . . . . do Write1Rec(SubFile,SubRec,.SubFields,Flags,SRoot,SubIENS,IndS2_IncIndent,.RWriter,.FWriter,.LWriter,.WPLWriter,.SavFieldInfo)
 | 
|---|
| 874 |         . . . . . if Flags["i" write $get(IndS2)
 | 
|---|
| 875 |         . . . . . new exFn set exFn="do "_RWriter_"("_$$QtProtect^TMGSTUTL(SubRec)_",1)"
 | 
|---|
| 876 |         . . . . . xecute exFn
 | 
|---|
| 877 |         . . . . set SubRec=$order(@CRoot@(SubRec))
 | 
|---|
| 878 |         . . . if Flags["i" write $get(IndentS)
 | 
|---|
| 879 |         . . . set exFn="do "_FWriter_"("""_$$QtProtect^TMGSTUTL(Label)_""","""_$$QtProtect^TMGSTUTL(Field)_""","""_FieldInfo("TYPE")_""",1)"
 | 
|---|
| 880 |         . . . xecute exFn
 | 
|---|
| 881 |         else  do  ;"the usual case here...
 | 
|---|
| 882 |         . new line set line=""
 | 
|---|
| 883 |         . new CustXForm set CustXForm=$get(Fields("TRANSFORM",Field))
 | 
|---|
| 884 |         . if CustXForm'="" do
 | 
|---|
| 885 |         . . new Pos,GRef,Node
 | 
|---|
| 886 |         . . new FILE,FIELD,X,Y
 | 
|---|
| 887 |         . . new IntValue set IntValue=""
 | 
|---|
| 888 |         . . if $get(SRef)'="" set ORoot=SRef
 | 
|---|
| 889 |         . . else  set ORoot=$get(^DIC(FileNum,0,"GL"))
 | 
|---|
| 890 |         . . if ORoot="" quit
 | 
|---|
| 891 |         . . set Node=$piece($get(FieldInfo("StoreLoc")),";",1)
 | 
|---|
| 892 |         . . if Node="" quit   ;"skip computed fields
 | 
|---|
| 893 |         . . if (+Node'=Node) set Node=""""_Node_""""  ;" enclose text indices with quotes
 | 
|---|
| 894 |         . . set Pos=$piece($get(FieldInfo("StoreLoc")),";",2)
 | 
|---|
| 895 |         . . set GRef=ORoot_IEN_","_Node_")"
 | 
|---|
| 896 |         . . if +Pos>0 set IntValue=$piece($get(@GRef),"^",Pos)
 | 
|---|
| 897 |         . . ;"Set up variables for use by transform code
 | 
|---|
| 898 |         . . set FILE=FileNum
 | 
|---|
| 899 |         . . set FIELD=+Field
 | 
|---|
| 900 |         . . set X=IntValue
 | 
|---|
| 901 |         . . set Y=""
 | 
|---|
| 902 |         . . new $etrap set $etrap="set Y=""(Invalid custom transform M code!.  Error Trapped.)"" set $etrap="""",$ecode="""""
 | 
|---|
| 903 |         . . xecute CustXForm
 | 
|---|
| 904 |         . . set line=Y
 | 
|---|
| 905 |         . else  do
 | 
|---|
| 906 |         . . new GetFlag set GetFlag=""
 | 
|---|
| 907 |         . . if Flags["I" set GetFlag="I"
 | 
|---|
| 908 |         . . set line=$$GET1^DIQ(FileNum,IENS,Field,GetFlag)
 | 
|---|
| 909 |         . if (line="")&(Flags'["b") quit
 | 
|---|
| 910 |         . if Flags["i" write $get(IndentS)
 | 
|---|
| 911 |         . new exFn set exFn="do "_FWriter_"("""_$$QtProtect^TMGSTUTL(Label)_""","""_$$QtProtect^TMGSTUTL(Field)_""","""_FieldInfo("TYPE")_""",0)"
 | 
|---|
| 912 |         . xecute exFn
 | 
|---|
| 913 |         . set exFn="do "_LWriter_"(.line)"
 | 
|---|
| 914 |         . xecute exFn   ;"write line
 | 
|---|
| 915 |         . if Flags["i" write $get(IndentS)
 | 
|---|
| 916 |         . set exFn="do "_FWriter_"("""_$$QtProtect^TMGSTUTL(Label)_""","""_$$QtProtect^TMGSTUTL(Field)_""","""_FieldInfo("TYPE")_""",1)"
 | 
|---|
| 917 |         . xecute exFn
 | 
|---|
| 918 | 
 | 
|---|
| 919 | W1FDone
 | 
|---|
| 920 |         quit
 | 
|---|
| 921 | 
 | 
|---|
| 922 | 
 | 
|---|
| 923 | 
 | 
|---|
| 924 | WriteRLabel(IEN,Ender)
 | 
|---|
| 925 |         ;"Purpose: To actually write out labels for record starting and ending.
 | 
|---|
| 926 |         ;"      IEN -- the IEN (record number) of the record
 | 
|---|
| 927 |         ;"              Optional extra informat:
 | 
|---|
| 928 |         ;"              IEN(tag)=value
 | 
|---|
| 929 |         ;"              IEN(tag2)=value2
 | 
|---|
| 930 |         ;"              If provided, will be added to output as follows:
 | 
|---|
| 931 |         ;"              <Record id="IEN" tag="value" tag2="value2">
 | 
|---|
| 932 |         ;"      Ender -- OPTIONAL if 1, then ends field.
 | 
|---|
| 933 |         ;"Results: none.
 | 
|---|
| 934 |         ;"Note: This is a separate function so that a different callback function can replace it
 | 
|---|
| 935 | 
 | 
|---|
| 936 |         if +$get(Ender)>0 write "</Record>",!
 | 
|---|
| 937 |         else  do
 | 
|---|
| 938 |         . write "<Record id=""",IEN,""" "
 | 
|---|
| 939 |         . new tag set tag=""
 | 
|---|
| 940 |         . for  set tag=$order(IEN(tag)) quit:(tag="")  do
 | 
|---|
| 941 |         . . write tag,"=""",$get(IEN(tag)),""" "
 | 
|---|
| 942 |         . write ">",!
 | 
|---|
| 943 | 
 | 
|---|
| 944 |         quit
 | 
|---|
| 945 | 
 | 
|---|
| 946 | WriteFLabel(Label,Field,Type,Ender)
 | 
|---|
| 947 |         ;"Purpose: This is the code that actually does writing of labels etc for output
 | 
|---|
| 948 |         ;"Input: Label -- OPTIONAL -- Name of label, to write after  'label='
 | 
|---|
| 949 |         ;"       Field -- OPTIONAL -- Name of field, to write after  'id='
 | 
|---|
| 950 |         ;"       Type -- OPTIONAL -- Typeof field, to write after  'type='
 | 
|---|
| 951 |         ;"      Ender -- OPTIONAL if 1, then ends field.
 | 
|---|
| 952 |         ;"Results: none.
 | 
|---|
| 953 |         ;"Note: This is a separate function so that a different callback function can replace it
 | 
|---|
| 954 | 
 | 
|---|
| 955 |         ;"To write out <Field label="NAME" id=".01" type="FREE TEXT"> or </Field>
 | 
|---|
| 956 | 
 | 
|---|
| 957 |         if +$get(Ender)>0 do
 | 
|---|
| 958 |         . write "</Field>",!
 | 
|---|
| 959 |         else  do
 | 
|---|
| 960 |          . write "<Field "
 | 
|---|
| 961 |          . if $get(Field)'="" write "id=""",$$SYMENC^MXMLUTL(Field),""" "
 | 
|---|
| 962 |          . if $get(Label)'="" write "label=""",$$SYMENC^MXMLUTL(Label),""" "
 | 
|---|
| 963 |          . if $get(Type)'="" write "type=""",$$SYMENC^MXMLUTL(Type),""" "
 | 
|---|
| 964 |          . write ">"
 | 
|---|
| 965 | 
 | 
|---|
| 966 |          quit
 | 
|---|
| 967 | 
 | 
|---|
| 968 | WriteLine(Line)
 | 
|---|
| 969 |         ;"Purpose: This is the code that actually does writing of labels etc for output
 | 
|---|
| 970 |         ;"Input: Line -- the line of text to write out.
 | 
|---|
| 971 |         ;"Results: none
 | 
|---|
| 972 |         ;"Note: This is a separate function so that a different callback function can replace it
 | 
|---|
| 973 | 
 | 
|---|
| 974 |         set Line=$$SYMENC^MXMLUTL(Line)
 | 
|---|
| 975 |         write "<LINE>",Line,"</LINE>",!
 | 
|---|
| 976 |         quit
 | 
|---|
| 977 | 
 | 
|---|
| 978 | 
 | 
|---|
| 979 | ConvertLabel(Label)
 | 
|---|
| 980 |         ;"Note: This function is no longer being used...
 | 
|---|
| 981 | 
 | 
|---|
| 982 |         ;"To convert the XML tag into an acceptible format for XML
 | 
|---|
| 983 |         ;"
 | 
|---|
| 984 |         new i
 | 
|---|
| 985 |         new result set result=""
 | 
|---|
| 986 | 
 | 
|---|
| 987 |         for i=1:1:$length(Label) do
 | 
|---|
| 988 |         . new ch set ch=$ascii($extract(Label,i))
 | 
|---|
| 989 |         . if ((ch>64)&(ch<91))!((ch>96)&(ch<123)) do  quit
 | 
|---|
| 990 |         . . set result=result_$char(ch)
 | 
|---|
| 991 |         . if (ch=32) set result=result_"_"
 | 
|---|
| 992 |         . else  do
 | 
|---|
| 993 |         . . set result=result_"x"
 | 
|---|
| 994 | 
 | 
|---|
| 995 |         quit result
 | 
|---|
| 996 | 
 | 
|---|