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