home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / DBBROW20.ZIP / DBFINFO.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-07-03  |  7.3 KB  |  257 lines

  1. Unit dbfinfo;
  2. interface
  3. uses
  4.         crt;
  5.  
  6. var
  7.         dbfile : file;
  8.         currentrec : longint;
  9.         dbfilename : string;
  10.         dbfileok : boolean;
  11.         dberr : integer;
  12.  
  13.  
  14. procedure dbwrthd;      {writes the header info}
  15. procedure disprec;      {displays the record data}
  16. procedure dbhdrd;       {reads the header info}
  17. procedure waitforkey;   {waits for key to be hit}
  18.  
  19. implementation
  20. const
  21.      dbmaxflds = 128;   {max. number of fields }
  22.      dbmaxrecsize = 4000; {max. size of a record }
  23.  
  24.  
  25. Type
  26.  
  27.     DBfileinfo = record      { first 32 bytes of DBF }
  28.         version : byte;
  29.                 year : byte;
  30.         month : byte;
  31.                 day : byte;
  32.                 norecord : longint;
  33.                 headlen : integer;
  34.                 reclen : integer;
  35.                 res : array[1..20] of byte;
  36.                 end;
  37.  
  38.         DBfieldinfo = record            { 32 byte field info }
  39.                 name  : array[1..11] of char;
  40.                 ftype : byte;
  41.                 addr  : longint;
  42.                 len   : byte;
  43.                 dcnt  : byte;
  44.                 res   : array[1..14] of char;
  45.                 end;
  46.  
  47.         dbfldar = array[1..dbmaxflds] of dbfieldinfo;
  48.         dbrecar = array[1..dbmaxrecsize] of char;
  49.  
  50. var
  51.         dbhead : dbfileinfo;
  52.         dbfield : dbfldar;
  53.         dbnofld : integer;
  54.         dbrecord : dbrecar;
  55.  
  56.  
  57. procedure waitforkey;
  58. var
  59.         junk : char;
  60. begin
  61.         writeln;
  62.         write('Hit any key to continue');
  63.         junk := readkey;
  64. end;
  65.  
  66.  
  67. { read rdbase III  header info }
  68. { blockread error - dberr = h = 0, l = number of records read}
  69. { bad header - dberr - h = 1, l = version }
  70. procedure dbhdrd;
  71. var
  72.    i : integer;
  73. begin
  74.         blockread(dbfile,dbhead,32,dberr);
  75.         dbfileok := (dberr = 32);
  76.         dbnofld := (dbhead.headlen - 33) div 32;
  77.         if not dbfileok then exit;
  78.  
  79.         if not ((dbhead.version = $83) or (dbhead.version = $03)) then
  80.         begin
  81.                 dbfileok := false;
  82.                 dberr := dbhead.version or $100;
  83.                 exit;
  84.         end;
  85.  
  86.         for i := 1 to dbnofld do
  87.         begin
  88.                 blockread(dbfile,dbfield[i],32,dberr);
  89.                 dbfileok := (dberr = 32);
  90.         if not dbfileok then exit;
  91.     end;
  92.  
  93. end;
  94.  
  95. { writes field titles on screen }
  96. procedure dbwrfldtit(line : integer);
  97. begin
  98.         gotoxy(1,line);
  99.         write('Field Name   Type  Len  Dec');
  100.     gotoxy(40,line);
  101.     writeln('Field Name   Type Len  Dec');
  102.         write('-----------------------------------------------------------------');
  103. end;
  104.  
  105.  
  106. { writes all header info to the screen }
  107. procedure dbwrthd;
  108. var
  109.         line,j,i : integer;
  110.  
  111. begin
  112.     clrscr;
  113.     gotoxy(29,1);
  114.     write('DBase file ',dbfilename);
  115.     gotoxy(1,3);
  116.     with dbhead do
  117.     begin
  118.         write('Last Time File Updated  - ',month:2,'/',day:2,'/',year:2);
  119.                 gotoxy(40,3);
  120.                 write('Number of records in file - ',norecord);
  121.                 gotoxy(1,4);
  122.                 write('Length of each record   - ',reclen);
  123.                 gotoxy(40,4);
  124.         end;
  125.         write('Number of fields          - ',dbnofld);
  126.         dbwrfldtit(6);
  127.         line := 8;
  128.         for i := 1 to dbnofld do
  129.         begin
  130.         if odd(i) then gotoxy(1,line) else gotoxy(40,line);
  131.                 with dbfield[i] do
  132.                 begin
  133.                         for j := 1 to 11 do write(name[j]);
  134.                         write('    ',chr(ftype),'   ',len:3,' ',dcnt:3);
  135.                 end;
  136.         if not odd(i) then
  137.         begin
  138.             line := succ(line);
  139.             if line = 24 then
  140.             begin
  141.                  if i < dbnofld then
  142.                  begin
  143.                       line := 3;
  144.                       writeln;
  145.                       write('More ....');
  146.                       waitforkey;
  147.                       clrscr;
  148.                       dbwrfldtit(1);
  149.                       end;
  150.                  end;
  151.             end;
  152.         end;
  153.         waitforkey;
  154. end;
  155.  
  156. { read and display a DBase III record }
  157. { if field data is larger than one line if will be truncated }
  158.  
  159. procedure dbreadrec(rec : longint);
  160. const
  161.         maxchar = 65;   {maximum characters to display from record}
  162. var
  163.     temp : longint;
  164.         i,j,stoppos,startpos,maxlen : integer;
  165.         linecnt : integer;
  166.  
  167. begin
  168.         with dbhead do
  169.         begin
  170.              if (rec < 1) or (rec > norecord) then
  171.              begin
  172.                   dberr := 0;
  173.                   dbfileok := false;
  174.                   exit;
  175.              end;
  176.              temp := rec;
  177.              rec := (rec - 1) * reclen + headlen;
  178.              seek(dbfile,rec);
  179.              blockread(dbfile,dbrecord,reclen,dberr);
  180.         end;
  181.         clrscr;
  182.         write('DBASE file ',dbfilename,'   Record No. ',temp);
  183.         if dbrecord[1] = '*' then writeln('    DELETED') else writeln;
  184.         writeln;
  185.         startpos := 2;
  186.         linecnt := 1;
  187.         for i := 1 to dbnofld do
  188.         begin
  189.              with dbfield[i] do
  190.              begin
  191.                   for j := 1 to 11 do write(name[j]);
  192.                   write(' -- ');
  193.                   if len > maxchar then maxlen := maxchar
  194.                   else maxlen := len;
  195.                   stoppos := startpos + maxlen;
  196.                   for j := startpos to stoppos -1 do write(dbrecord[j]);
  197.                   startpos := startpos + len;
  198.                   writeln;
  199.                   linecnt := succ(linecnt);
  200.                   if linecnt = 22 then
  201.                   begin
  202.                        if i < dbnofld then
  203.                        begin
  204.                             linecnt := 1;
  205.                             write('More ....');
  206.                             waitforkey;
  207.                             for j := 3 to 25 do
  208.                             begin
  209.                                  gotoxy(1,j);
  210.                                  clreol;
  211.                             end;
  212.                             gotoxy(1,3);
  213.                        end;
  214.                   end;
  215.              end;
  216.         end;
  217.         waitforkey;
  218. end;
  219.  
  220. procedure disprec;
  221. var
  222.         rec : string;
  223.         treal : real;
  224.         error : integer;
  225.  
  226. begin
  227.         repeat
  228.               clrscr;
  229.               writeln('DBASE file -- ',dbfilename);
  230.               writeln;
  231.               write('Total records = ',dbhead.norecord);
  232.               writeln('   Current Record = ',currentrec);
  233.               writeln;
  234.               write('Enter record to display (0 = exit, cr = next, - = previous)? ');
  235.               readln(rec);
  236.               if (rec = '') or (rec[1] = '-') then
  237.               begin
  238.                    if rec = '' then currentrec := succ(currentrec)
  239.                    else
  240.                    currentrec := pred(currentrec);
  241.               end
  242.               else
  243.               begin
  244.                    val(rec,treal,error);
  245.                    if error <> 0 then treal := 0.0;
  246.                    currentrec := trunc(treal);
  247.               end;
  248.               if currentrec = 0 then exit;
  249.               if currentrec < 0 then currentrec := 1;
  250.               if currentrec > dbhead.norecord then currentrec := dbhead.norecord;
  251.               dbreadrec(currentrec);
  252.         until false
  253.  
  254. end;
  255. begin
  256. end.
  257.