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
Wrap
Text File
|
1993-11-09
|
4KB
|
101 lines
#include fileio.hdr
#include io.hdr
#include pick.hdr
#include string.hdr
#include dbd.hdr
#pragma W_FUNC_PROC-
*-- Öffnen einer DBF-Datei, Einlesen der Satzstruktur in eine Pick-Liste
* und auf ersten Satz positionieren
*
* Rückgabe: 0 - Erfolg
* -1 - Datei nicht gefunden oder nicht zu öffnen
* -2 - Keine DBF-Datei
*
function uint DBOpen
parameters ulong Handle[3], ; && Handles
const char FileName && Dateiname
vardef
byte DBFId
char(10) FieldName
byte FieldType
byte FieldLen
byte FieldDec
int FieldCount
uint i
uint uiFieldLen
ENDDEF
for i = 0 to 2 && Handle-Array initialisieren
Handle[i] = 0
next
if .not. fb_open(Handle[&DBF],FileName,&B_READ) && Datei öffnen
return 1 && Fehler, nicht vorhanden
endif
fb_read(Handle[&DBF], DBFId, 1) && Kenner-Byte lesen
if (DBFId <> 3) .and. ; && DBF-Datei ?
(DBFId <> 0x83) .and. ; && DBF mit Memo ?
(DBFId <> 0x63) && dBase IV ?
return 2 && Fehler
endif
fb_seek(Handle[&DBF], 31, &FB_CURRENT) && Positionieren auf Feld-
&& Beschreiber
FieldCount = 0
repeat && Anzahl der Felder be-
fb_read(Handle[&DBF], FieldName, 11) && stimmen - dazu solange
fb_seek(Handle[&DBF], 21, &FB_CURRENT) && Feldnamen lesen, bis
FieldCount = FieldCount + 1
until asc(left(FieldName,1)) = 0x0d && CR gefunden wird
FieldCount = FieldCount - 1 && Anzahl korrigieren
Handle[&STRU] = Pick_Init() && Pick-Liste für Satz-
&& Struktur initialisieren
Pick_Add(Handle[&STRU],str(FieldCount,4,0)) && In erstem Element Feld-
&& Anzahl speichern
fb_seek(Handle[&DBF], 32, &FB_BEGIN) && Wieder auf ersten Feld-
&& Beschreiber gehen
for i = 1 to FieldCount && Feld-Informationen ein-
fb_read(Handle[&DBF], FieldName, 11) && lesen
fb_read(Handle[&DBF], FieldType, 1)
fb_seek(Handle[&DBF], 4, &FB_CURRENT)
fb_read(Handle[&DBF], FieldLen, 1)
fb_read(Handle[&DBF], FieldDec, 1)
fb_seek(Handle[&DBF], 14, &FB_CURRENT)
* ---
* Bug-Fix:
* durch die Byte-Deklaration werden nur Werte von -127 bis +127
* eingelesen.
* Dadurch Fehlermeldung bei Feldweiten > 127
* Byte-Wert in UINT umwandeln!
* Sonst keine Änderungen nötig, weil alle anderen Informationen aus
* den PICK-Listen gelesen werden.
* ---
IF FieldLen < 0
uiFieldLen = 256 + FieldLen
ELSE
uiFieldLen = FieldLen
ENDIF
Pick_Add(Handle[&STRU], ; && In einem String kombi-
chr(FieldType) +; && nieren und in Pick-
str(uiFieldLen,3,0) +; && Liste eintragen
str(FieldDec,3,0) +;
FieldName)
next
DBGoTop(Handle[0]) && Auf ersten Satz
DBReadRec(Handle[0]) && Feldinhalte lesen
return 0 && ohne Fehler zurück
end DBOpen