home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 2
/
ctrom_ii_b.zip
/
ctrom_ii_b
/
PROGRAM
/
BASIC
/
QBDBAS
/
QBDBASE.BAS
< prev
next >
Wrap
BASIC Source File
|
1991-10-21
|
24KB
|
695 lines
' DEMONSTRATIE PROGRAMMA.
'
' LEES dBaseIII en dBaseIV DataBase- en Memobestanden met QuickBasic
'
' -----------------------------------------------------------------------
'
' Doel: Het lezen van dBase III en IV bestanden.
'
' Werking: Dit voorbeeld programma toont de header structuur, de records
' en de memo's van een dBase file op het scherm. Dezelfde
' routines kunnen worden gebruikt om dBase records in uw eigen
' database programma binnen te halen en ze verder te bewerken.
' Het rechstreeks wijzigen van een dBase bestand is natuurlijk
' ook mogelijk; pas echter op bij het veranderen van de
' sleutelvelden van een dBase bestand. Eventuele indexen kunnen
' daardoor corrupt worden.
'
' -----------------------------------------------------------------------
DEFINT A-Z
' de lay-out van het eerste blok van 32 bytes van een dBase bestand.
'
TYPE dbHeader
Versie AS STRING * 1 ' versie nummer (3 of 4)
LaatsteDatum AS STRING * 3 ' laatste update datum
AantalRecords AS LONG ' aantal records
HeaderLengte AS INTEGER ' lengte van het header blok.
RecordLengte AS INTEGER ' recordlengte (incl Deleted Byte)
Ongebruikt AS STRING * 20 '
END TYPE
' de lay-out van de volgende blokken van 32 bytes van de header.
'
TYPE VeldBeschrijving
VeldNaam AS STRING * 11 ' naam van het veld
VeldType AS STRING * 1 ' type
DataAdres AS STRING * 4 ' niet gebruikt in dit programma.
VeldLengte AS STRING * 1 ' lengte van een veld
Decimalen AS STRING * 1 ' aantal decimalen, indien numeriek
Ongebruikt AS STRING * 14 '
END TYPE
' -----------------------------------------------------------------------
DECLARE SUB Invoer ()
DECLARE SUB OpendBFile ()
DECLARE SUB BekijkHeader ()
DECLARE SUB BekijkLayout ()
DECLARE SUB BekijkRecords ()
DECLARE SUB BekijkMemo (Buffer$)
DECLARE FUNCTION BestandAanwezig% (Bestand$)
' -----------------------------------------------------------------------
DIM SHARED Header AS dbHeader ' 1e blok van 32 bytes
DIM SHARED dBFile$ ' dBase file naam
DIM SHARED dBHandle% ' dbase file handle
DIM SHARED MemoHandle% ' memo file handle
DIM SHARED Versie% ' versie nummer
DIM SHARED MemoAanwezig% ' Boolean.
DIM SHARED AantalVelden% ' aantal velden.
DIM SHARED DiskFout% ' Boolean ON ERROR var.
DIM SHARED MemoryFout% ' Boolean ON ERROR var.
REDIM SHARED Veld(1 TO 2) AS VeldBeschrijving ' (wordt ge-REDIM-ed)
' -----------------------------------------------------------------------
CLS
ON ERROR GOTO Foutje ' Algemene fout afhandeling.
CALL Invoer ' Vraag .DBF naam
CALL OpendBFile ' file openen
CALL BekijkHeader ' bekijk header
CALL BekijkLayout ' bekijk record layout
CALL BekijkRecords ' toon records en memo's
CLOSE
PRINT
PRINT SPC(17); "Vriendelijke groeten van BLOKKER+BLOKKER"
PRINT SPC(17); " Postbus 71992 - 1008 ED Amsterdam"
PRINT SPC(17); " 020 - 6.42.32.75"
PRINT
PRINT SPC(9); "TurboFlow! is onmisbaar voor elke QuickBasic programmeur !"
PRINT SPC(9); STRING$(58, "─")
END
' -----------------------------------------------------------------------
' Fouten afhandeling:
'
Foutje:
CLOSE
PRINT "Error :"; ERR
RESUME StopProgramma
StopProgramma:
END
' -----------------------------------------------------------------------
' Speciale foutroutine. Wordt aangeroepen in de funktie BestandAanwezig.
'
FoutBestand:
DiskFout% = -1
RESUME NEXT
' -----------------------------------------------------------------------
' Speciale foutroutine. Wordt aangeroepen in de SUB BekijkMemo()
'
OutOfStringSpace:
MemoryFout% = -1
RESUME NEXT
'
' That's all, Folks!
' ------------------------------------------------------------------------
SUB BekijkHeader
' --------------------------------------------------------------------
' Funktie : Analyseer de inhoud van het eerste blok van 32 bytes
' van een dBase file. OPEN .DBT MemoFile indien aanwezig.
'
' Gebruikt : FUNCTION BestandAanwezig%(File$)
'
' Shared : Header - type dBHeader
' Versie% - 3 = dBaseIII, 4 = dBase IV.
' MemoAanwezig% - Boolean.
' --------------------------------------------------------------------
' Locale variabelen:
' ------------------
DIM Jaar% ' datum laatste update
DIM Maand% ' -
DIM Dag% ' -
DIM MemoFile$ ' naam van het .DBT bestand
' De header van een dBase III bestand heeft de volgende inhoud:
' ----------------------------------------------------------------------
' Versie - STRING * 1 ' Ascii waarde is versie nummer.
' LaatsteDatum - STRING * 3 ' Ascii waarde jaar/maand/dag
' AantalRecords - LONG INTEGER ' aantal records in het bestand
' HeaderLengte - INTEGER ' lengte van de header
' RecordLengte - INTEGER ' lengte van elk record
'
' Bepaal het versie nummer en kijk of er memovelden aanwezig zijn.
'
SELECT CASE Header.Versie
CASE CHR$(&H3) ' 3
Versie% = 3
MemoAanwezig% = 0
CASE CHR$(&H83) ' 131
Versie% = 3
MemoAanwezig% = -1
CASE CHR$(&H63) ' 99
Versie% = 4
MemoAanwezig% = 0
CASE CHR$(&H8B) ' 139
Versie% = 4
MemoAanwezig% = -1
CASE ELSE
PRINT "Geen dBase III of dBase IV bestand"
CLOSE
END
END SELECT
' Toon de informatie uit de header.
'
Dag% = ASC(MID$(Header.LaatsteDatum, 3, 1))
Maand% = ASC(MID$(Header.LaatsteDatum, 2, 1))
Jaar% = ASC(MID$(Header.LaatsteDatum, 1, 1))
PRINT "Versie ...........:"; Versie%
PRINT "Laatste wijziging.:"; STR$(Dag%); "-"; MID$(STR$(Maand%), 2); "-"; MID$(STR$(Jaar%), 2)
PRINT "Header lengte ....:"; Header.HeaderLengte; "bytes"
PRINT "Aantal records ...:"; Header.AantalRecords
PRINT "Record lengte ....:"; Header.RecordLengte; "bytes"
IF MemoAanwezig% THEN
PRINT "Memo velden ......: aanwezig."
MemoFile$ = LEFT$(dBFile$, INSTR(dBFile$, ".")) + "DBT"
IF NOT BestandAanwezig(MemoFile$) THEN
PRINT "Memo file ........: niet aanwezig !"
MemoAanwezig% = 0
ELSE
MemoHandle% = FREEFILE
OPEN MemoFile$ FOR BINARY AS #MemoHandle%
PRINT "Memo file ........: "; MemoFile$; " geopend. Lengte :"; LOF(MemoHandle%); "bytes."
END IF
ELSE
PRINT "Memo velden ......: niet aanwezig."
END IF
END SUB
SUB BekijkLayout
' Funktie : Analyseer de header van een dBase file vanaf
' het tweede blok van 32 bytes. Toon de record layout.
'
' shared : AantalVelden%
' VELD - type VeldBeschrijving.
' HEADER - type dBHeader
' AantalVelden%
' --------------------------------------------------------------
' locale variabelen:
' ------------------
DIM I% ' loop teller
DIM I$ ' toets opvang.
DIM ChrSNul% ' plaats van chr$(0) in veldnaam.
AantalVelden% = (Header.HeaderLengte \ 32) - 1
' In de hoofdroutine is de TYPE variabele "Veld" al voorlopig
' ge-DIM'd met twee elementen. Zet het aantal elementen nu
' met een REDIM commando op het juiste aantal velden.
REDIM Veld(1 TO AantalVelden%) AS VeldBeschrijving
FOR I% = 1 TO AantalVelden% ' lees blokken van 32 bytes.
SEEK #dBHandle%, (32 * I%) + 1 ' file pointer.
GET #dBHandle%, , Veld(I%) ' en plaats deze in Veld().
' zoek naar Ascii 0 in de veldnaam. Indien gevonden, vervang dan
' alle tekens vanaf die plaats tot het einde van het veld door spaties.
'
ChrSNul% = INSTR(Veld(I%).VeldNaam, CHR$(0))
IF ChrSNul > 0 THEN
FOR ChrSNul% = ChrSNul% TO LEN(Veld(I%).VeldNaam)
MID$(Veld(I%).VeldNaam, ChrSNul, 1) = " "
NEXT ChrSNul
END IF
NEXT I%
PRINT
PRINT " Nr Veldnaam--- Type------------- Lengte Decimalen"
FOR I% = 1 TO AantalVelden%
PRINT USING "### "; I%;
PRINT Veld(I%).VeldNaam; TAB(20); " ";
COLOR 15, 0
PRINT Veld(I%).VeldType;
COLOR 7, 0
SELECT CASE Veld(I%).VeldType
CASE "C"
PRINT "haracter (Tekst) ";
CASE "N"
PRINT "umeric (Getal) ";
CASE "L"
PRINT "ogic (Ja/Nee) ";
CASE "D"
PRINT "ate (Datum) ";
CASE "M"
PRINT "emo (Notitie)";
CASE ELSE
PRINT SPACE$(18);
END SELECT
PRINT USING "#####"; ASC(Veld(I%).VeldLengte);
SELECT CASE Veld(I%).VeldType
CASE "N"
PRINT USING "#####"; ASC(Veld(I%).Decimalen)
CASE "M"
PRINT SPACE$(8); "(Pointer naar .DBT file)"
CASE "D"
PRINT SPACE$(8); "(Formaat JJJJMMDD)"
CASE ELSE
PRINT
END SELECT
NEXT I%
PRINT
PRINT "Druk op de spatiebalk...";
I$ = ""
DO
I$ = INKEY$
LOOP UNTIL I$ = CHR$(32)
END SUB
SUB BekijkMemo (Buffer$)
DIM Positie% ' Plaats in string
DIM EindeRegel$ ' Einde regel aanduiding in memo tekst
DIM CR$ ' Carriage Return
DIM LF$ ' Line Feed
DIM TB$ ' Tab
EindeRegel$ = "ì" + CHR$(10) ' memo einde regel
CRLF$ = CHR$(13) + CHR$(10)
CR$ = CHR$(13)
LF$ = CHR$(10)
TB$ = CHR$(9)
' In de memo's staan een aantal besturings tekens.
' Verwijder die tekens voor meer leesbaarheid.
'
PRINT
PRINT
LOCATE 16, 20: PRINT "Verwijderen Einde Regel tekens...";
Strip$ = EindeRegel$
GOSUB StripBuffer
LOCATE , 20: PRINT "Verwijderen CR/LF's... ";
Strip$ = CRLF$
GOSUB StripBuffer
LOCATE , 20: PRINT "Verwijderen Carriage Returns... ";
Strip$ = CR$
GOSUB StripBuffer
LOCATE , 20: PRINT "Verwijderen Line Feeds... ";
Strip$ = LF$
GOSUB StripBuffer
LOCATE , 20: PRINT "Verwijderen Tabs... ";
Positie% = INSTR(Buffer$, TB$) ' zoek Tabs
WHILE Positie% > 0 ' zet om in spatie...
MID$(Buffer$, Positie%, 1) = " "
Positie% = INSTR(Buffer$, TB$)
WEND
MemoryFout% = 0
ON ERROR GOTO OutOfStringSpace
LOCATE , 20: PRINT "Verwijderen dubbele spaties... ";
FOR X% = 20 TO 2 STEP -1
Positie% = INSTR(Buffer$, SPACE$(X%))
DO WHILE Positie% > 0
Buffer$ = LEFT$(Buffer$, Positie%) + MID$(Buffer$, Positie% + X%)
IF MemoryFout% THEN
SOUND 350, .5
LOCATE , 20: PRINT "Out of String space... "
LOCATE , 20: PRINT "Memo te groot om in te delen"
SLEEP 3
ON ERROR GOTO Foutje
GOTO ToonMemo ' Nooduitgang.
END IF
Positie% = INSTR(Buffer$, SPACE$(X%))
LOOP
NEXT X%
LOCATE , 20: PRINT "Woordomslag organiseren... ";
FOR Positie% = 78 TO LEN(Buffer$) STEP 78
FOR X% = Positie% TO 1 STEP -1
IF MID$(Buffer$, X%, 1) = " " THEN
EXIT FOR
END IF
NEXT X%
Buffer$ = LEFT$(Buffer$, X%) + SPACE$(Positie% - X%) + MID$(Buffer$, X% + 1)
NEXT Positie%
ToonMemo:
LOCATE 12, 1
PRINT "┌"; STRING$(78, "─"); "┐";
FOR X% = 13 TO 23
PRINT "│"; SPACE$(78); "│";
NEXT X%
PRINT "└"; STRING$(78, "─"); "┘";
Regel% = 13
FOR Positie% = 1 TO LEN(Buffer$) STEP 78
LOCATE Regel%, 2
PRINT MID$(Buffer$, Positie%, 78);
Regel% = Regel% + 1
IF Regel = 24 THEN
WHILE I$ = ""
I$ = INKEY$
WEND
IF I$ = CHR$(27) THEN
EXIT SUB
END IF
I$ = ""
FOR X% = 13 TO 23
LOCATE X%, 2
PRINT SPACE$(78);
NEXT X%
Regel% = 13
END IF
NEXT Positie%
EXIT SUB
StripBuffer:
Positie% = INSTR(Buffer$, Strip$) ' zoek te verwijderen
WHILE Positie% > 0 ' teken(s) en verander
MID$(Buffer$, Positie%, LEN(Strip$)) = SPACE$(LEN(Strip$))
Positie% = INSTR(Buffer$, Strip$)
WEND
RETURN
END SUB
SUB BekijkRecords
' Funktie : Bekijk de records in een dBase III of IV bestand.
' Toon ook de memo's, indien aanwezig.
'
' shared : AantalVelden%
' MemoAanwezig%
'
' locale variabelen:
' ------------------
DIM Rec$ ' Record inlees buffer.
DIM A$ ' Veld inlees buffer.
DIM Form$ ' Masker voor PRINT USING van een bedrag.
DIM MemoPointer& ' Pointer naar blok in memo file.
DIM MemoLengte& ' Lengte van een dBase IV memo.
DIM EersteBlok% ' Boolean, bezig met eerste blok van memo.
DIM Blok$ ' Blok tekst van 512 bytes.
DIM Buffer$ ' Buffer voor totale memo tekst.
DIM SeekPosition& ' File pointer in dBase file.
DIM MemoIngelezen% ' Boolean. Gereed met inlezen van memo.
DIM Record& ' Loop teller.
DIM J% ' Loop teller.
' Toon nu de records.
'
CLS
SeekPosition& = Header.HeaderLengte + 1 ' start van 1e record
SEEK #dBHandle%, SeekPosition& ' plaats leeskop
FOR Record& = 1 TO Header.AantalRecords ' toon alle records
Rec$ = SPACE$(Header.RecordLengte) ' init string
GET #dBHandle%, , Rec$ ' lees string uit file
PRINT "Record nr. :";
PRINT USING "###_."; Record&; ' toon recordnummer
IF LEFT$(Rec$, 1) = "*" THEN ' 1e pos een ster:
COLOR 15, 0
PRINT " Record is gewist." ' .. record is deleted.
COLOR 7, 0
ELSE
PRINT " Record is geldig."
END IF
StartPos% = 2
FOR J% = 1 TO AantalVelden% ' toon de velden
PRINT Veld(J%).VeldNaam; " : "; ' .. veld naam.
' lees veld in A$
A$ = MID$(Rec$, StartPos%, ASC(Veld(J%).VeldLengte))
SELECT CASE Veld(J%).VeldType ' welk type ?
CASE "C" ' tekst
PRINT A$
CASE "D" ' datumveld
PRINT MID$(A$, 7, 2); "/"; MID$(A$, 5, 2); "/"; MID$(A$, 1, 4)
CASE "N" ' numeriek
' stel het masker samen, waarmee een getal moet worden afgedrukt.
'
IF ASC(Veld(J%).Decimalen) > 0 THEN
Form$ = STRING$(ASC(Veld(J%).VeldLengte) - ASC(Veld(J%).Decimalen), "#") + "." + STRING$(ASC(Veld(J%).Decimalen), "#")
ELSE
Form$ = STRING$(ASC(Veld(J%).VeldLengte), "#")
END IF
A# = VAL(A$)
PRINT USING Form$; A#
CASE "L" ' logisch veld.
IF A$ = "T" OR A$ = "Y" THEN ' T of Y ?
PRINT "Waar" ' .. waar.
ELSE ' anders..
PRINT "Niet waar" ' .. niet waar.
END IF
' De memo velden in dBase3 en dBase4 zijn verschillend ge-
' organiseerd. In dBase3 zijn het eenvoudig aaneengesloten blokken
' tekst van 512 bytes. Elk memo wordt afgesloten met 1Ah 1Ah
'
' In dBase4 begint een memoblok FFh FFh 08h 00h met daarachter de
' lengte van de memo als LONG INTEGER in 4 bytes.
'
' Als echter in dBase4 een bestand met memo's wordt ingelezen dat
' in dBase3 is aangemaakt, dan blijft de oude structuur gehandhaafd
' tot het moment dat een memo in dBase IV wordt bijgewerkt.
'
' Er kunnen dus in een en hetzelfde .DBT bestand memo's met
' verschillende formaten voorkomen !!!
'
CASE "M"
MemoIngelezen% = 0
MemoPointer& = VAL(A$) ' pointer naar 512 bytes
' blok in memofile
PRINT A$; " <- pointer naar memo file. Formaat : ";
IF MemoPointer& > 0 AND MemoAanwezig% THEN ' Memo ingevuld?
Buffer$ = ""
EersteBlok% = -1
DO
Blok$ = SPACE$(512) ' init string
GET #MemoHandle%, (MemoPointer& * 512) + 1, Blok$ ' lees 512 bytes
IF EersteBlok% THEN
EersteBlok% = 0
' In dBaseIV bevatten de eerste 8 bytes van een memo blok
' FF FF 08 00 plus LONG INTEGER met het aantal bytes.
'
' Maar... het is mogelijk, dat in dBase4 een databestand met
' memo's wordt bewerkt, dat onder dBase3 is aangemaakt. In dat
' geval behandelt dBase4 zonder meer een memo-bestand volgens
' de "oude" dBase3 methode en schrijft het memo in de nieuwe
' vorm terug! In hetzelfde .DBT memobestand kunnen dus
' memo's voorkomen in het oude en het nieuwe formaat...
'
IF LEFT$(Blok$, 2) = CHR$(255) + CHR$(255) THEN
'
' nieuwe structuur van dBase IV
'
MemoLengte& = CVL(MID$(Blok$, 5, 4)) - 8&
Blok$ = MID$(Blok$, 9)
Versie% = 4
PRINT "dBase IV.";
ELSE
'
' memo met oude structuur van dBase III
'
Versie% = 3
PRINT "dBase III.";
END IF
END IF 'EersteBlok%
Buffer$ = Buffer$ + Blok$ ' vul Buffer$.
' Is memo nu geheel ingelezen?
'
SELECT CASE Versie%
CASE 4
IF LEN(Buffer$) >= MemoLengte& THEN
Buffer$ = LEFT$(Buffer$, MemoLengte&)
MemoIngelezen% = -1
END IF
CASE 3
' het einde van een memo wordt
' in dBaseIII aangegeven met &H1A &H1A
'
Einde% = INSTR(Buffer$, CHR$(&H1A) + CHR$(&H1A))
IF Einde% > 0 THEN
Buffer$ = LEFT$(Buffer$, Einde% - 1)
MemoIngelezen% = -1
END IF
END SELECT
MemoPointer& = MemoPointer& + 1 ' volgende blok.
LOOP UNTIL MemoIngelezen%
CALL BekijkMemo(Buffer$)
ELSEIF MemoPointer& > 0 THEN ' wel memo-pointer, geen .DBT bestand
LOCATE 16, 25
PRINT "Geen Memobestand aanwezig!";
ELSEIF MemoPointer& = 0 THEN
LOCATE 16, 25
PRINT "Geen memo voor dit record...";
END IF
END SELECT
StartPos% = StartPos% + ASC(Veld(J%).VeldLengte) ' volgende veld.
NEXT J%
SLEEP ' wacht
I$ = INKEY$ ' [Esc] = Stop
IF I$ = CHR$(27) THEN
CLS
EXIT SUB
END IF
CLS
NEXT Record&
END SUB
FUNCTION BestandAanwezig% (Bestand$)
' --------------------------------------------------------------------
' Funktie : kontroleer of een bestand aanwezig is.
'
' De werking is als volgt. Eerst wordt de opdracht gegeven om
' bij een volgende fout niet naar het label "Foutje:" te springen
' maar naar het label "FoutBestand:"
' Daarna wordt de SHARED variabele DiskFout% in deze routine op nul gezet.
' Er wordt dus aangenomen dat er geen fout zal optreden.
'
' Als het bestand niet aanwezig is dan zal de ON ERROR routine naar
' het label "FoutBestand:" springen. Op die plaats wordt de SHARED
' variabele DiskFout% op -1 gezet en er wordt met RESUME NEXT voor
' gezorgd dat met de volgende programmaregel in deze routine wordt
' verder gegaan. Dan wordt de variabele DiskFout% getest. Als DiskFout%
' nog steeds 0 is, dan is er geen fout opgetreden. Als DiskFout%
' in de error trap routine op -1 is gezet, dan is het bestand niet
' gevonden of het kon niet worden geopend.
'
' In de Hoofdroutine moet u de variabale Diskfout% SHARED verklaren met:
' DIM SHARED DiskFout%
'
' --------------------------------------------------------------------
DiskFout% = 0 ' reset SHARED variabele DiskFout%
FileNr% = FREEFILE ' file handle.
ON ERROR GOTO FoutBestand ' tijdelijk omleiden van ON ERROR
OPEN Bestand$ FOR INPUT AS #FileNr% ' probeer te openen
CLOSE #FileNr% ' en weer sluiten
IF DiskFout% THEN ' Ai! niet gelukt...
BestandAanwezig% = 0 ' .. geef False terug
ELSE ' anders
BestandAanwezig% = -1 ' ..Bingo! bestand aanwezig.
END IF
ON ERROR GOTO Foutje ' reset Algemene fouten opvang.
' Onderaan in de Hoofdroutine de volgende regels plaatsen:
'
' FoutBestand:
' DiskFout% = -1
' RESUME NEXT
END FUNCTION
SUB Invoer
' Funktie: Vraag de naam van het te bekijken dBase bestand.
' Voeg zo nodig de extensie .DBF toe.
'
' Shared : dBFile$ - naam van het database bestand.
'
' --------------------------------------------------------
INPUT "dBase file [.DBF] : ", dBFile$ ' vraag de naam
IF dBFile$ = "" THEN ' alleen [Enter] gedrukt.
PRINT "<break>"
END
END IF
dBFile$ = UCASE$(dBFile$) ' hoofdletters
IF INSTR(dBFile$, ".") = 0 THEN ' geen extensie ?
dBFile$ = dBFile$ + ".DBF" ' plaats .DBF er achter
END IF
IF RIGHT$(dBFile$, 4) <> ".DBF" THEN ' .DBF verplicht
PRINT "Dit is geen dBase bestand" ' anders: bye...
END
END IF
LOCATE 1, 21
PRINT dBFile$;
END SUB ' Invoer
SUB OpendBFile
' Funktie : Kontroleer of dBase bestand aanwezig is.
' Zo ja, OPEN de file FOR BINARY en lees het
' het eerste blok van 32 bytes in.
'
' Gebruikt : FUNCTION BestandAanwezig%(File$)
'
' Shared : dBFile$ - naam van het database bestand.
' Header - lay-out van het eerste blok van 32 bytes.
' ------------------------------------------------------------------
IF BestandAanwezig%(dBFile$) THEN
dBHandle% = FREEFILE
OPEN dBFile$ FOR BINARY AS #dBHandle% ' o.k.
GET #dBHandle%, , Header ' lees header string.
PRINT " geopend. Lengte :"; LOF(dBHandle%); " bytes."
ELSE
PRINT
PRINT "Bestand "; dBFile$; " niet gevonden ..."
END
END IF
END SUB