home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MAGAZINE / MISC / ITPAUG90.ZIP / DBASEII.PAS next >
Encoding:
Pascal/Delphi Source File  |  1990-06-20  |  5.0 KB  |  200 lines

  1. PROGRAM MakeDBF;
  2.  
  3. {*************************************************
  4. * Program: Create a DBF database file            *
  5. *************************************************}
  6.  
  7. USES Dos,Crt;
  8.  
  9. FUNCTION DbfCreate(FileNameIn: PathStr): Boolean;
  10.  
  11. TYPE
  12.    DbfHdrMask = RECORD
  13.       VersionNumber : Byte;
  14.       Update        : ARRAY [1..3] OF Byte;
  15.       NbrRec        : Longint;
  16.       HdrLen        : Integer;
  17.       RecLen        : Integer;
  18.       Reserved      : ARRAY [1..20] OF Char;
  19.    END;
  20.  
  21.    DbfFieldMask = RECORD
  22.       FdName    : ARRAY [1..11] OF Char;
  23.       FdType    : Char;
  24.       Reserved1 : ARRAY [1..4] OF Char;
  25.       FdLength  : Byte;
  26.       FdDec     : Byte;
  27.       Reserved2 : ARRAY [1..14] OF Char;
  28.    END;
  29.  
  30.    DbfCreateType = RECORD
  31.       FieldCounter  : Byte;
  32.       FPos          : Integer;
  33.       RecordLength  : Integer;
  34.       Dir           : DirStr;
  35.       Name          : NameStr;
  36.       Ext           : ExtStr;
  37.       LayoutIn      : Text;
  38.       FileNameOut   : PathStr;
  39.       DirInfo       : SearchRec;
  40.       Response      : Char;
  41.       DbfNewOut     : FILE;
  42.       FieldRec      : DbfFieldMask;
  43.       Location      : Word;
  44.       TempString1   : String;
  45.       TempString2   : String;
  46.       Code          : Integer;
  47.       Header        : DbfHdrMask;
  48.       Year,Month,Day,DayOfWeek : Word;
  49.    END;
  50.  
  51. CONST
  52.   EOH    : Byte = $0D;
  53.   EODbf  : Byte = $1A;
  54.  
  55. VAR
  56.   D : ^DbfCreateType;
  57.  
  58. BEGIN
  59.  
  60.   GetMem(D,SizeOf(D^));
  61.   IF D = NIL THEN BEGIN
  62.     DbfCreate := FALSE;
  63.     Exit
  64.     END;
  65.  
  66.   FSplit(FileNameIn,D^.Dir,D^.Name,D^.Ext);
  67.   IF Length(D^.Ext) = 0 THEN FileNameIn :=
  68.                               FileNameIn + '.LAY';
  69.   {$I-}
  70.   Assign(D^.LayoutIn,FileNameIn);
  71.   Reset(D^.LayoutIn);
  72.   {$I+}
  73.   IF IOResult <> 0 THEN BEGIN
  74.     WriteLn('Error opening layout file ',
  75.                                       FileNameIn);
  76.     DbfCreate := FALSE;
  77.     FreeMem(D,SizeOf(D^));
  78.     Exit
  79.     END;
  80.  
  81.   D^.FileNameOut := D^.Dir + D^.Name + '.DBF';
  82.   FindFirst(D^.FileNameOut,AnyFile,D^.DirInfo);
  83.   IF DosError = 0 THEN BEGIN        {File exists}
  84.     WriteLn('File already exists.');
  85.     Write('Replace current ',D^.FileNameOut,
  86.           ' (Y/N)?: ');
  87.     ReadLn(D^.Response);
  88.     IF UpCase(D^.Response) <> 'Y' THEN BEGIN
  89.       FreeMem(D,SizeOf(D^));
  90.       D := NIL;
  91.       DbfCreate := FALSE;
  92.       FreeMem(D,SizeOf(D^));
  93.       Close(D^.LayoutIn);
  94.       Exit
  95.       END;
  96.     END;
  97.  
  98.   Assign(D^.DbfNewOut,D^.FileNameOut);
  99.   Rewrite(D^.DbfNewOut,1); {Set record size to 1}
  100.   Seek(D^.DbfNewOut,32);   {Beginning of fields }
  101.  
  102. {First process fields}
  103.  
  104.   FillChar(D^.FieldRec.Reserved1, 4, 0);
  105.   FillChar(D^.FieldRec.Reserved2,14, 0);
  106.  
  107.   D^.FieldCounter := 0;
  108.   D^.FPos := 0;
  109.   D^.RecordLength := 0;
  110.  
  111.   WHILE NOT Eof(D^.LayoutIn) DO BEGIN
  112.     ReadLn(D^.LayoutIn,D^.TempString1);
  113.  
  114. {Initialize values for next field}
  115.  
  116.     Inc(D^.FieldCounter);
  117.     Inc(D^.FPos,32);
  118.  
  119.     FillChar(D^.FieldRec.FdName,11,0);
  120.     D^.Location := Pos(' ',D^.TempString1);
  121.     IF D^.Location < 11 THEN
  122.       Move(D^.TempString1[1],D^.FieldRec.FdName,
  123.            D^.Location-1)
  124.     ELSE
  125.       Move(D^.TempString1[1],D^.FieldRec.FdName,
  126.            10);
  127.  
  128.     D^.FieldRec.FdType := D^.TempString1[11];
  129.  
  130.     Move(D^.TempString1[12],D^.TempString2[1],3);
  131.     D^.TempString2[0] := Chr(3);
  132.     {$R-}
  133.     Val(D^.TempString2,D^.FieldRec.FdLength,
  134.         D^.Code);
  135.     {$R+}
  136.     IF D^.Code <> 0 THEN BEGIN
  137.       FreeMem(D,SizeOf(D^));
  138.       D := NIL;
  139.       DbfCreate := FALSE; {Rtn on error}
  140.       Close(D^.LayoutIn);
  141.       Close(D^.DbfNewOut);
  142.       FreeMem(D,SizeOf(D^));
  143.       Exit
  144.       END; {IF}
  145.  
  146.     D^.TempString2 := '';
  147.     Move(D^.TempString1[15],D^.TempString2[1],2);
  148.     D^.TempString2[0] := Chr(2);
  149.     {$R-}
  150.     Val(D^.TempString2,D^.FieldRec.FdDec,D^.Code);
  151.     {$R+}
  152.     IF D^.Code <> 0 THEN BEGIN
  153.       FreeMem(D,SizeOf(D^));
  154.       D := NIL;
  155.       DbfCreate := FALSE;  {Rtn on error}
  156.       Close(D^.LayoutIn);
  157.       Close(D^.DbfNewOut);
  158.       FreeMem(D,SizeOf(D^));
  159.       Exit
  160.       END; {IF}
  161.     BlockWrite(D^.DbfNewOut,D^.FieldRec,
  162.                SizeOf(D^.FieldRec));
  163.     Inc(D^.RecordLength,D^.FieldRec.FdLength);
  164.  
  165.     END; {WHILE}
  166.  
  167.     BlockWrite(D^.DbfNewOut,EOH,1); {End of hdr}
  168.     BlockWrite(D^.DbfNewOut,EODbf,1); {EndOfFile}
  169.  
  170. {Then set header information}
  171.  
  172.   WITH D^.Header DO BEGIN
  173.     VersionNumber := $03;
  174.     GetDate(D^.Year,D^.Month,D^.Day,D^.DayOfWeek);
  175.     Update[1] := D^.Year-1900;
  176.     Update[2] := D^.Month;
  177.     Update[3] := D^.Day;
  178.     NbrRec := 0;
  179.     HdrLen := D^.FieldCounter * 32 + 33;
  180.     RecLen := D^.RecordLength + 1;
  181.     END;
  182.   Seek(D^.DbfNewOut,0); {Set to beginning of FILE}
  183.   BlockWrite(D^.DbfNewOut,D^.Header,
  184.              SizeOf(D^.Header));
  185.   Close(D^.LayoutIn);
  186.   Close(D^.DbfNewOut);
  187.   FreeMem(D,SizeOf(D^));
  188.   D := NIL;
  189.   DbfCreate := TRUE
  190. END;
  191.  
  192.  
  193. BEGIN
  194.   ClrScr;
  195.   IF DbfCreate('PLANETS.LAY') THEN
  196.     WriteLn('File creation successfull')
  197.   ELSE
  198.     WriteLn('Could not create the dBASE FILE')
  199. END.
  200.