Contributor: HARTKAMP@MAIL.RZ.UNI-DUESSELDORF.DE

{
From: 

Might be someone is interested in the code below for writing
.WKS-files.

This special portion of code works with the TOPAZ-toolbox, but you
could use your own access to your data just the same. (Sorry for the
German Identfiers, hope anyone will grasp the contents, otherwise take
a dictionary!)
}

PROCEDURE LotusExport(DBFFile, OutFName : PathStr);
CONST StartSatz     : ARRAY[1..6] OF BYTE = (0,0,2,0,4,4);
      EndeSatz      : ARRAY[1..5] OF BYTE = (1,0,0,0,26);

TYPE  BereichsType  = RECORD
                         Typ, Laenge,
                         VonSpalte, VonZeile,
                         BisSpalte, BisZeile  : INTEGER;
                      END;

      BreitenType   = RECORD
                         Typ, Laenge, Spalte : INTEGER;
                         Breite              : BYTE;
                      END;

      ZahlenType    = RECORD
                         Typ, Laenge    : INTEGER;
                         Format         : BYTE;
                         Spalte, Zeile  : INTEGER;
                         Wert           : DOUBLE; { ONLY DOUBLE WILL DO!!!!!!!!!}
                      END;

      StringType    = RECORD
                         Typ, Laenge    : INTEGER;
                         Format         : BYTE;
                         Spalte, Zeile  : INTEGER;
                         Position       : CHAR;
                         Inhalt         : ARRAY[1..256] OF CHAR;
                      END;

VAR Bereich      : BereichsType;
    Breite       : BreitenType;
    Zahl         : ZahlenType;
    ZKette       : StringType;
    FBez         : StringType;
    RecordNumber : INTEGER;
    RNum         : REAL;
    INum         : INTEGER;
    L            : BOOLEAN;
    h,i,j        : BYTE;
    Zkt          : STRING;
    FName        : STRING;
    OutFile      : FILE;

BEGIN
  SELECT(0);
  USE(DBFFILE, NIL, 0);
  Bereich.Typ         := 6;
  Bereich.Laenge      := 8;
  Bereich.VonSpalte   := 0;
  Bereich.VonZeile    := 0;

  Breite.Typ          := 8;
  Breite.Laenge       := 3;

  Zahl.Typ            := 14;
  Zahl.Laenge         := 13;

  ZKette.Typ          := 15;
  ZKette.Format       := 255;
  ZKette.Position     := CHR(39);

  FBez.Typ            := 15;
  FBez.Laenge         := 17;
  FBez.Format         := 255;
  FBez.Zeile          := 0;
  FBez.Position       := CHR(39);

  IF RecCount > MaxLongInt THEN EXIT;
  Assign(OutFile,OutFName);
  ReWrite(OutFile,1);
  GoTop;
  RecordNumber := 1;
  BlockWrite(OutFile,StartSatz,6);
  Bereich.BisSpalte := FieldCount;
  Bereich.BisZeile  := RecCount;
  BlockWrite(OutFile,Bereich,12);
  FOR i := 1 TO FieldCount DO
    IF FieldType(i) <> 'M' THEN
    BEGIN
      j := FieldLen(i);
      Breite.Spalte := pred(i);
      IF j < 255 THEN Breite.Breite := succ(j)
                 ELSE Breite.Breite := j;
      BlockWrite(OutFile,Breite,7);
    END;
  FOR i := 1 TO FieldCount DO
    IF FieldType(i) <> 'M' THEN
    BEGIN
      FBez.Spalte := pred(i);
      FName := Field(i)+'               ';
      move(FName[1],FBez.Inhalt[1],10);
      FBez.Inhalt[11] := CHR(0);
      BlockWrite(OutFile,FBez,21);
    END;
  REPEAT
    Go(RecordNumber);
    FOR i := 1 TO FieldCount DO BEGIN
      CASE FieldType(i) OF
        'F','N' : BEGIN
                    Zahl.Format := FieldDec(i);
                    Zahl.Spalte := PRED(i);
                    Zahl.Zeile  := RecordNumber;
                    IF FieldDec(i) > 0
                    THEN BEGIN
                       move(FieldAddress(i)^,RNum,6);
                       Zahl.Wert := RNum;
                    END
                    ELSE BEGIN
                       move(FieldAddress(i)^,INum,4);
                       Zahl.Wert := INum;
                    END;
                    BlockWrite(OutFile,Zahl,17);
                  END;
            'C' : BEGIN
                    move(FieldAddress(i)^,Zkt[0],succ(FieldLen(i)));
                    Zkt := Zkt+#0;
                    ZKette.Laenge := Length(Zkt)+6;
                    ZKette.Spalte := PRED(i);
                    ZKette.Zeile  := RecordNumber;
                    move(Zkt[1],ZKette.Inhalt,Length(Zkt));
                    BlockWrite(OutFile,ZKette,ZKette.Laenge+4);
                  END;
            'D' : BEGIN
                    move(FieldAddress(i)^,Zkt[0],succ(FieldLen(i)));
                    IF Zkt[1] = ' ' THEN Zkt := 'keine Angabe';
                    Zkt := Zkt+#0;
                    ZKette.Laenge := Length(Zkt)+6;
                    ZKette.Spalte := PRED(i);
                    ZKette.Zeile  := RecordNumber;
                    move(Zkt[1],ZKette.Inhalt,Length(Zkt));
                    BlockWrite(OutFile,ZKette,ZKette.Laenge+4);
                  END;
            'L' : BEGIN
                    move(FieldAddress(i)^,L,1);
                    IF L THEN Zkt := 'Ja  ' ELSE Zkt := 'Nein';
                    Zkt := Zkt+#0;
                    ZKette.Laenge := Length(Zkt)+6;
                    ZKette.Spalte := pred(i);
                    ZKette.Zeile  := RecordNumber;
                    move(Zkt[1],ZKette.Inhalt,Length(Zkt));
                    BlockWrite(OutFile,ZKette,ZKette.Laenge+4);
                  END;
            'M' : ;
            ELSE BEGIN END;
      END;
    END;
    At(20, 13, LzS(RecordNumber,0)+' Datens„tze kopiert...');
    Inc(RecordNumber);
  UNTIL RecordNumber > RecCount;
  BlockWrite(OutFile,EndeSatz,5);
  Close(OutFile);
  USE('', NIL, 0);
END;

PROCEDURE WKSExport;
VAR  oldSelect  : BYTE;
     DatVar     : PathStr;
     WKSVar     : PathStr;
     d          : DirStr;
     n          : NameStr;
     e          : ExtStr;

BEGIN
  DatVar := '';
  SelectFile('*.DBF','dBase-Datei w„hlen',true);
  FSplit(DatVar, d, n, e);
  WKSVar := d+n+'.WKS';
  PushWindow(16, 11, 60, 18);
  Box(16, 11, 56, 15, DoubleLine + Shadow, '');
  LotusExport(DatVar, WKSVar);
  PopWindow;
  PopUp('Die Tabellendatei ' + FileBase(DatVar) +
        '.WKS'+#13+'  wurde im aktuellen Verzeichnis  '+#13+
        'angelegt...', 'I n f o');
END;