<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=SCI.XLS.RECALL</id>
	<title>SCI.XLS.RECALL - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=SCI.XLS.RECALL"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=SCI.XLS.RECALL&amp;action=history"/>
	<updated>2026-04-28T22:12:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=SCI.XLS.RECALL&amp;diff=2597&amp;oldid=prev</id>
		<title>IanMcGowan: Create page with code showing how to create an XML file that can be opened in Excel</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=SCI.XLS.RECALL&amp;diff=2597&amp;oldid=prev"/>
		<updated>2017-03-03T06:25:22Z</updated>

		<summary type="html">&lt;p&gt;Create page with code showing how to create an XML file that can be opened in Excel&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Since Office 2003, Excel has supported so-called XML Spreadsheets, using a schema known as [https://msdn.microsoft.com/en-us/library/bb226687.aspx SpreadsheetML] - this is a simple approach that has the advantage of creating a single file, in a manageable format.  There are a couple of downsides: 1) If you name the file .xml it opens in IE, but if you name it .xls it opens in Excel with a warning that may be alarming.  2) If you are exporting thousands of rows with dozens of columns, the resulting files can get quite large.  Still, for modest needs this is an easy approach.&lt;br /&gt;
&lt;br /&gt;
This program takes the path to a &amp;quot;^&amp;quot; delimited file as a parameter, and then dumps the file to an XML spreadsheet suitable for loading into Excel.&lt;br /&gt;
&lt;br /&gt;
If the wiki format messes things up, the latest version can be downloaded from github at https://github.com/ianmcgowan/SCI.BP/blob/master/SCI.XLS.RECALL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* Program: SCI.XLS.RECALL&lt;br /&gt;
* Author : MCGOWJ01&lt;br /&gt;
* Date   : 2017-02-10&lt;br /&gt;
* Edited : &lt;br /&gt;
* Comment: Convert a recall into an excel sheet&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* LOG DATE   BY           CHANGE&lt;br /&gt;
* ---------- ------------ -------------------------------------------------&lt;br /&gt;
* SEE: https://msdn.microsoft.com/en-us/library/aa140066(office.10).aspx&lt;br /&gt;
*      https://blogs.msdn.microsoft.com/brian_jones/2005/06/27/introduction-to-excel-xml-part-1-creating-a-simple-table/&lt;br /&gt;
*&lt;br /&gt;
DEBUG=0&lt;br /&gt;
S=@SENTENCE&lt;br /&gt;
FILE.NAME=FIELD(S,&amp;#039; &amp;#039;,2)&lt;br /&gt;
OPENSEQ FILE.NAME TO INPUT.F ELSE STOP 201,FILE.NAME&lt;br /&gt;
OUTPUT.FILE.NAME=FILE.NAME:&amp;#039;.xls&amp;#039;&lt;br /&gt;
EXECUTE &amp;#039;!rm -f &amp;#039;:OUTPUT.FILE.NAME&lt;br /&gt;
EXECUTE &amp;#039;!touch &amp;#039;:OUTPUT.FILE.NAME&lt;br /&gt;
OPENSEQ OUTPUT.FILE.NAME TO OUTPUT.F ELSE STOP &amp;#039;CANNOT OPEN &amp;#039;:OUTPUT.FILE.NAME&lt;br /&gt;
OPEN &amp;#039;RECALLS&amp;#039; TO RECALLS ELSE STOP 201,&amp;#039;RECALLS&amp;#039;&lt;br /&gt;
GOSUB GET.FIELD.NAMES&lt;br /&gt;
IF DEBUG THEN&lt;br /&gt;
  PRINT &amp;#039;FIELD.MAP&amp;#039;&lt;br /&gt;
  FOR F=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    PRINT F&amp;#039;R#2&amp;#039;:&amp;#039; &amp;#039;:FIELD.MAP&amp;lt;6,F&amp;gt;&amp;#039;L#20&amp;#039;:&amp;#039; &amp;#039;:FIELD.MAP&amp;lt;2,F&amp;gt;&amp;#039;L#35&amp;#039;:&amp;#039; &amp;#039;:FIELD.MAP&amp;lt;3,F&amp;gt;&lt;br /&gt;
  NEXT F&lt;br /&gt;
END&lt;br /&gt;
CONTROL.CHARS=&amp;#039;&amp;#039;&lt;br /&gt;
FOR CHARACTER = 127 TO 249 &lt;br /&gt;
  CONTROL.CHARS:=CHAR(CHARACTER) &lt;br /&gt;
NEXT CHARACTER &lt;br /&gt;
*&lt;br /&gt;
GOSUB XLS.HEADER&lt;br /&gt;
ROW.COUNT=0&lt;br /&gt;
LOOP&lt;br /&gt;
  READSEQ ROW FROM INPUT.F ELSE EXIT&lt;br /&gt;
  ROW.COUNT+=1&lt;br /&gt;
  GOSUB XLS.BODY&lt;br /&gt;
REPEAT&lt;br /&gt;
GOSUB XLS.TOTALS&lt;br /&gt;
GOSUB XLS.FOOTER&lt;br /&gt;
RECIP=&amp;#039;&amp;#039; ; FROM.USER=&amp;#039;&amp;#039; ; CC.USER=&amp;#039;&amp;#039; ;* Let the SUBR figure it out&lt;br /&gt;
MSG=&amp;#039;Please find your report attached&amp;#039;&lt;br /&gt;
SUBJECT=&amp;#039;REPORT:&amp;#039;:FIELD(OUTPUT.FILE.NAME,&amp;#039;/&amp;#039;,DCOUNT(OUTPUT.FILE.NAME,&amp;#039;/&amp;#039;))&lt;br /&gt;
ATTACH=OUTPUT.FILE.NAME&lt;br /&gt;
OPTIONS=&amp;#039;&amp;#039;&lt;br /&gt;
CALL SCI.MAIL.SUB(RECIP, FROM.USER, CC.USER, MSG, ATTACH, SUBJECT, OPTIONS)&lt;br /&gt;
STOP&lt;br /&gt;
*&lt;br /&gt;
XLS.BODY:&lt;br /&gt;
  L=&amp;#039;&amp;lt;Row&amp;gt;&amp;#039; ; GOSUB WRITE.LINE&lt;br /&gt;
  CONVERT &amp;#039;^&amp;#039; TO @VM IN ROW&lt;br /&gt;
  FOR C=1 TO DCOUNT(ROW&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    L=&amp;#039;  &amp;lt;Cell&amp;gt;&amp;#039;&lt;br /&gt;
    CELL=ROW&amp;lt;1,C&amp;gt;&lt;br /&gt;
    GOSUB URL.ENCODE.CELL&lt;br /&gt;
    FORMAT=FIELD.MAP&amp;lt;3,C&amp;gt;&lt;br /&gt;
    CONVERT &amp;#039;,&amp;#039; TO &amp;#039;&amp;#039; IN FORMAT  ;* MR2, excel has a hard time with commas in numbers&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE FORMAT[1,1]=&amp;#039;D&amp;#039; AND ICONV(CELL,&amp;#039;D&amp;#039;) # &amp;#039;&amp;#039; ;* Date&lt;br /&gt;
        D=ICONV(CELL,&amp;#039;D&amp;#039;)&lt;br /&gt;
        CELL=OCONV(D,&amp;#039;D4Y&amp;#039;):&amp;#039;-&amp;#039;:OCONV(D,&amp;#039;DM&amp;#039;):&amp;#039;-&amp;#039;:OCONV(D,&amp;#039;DD&amp;#039;)&lt;br /&gt;
        *CELL:=&amp;#039;T00:00:00.000&amp;#039;&lt;br /&gt;
        L:=&amp;#039;&amp;lt;Data ss:Type=&amp;quot;DateTime&amp;quot;&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/Data&amp;gt;&amp;#039;&lt;br /&gt;
      CASE FORMAT[1,2]=&amp;#039;MD&amp;#039; OR FORMAT[1,2]=&amp;#039;MR&amp;#039; OR (NUM(CELL) AND CELL#&amp;#039;&amp;#039;) ;* Number&lt;br /&gt;
        CONVERT &amp;#039;,&amp;#039; TO &amp;#039;&amp;#039; IN CELL&lt;br /&gt;
        IF NUM(CELL) THEN&lt;br /&gt;
          L:=&amp;#039;&amp;lt;Data ss:Type=&amp;quot;Number&amp;quot;&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/Data&amp;gt;&amp;#039;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          L:=&amp;#039;&amp;lt;Data ss:Type=&amp;quot;String&amp;quot;&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/Data&amp;gt;&amp;#039;&lt;br /&gt;
        END&lt;br /&gt;
      CASE 1 ;* String is default type&lt;br /&gt;
        L:=&amp;#039;&amp;lt;Data ss:Type=&amp;quot;String&amp;quot;&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/Data&amp;gt;&amp;#039;&lt;br /&gt;
    END CASE&lt;br /&gt;
    L:=&amp;#039;&amp;lt;/Cell&amp;gt;&amp;#039;&lt;br /&gt;
    GOSUB WRITE.LINE&lt;br /&gt;
  NEXT C&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
XLS.TOTALS:&lt;br /&gt;
  L=&amp;#039;&amp;lt;Row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  FOR C=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    FORMAT=FIELD.MAP&amp;lt;3,C&amp;gt;&lt;br /&gt;
    IF FORMAT[1,2]=&amp;#039;MD&amp;#039; OR FORMAT[1,2]=&amp;#039;MR&amp;#039; THEN&lt;br /&gt;
      * Number col, add total to bottom row&lt;br /&gt;
      L=&amp;#039;  &amp;lt;Cell ss:Index=&amp;quot;&amp;#039;:C:&amp;#039;&amp;quot; ss:Formula=&amp;quot;=SUM(R[-&amp;#039;:ROW.COUNT:&amp;#039;]C:R[-1]C)&amp;quot;&amp;gt;&amp;lt;Data ss:Type=&amp;quot;Number&amp;quot;&amp;gt;0&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE&lt;br /&gt;
    END&lt;br /&gt;
  NEXT C&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
URL.ENCODE.CELL:&lt;br /&gt;
  * Certain characters not allowed in XML - escape them&lt;br /&gt;
  CONVERT CONTROL.CHARS TO &amp;#039;&amp;#039; IN CELL ;* Zap unicode/other code pages&lt;br /&gt;
  SWAP &amp;#039;&amp;amp;&amp;#039; WITH &amp;#039;&amp;amp;amp;&amp;#039; IN CELL&lt;br /&gt;
  SWAP &amp;#039;&amp;lt;&amp;#039; WITH &amp;#039;&amp;amp;lt;&amp;#039;  IN CELL&lt;br /&gt;
  SWAP &amp;#039;&amp;gt;&amp;#039; WITH &amp;#039;&amp;amp;gt;&amp;#039;  IN CELL&lt;br /&gt;
  CELL=TRIM(CELL);* No benefit to leading or trailing spaces&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
XLS.HEADER:&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?mso-application progid=&amp;quot;Excel.Sheet&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;Workbook xmlns=&amp;quot;urn:schemas-microsoft-com:office:spreadsheet&amp;quot;&amp;#039;&lt;br /&gt;
  L:=&amp;#039; xmlns:o=&amp;quot;urn:schemas-microsoft-com:office:office&amp;quot;&amp;#039;&lt;br /&gt;
  L:=&amp;#039; xmlns:x=&amp;quot;urn:schemas-microsoft-com:office:excel&amp;quot;&amp;#039;&lt;br /&gt;
  L:=&amp;#039; xmlns:ss=&amp;quot;urn:schemas-microsoft-com:office:spreadsheet&amp;quot;&amp;#039;&lt;br /&gt;
  L:=&amp;#039; xmlns:html=&amp;quot;http://www.w3.org/TR/REC-html40&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039; &amp;lt;Styles&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Style ss:ID=&amp;quot;Default&amp;quot; ss:Name=&amp;quot;Normal&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;Alignment ss:Vertical=&amp;quot;Bottom&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;Font ss:FontName=&amp;quot;Calibri&amp;quot; x:Family=&amp;quot;Swiss&amp;quot; ss:Size=&amp;quot;11&amp;quot; ss:Color=&amp;quot;#000000&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;/Style&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Style ss:ID=&amp;quot;s100&amp;quot; ss:Name=&amp;quot;Header&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;Font ss:FontName=&amp;quot;Calibri&amp;quot; x:Family=&amp;quot;Swiss&amp;quot; ss:Size=&amp;quot;11&amp;quot; ss:Color=&amp;quot;#005100&amp;quot; ss:Bold=&amp;quot;1&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;Interior ss:Color=&amp;quot;#C6EFCE&amp;quot; ss:Pattern=&amp;quot;Solid&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;/Style&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Style ss:ID=&amp;quot;s101&amp;quot; ss:Name=&amp;quot;Number&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;NumberFormat ss:Format=&amp;quot;0.00&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;/Style&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Style ss:ID=&amp;quot;s102&amp;quot; ss:Name=&amp;quot;Date&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;NumberFormat ss:Format=&amp;quot;Short Date&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;/Style&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Style ss:ID=&amp;quot;s103&amp;quot; ss:Name=&amp;quot;Integer&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;NumberFormat ss:Format=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  L:=&amp;#039;&amp;lt;/Style&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039; &amp;lt;/Styles&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Worksheet ss:Name=&amp;quot;Sheet1&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;Table&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  * Column definitions&lt;br /&gt;
  FOR C=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    FORMAT=FIELD.MAP&amp;lt;3,C&amp;gt;&lt;br /&gt;
    MASK=FIELD.MAP&amp;lt;5,C&amp;gt;&lt;br /&gt;
    MASK=MASK[1,LEN(MASK)-1]&lt;br /&gt;
    IF NOT(NUM(MASK)) THEN MASK=10&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE FORMAT[1,1]=&amp;#039;D&amp;#039;  ;* Date&lt;br /&gt;
        STYLE=&amp;#039;s102&amp;#039;&lt;br /&gt;
      CASE FORMAT[1,2]=&amp;#039;MD&amp;#039; OR FORMAT[1,2]=&amp;#039;MR&amp;#039; ;* Number&lt;br /&gt;
        IF FORMAT[3,1]=&amp;#039;0&amp;#039; THEN&lt;br /&gt;
          STYLE=&amp;#039;s103&amp;#039;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          STYLE=&amp;#039;s101&amp;#039;&lt;br /&gt;
        END&lt;br /&gt;
      CASE 1 ;* String is default type&lt;br /&gt;
        STYLE=&amp;#039;Default&amp;#039;&lt;br /&gt;
    END CASE&lt;br /&gt;
    L=&amp;#039;      &amp;lt;Column ss:Index=&amp;quot;&amp;#039;:C:&amp;#039;&amp;quot; ss:StyleID=&amp;quot;&amp;#039;:STYLE:&amp;#039;&amp;quot; ss:Width=&amp;quot;&amp;#039;:MASK*10:&amp;#039;&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
    GOSUB WRITE.LINE&lt;br /&gt;
  NEXT C&lt;br /&gt;
  *&lt;br /&gt;
  * Now write a header row&lt;br /&gt;
  *&lt;br /&gt;
  L=&amp;#039;&amp;lt;Row&amp;gt;&amp;#039; ; GOSUB WRITE.LINE&lt;br /&gt;
  FOR C=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    L=&amp;#039;  &amp;lt;Cell ss:StyleID=&amp;quot;s100&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
    *CELL=TRIM(FIELD.MAP&amp;lt;4,C&amp;gt;)&lt;br /&gt;
    *IF CELL=&amp;#039;&amp;#039; THEN CELL=FIELD.MAP&amp;lt;6,C&amp;gt;&lt;br /&gt;
    CELL=FIELD.MAP&amp;lt;6,C&amp;gt;&lt;br /&gt;
    GOSUB URL.ENCODE.CELL&lt;br /&gt;
    L:=&amp;#039;&amp;lt;Data ss:Type=&amp;quot;String&amp;quot;&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;#039;&lt;br /&gt;
    GOSUB WRITE.LINE&lt;br /&gt;
  NEXT C&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
XLS.FOOTER:&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/Table&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;/Worksheet&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Workbook&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
WRITE.LINE:&lt;br /&gt;
  *IF DEBUG THEN PRINT L&lt;br /&gt;
  WRITESEQ L:CHAR(13) APPEND ON OUTPUT.F ELSE STOP &amp;#039;ERROR WRITING &amp;#039;:FILE.NAME&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GET.FIELD.NAMES:&lt;br /&gt;
  FIELD.MAP=&amp;#039;&amp;#039;&lt;br /&gt;
  RECALL.NAME=FIELD(FILE.NAME,&amp;#039;/&amp;#039;,DCOUNT(FILE.NAME,&amp;#039;/&amp;#039;))&lt;br /&gt;
  READV R FROM RECALLS, RECALL.NAME, 1 ELSE STOP &amp;#039;CANNOT READ RECALLS:&amp;#039;:RECALL.NAME&lt;br /&gt;
  DATA.FILE=&amp;#039;&amp;#039;&lt;br /&gt;
  FOR F=1 TO DCOUNT(R,@VM)&lt;br /&gt;
    L=R&amp;lt;1,F&amp;gt;&lt;br /&gt;
    IF FIELD(L,&amp;#039; &amp;#039;,1) = &amp;#039;list&amp;#039; OR FIELD(L,&amp;#039; &amp;#039;,1) = &amp;#039;sort&amp;#039; THEN&lt;br /&gt;
      IF DATA.FILE # &amp;#039;&amp;#039; THEN STOP &amp;#039;CAN ONLY PROCESS ONE list OR sort PER RECALL&amp;#039;&lt;br /&gt;
      DATA.FILE=FIELD(L,&amp;#039; &amp;#039;,2)&lt;br /&gt;
      OPEN &amp;#039;DICT&amp;#039;,DATA.FILE TO DICT ELSE STOP &amp;#039;CANNOT OPEN DICT &amp;#039;:DATA.FILE&lt;br /&gt;
    END&lt;br /&gt;
    IF DATA.FILE # &amp;#039;&amp;#039; THEN&lt;br /&gt;
      FOR WC=1 TO DCOUNT(L,&amp;#039; &amp;#039;)&lt;br /&gt;
        * list LS.MASTER FIELD1 FIELD2 ETC..  Skip the first two&lt;br /&gt;
        ATB=FIELD(L,&amp;#039; &amp;#039;,WC)&lt;br /&gt;
        IF ATB=&amp;#039;list&amp;#039; OR ATB=&amp;#039;sort&amp;#039; THEN CONTINUE&lt;br /&gt;
        IF ATB=DATA.FILE THEN CONTINUE&lt;br /&gt;
        IF ATB=&amp;#039;TO&amp;#039; THEN&lt;br /&gt;
           * Stop when we get to the TO DELIM etc...&lt;br /&gt;
           RETURN&lt;br /&gt;
        END&lt;br /&gt;
        READ DICT.REC FROM DICT, ATB THEN&lt;br /&gt;
          TYPE=DICT.REC&amp;lt;1&amp;gt;&lt;br /&gt;
          CORR=DICT.REC&amp;lt;2&amp;gt;&lt;br /&gt;
          CONV=DICT.REC&amp;lt;3&amp;gt;&lt;br /&gt;
          HEAD=DICT.REC&amp;lt;4&amp;gt;&lt;br /&gt;
          MASK=DICT.REC&amp;lt;5&amp;gt;&lt;br /&gt;
          N=DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)+1 ;* Always nervous of NULL with &amp;lt;1,-1&amp;gt;&lt;br /&gt;
          FIELD.MAP&amp;lt;1,N&amp;gt;=TYPE&lt;br /&gt;
          FIELD.MAP&amp;lt;2,N&amp;gt;=CORR&lt;br /&gt;
          FIELD.MAP&amp;lt;3,N&amp;gt;=CONV&lt;br /&gt;
          FIELD.MAP&amp;lt;4,N&amp;gt;=HEAD&lt;br /&gt;
          FIELD.MAP&amp;lt;5,N&amp;gt;=MASK&lt;br /&gt;
          FIELD.MAP&amp;lt;6,N&amp;gt;=ATB&lt;br /&gt;
        END ELSE&lt;br /&gt;
          IF ATB # &amp;#039;BY&amp;#039; AND ATB # &amp;#039;WITH&amp;#039; THEN&lt;br /&gt;
            PRINT &amp;#039;ATB &amp;#039;:ATB:&amp;#039; NOT FOUND IN DICT &amp;#039;:DATA.FILE&lt;br /&gt;
          END&lt;br /&gt;
        END&lt;br /&gt;
      NEXT WC&lt;br /&gt;
    END&lt;br /&gt;
  NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
</feed>