home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / DBD_FIX / DBOPEN.PRG < prev   
Text File  |  1993-11-09  |  4KB  |  101 lines

  1. #include fileio.hdr
  2. #include io.hdr
  3. #include pick.hdr
  4. #include string.hdr
  5. #include dbd.hdr
  6.  
  7. #pragma W_FUNC_PROC-
  8.  
  9. *-- Öffnen einer DBF-Datei, Einlesen der Satzstruktur in eine Pick-Liste
  10. *   und auf ersten Satz positionieren
  11. *
  12. *   Rückgabe:   0 - Erfolg
  13. *              -1 - Datei nicht gefunden oder nicht zu öffnen
  14. *              -2 - Keine DBF-Datei
  15. *
  16. function  uint     DBOpen
  17.   parameters ulong Handle[3],    ;  &&  Handles
  18.              const char FileName    &&  Dateiname
  19.  
  20.   vardef
  21.     byte     DBFId
  22.     char(10) FieldName
  23.     byte     FieldType
  24.     byte     FieldLen
  25.     byte     FieldDec
  26.     int      FieldCount
  27.     uint     i
  28.     uint     uiFieldLen
  29.   ENDDEF
  30.  
  31.   for i = 0 to 2                           && Handle-Array initialisieren
  32.     Handle[i] = 0
  33.   next
  34.  
  35.   if .not. fb_open(Handle[&DBF],FileName,&B_READ)  && Datei öffnen
  36.     return 1                                       && Fehler, nicht vorhanden
  37.   endif
  38.  
  39.   fb_read(Handle[&DBF], DBFId, 1)                  && Kenner-Byte lesen
  40.  
  41.   if (DBFId <> 3)    .and. ;                       && DBF-Datei ?
  42.      (DBFId <> 0x83) .and. ;                       && DBF mit Memo ?
  43.      (DBFId <> 0x63)                               && dBase IV ?
  44.     return 2                                       && Fehler
  45.   endif
  46.  
  47.   fb_seek(Handle[&DBF], 31, &FB_CURRENT)           && Positionieren auf Feld-
  48.                                                    && Beschreiber
  49.   FieldCount = 0
  50.   repeat                                           && Anzahl der Felder be-
  51.     fb_read(Handle[&DBF], FieldName, 11)           && stimmen - dazu solange
  52.     fb_seek(Handle[&DBF], 21, &FB_CURRENT)         && Feldnamen lesen, bis
  53.     FieldCount = FieldCount + 1
  54.   until asc(left(FieldName,1)) = 0x0d              && CR gefunden wird
  55.   FieldCount = FieldCount - 1                      && Anzahl korrigieren
  56.  
  57.   Handle[&STRU] = Pick_Init()                      && Pick-Liste für Satz-
  58.                                                    && Struktur initialisieren
  59.   Pick_Add(Handle[&STRU],str(FieldCount,4,0))      && In erstem Element Feld-
  60.                                                    && Anzahl speichern
  61.  
  62.   fb_seek(Handle[&DBF], 32, &FB_BEGIN)             && Wieder auf ersten Feld-
  63.                                                    && Beschreiber gehen
  64.   for i = 1 to FieldCount                          && Feld-Informationen ein-
  65.     fb_read(Handle[&DBF], FieldName, 11)           && lesen
  66.     fb_read(Handle[&DBF], FieldType,  1)
  67.     fb_seek(Handle[&DBF], 4, &FB_CURRENT)
  68.     fb_read(Handle[&DBF], FieldLen,   1)
  69.     fb_read(Handle[&DBF], FieldDec,   1)
  70.     fb_seek(Handle[&DBF], 14, &FB_CURRENT)
  71.  
  72.     * ---
  73.     * Bug-Fix:
  74.     * durch die Byte-Deklaration werden nur Werte von -127 bis +127
  75.     * eingelesen.
  76.     * Dadurch Fehlermeldung bei Feldweiten > 127
  77.     * Byte-Wert in UINT umwandeln!
  78.     * Sonst keine Änderungen nötig, weil alle anderen Informationen aus
  79.     * den PICK-Listen gelesen werden.
  80.     * ---
  81.  
  82.     IF FieldLen < 0
  83.        uiFieldLen = 256 + FieldLen
  84.     ELSE
  85.        uiFieldLen = FieldLen
  86.     ENDIF   
  87.  
  88.     Pick_Add(Handle[&STRU], ;                      && In einem String kombi-
  89.              chr(FieldType)    +;                  && nieren und in Pick-
  90.              str(uiFieldLen,3,0) +;                && Liste eintragen
  91.              str(FieldDec,3,0) +;
  92.              FieldName)
  93.   next
  94.  
  95.   DBGoTop(Handle[0])                               && Auf ersten Satz
  96.   DBReadRec(Handle[0])                             && Feldinhalte lesen
  97.   return 0                                         && ohne Fehler zurück
  98.  
  99. end DBOpen
  100.  
  101.