home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 2
/
ctrom_ii_b.zip
/
ctrom_ii_b
/
PROGRAM
/
BASIC
/
QBDBAS
/
VERKOPEN.BAS
< prev
next >
Wrap
BASIC Source File
|
1991-10-20
|
18KB
|
468 lines
' DEMONSTRATIE PROGRAMMA VERKOOP STATISTIEK.
'
' Een praktische toepassing van het behandelen van een dBase3/4 bestand
' met QuickBasic of QBasic.
'
' -----------------------------------------------------------------------
'
' Doel: Het maken van grafieken van de verkoop per land en per periode.
'
' Werking: Met het programma QBDBASE.BAS van BLOKKER+BLOKKER kan de
' struktuur en de record lay-out van het dBase III bestand
' VERKOPEN.DBF worden bekeken. Daarbij blijkt, dat de Header
' van VERKOPEN.DBF 129 bytes lang is. De record lay-out is
' als volgt:
'
' Status 1 byte Tekst
' LAND 7 bytes Tekst
' MAAND 2 bytes Tekst
' AANTAL 6 bytes Getal - 0 decimalen.
'
' Alle records worden gelezen, waarbij records, waarvan in
' het Statusveld een "*" staat, worden overgeslagen. Na het
' verzamelen van de gegevens worden twee staafdiagrammen op
' het scherm getoond.
'
' De gegevens die voor deze verschillende staafdiagrammen nodig
' zijn, worden in één run verzameld. De grafieken kunnen geprint
' worden. U dient echter vooraf het commando GRAPHICS te geven.
'
' Dit programma is geschikt voor pc's die SCREEN 2 ondersteunen.
'
' -----------------------------------------------------------------------
DEFINT A-Z
' de lay-out van de records van VERKOOP.DBF
'
TYPE VerkoopRecord
Status AS STRING * 1 ' "*" - RECORD GEDELETE.
Land AS STRING * 7 ' Land naam
Maand AS STRING * 2 ' Maand aanduding 01 02 etc.
Aantal AS STRING * 6 ' Aantal verkocht.
END TYPE
' Telling per land records
'
TYPE LandTelling
Land AS STRING * 7
Totaal AS LONG
END TYPE
' Telling per maand records
'
TYPE MaandTelling
Maand AS STRING * 2
Totaal AS LONG
END TYPE
' -----------------------------------------------------------------------
DECLARE SUB OpendBFile ()
DECLARE SUB Grafieken ()
DECLARE FUNCTION BestandAanwezig% (Bestand$)
' -----------------------------------------------------------------------
DIM SHARED dbFile$ ' dBase file naam
DIM SHARED dBHandle% ' dbase file handle
DIM SHARED DiskFout% ' Boolean ON ERROR var.
DIM SHARED HeaderLengte% ' Lengte van dBase header.
' -----------------------------------------------------------------------
CLS
ON ERROR GOTO Foutje ' Algemene fout afhandeling.
dbFile$ = "VERKOPEN.DBF" ' bekend gegeven.
CALL OpendBFile ' file openen
HeaderLengte% = 129 ' bekend gegeven.
CALL Grafieken ' Grafieken tekenen.
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
PRINT "Error :"; ERR
RESUME StopProgramma
StopProgramma:
END
' -----------------------------------------------------------------------
' Speciale foutroutine. Wordt aangeroepen in de funktie BestandAanwezig.
'
FoutBestand:
DiskFout% = -1
RESUME NEXT
'
' That's all, Folks!
' ------------------------------------------------------------------------
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 Grafieken
' Funktie : Lees het dBase III bestand VERKOPEN.DBF.
' Verzamel de verkoopcijfers per land en per maand.
' Maak van die gegevens grafieken op het scherm.
'
' Werkwijze : Het totale dBase bestand VERKOPEN.DBF woordt doorlopen.
' In fixed records worden de land- maandaanduidingen
' opgeslagen en het totaal per item wordt geteld. De records
' mogen in VERKOPEN.DBF volkomen door elkaar staan. De
' subtotalen worden steeds in hun eigen TYPE record geteld.
'
' Variabelen : Hier wordt gewerkt met de volgende TYPE variabelen:
'
' TYPE VerkoopRecord
' Status AS STRING * 1 Ge-delete of niet
' Land AS STRING * 7 Land naam
' Maand AS STRING * 2 Maand 01, 02, 03 etc.
' Aantal AS STRING * 6 getal.
'
' TYPE LandTelling 6 landen aanwezig
' Land AS STRING * 7
' Totaal AS LONG
'
' TYPE MaandTelling 12 maanden aanwezig
' Maand AS STRING * 2
' Totaal AS LONG
DIM REC AS VerkoopRecord ' record in VERKOPEN.DBF
DIM PerLand(6) AS LandTelling ' telling per land
DIM PerMaand(12) AS MaandTelling ' en telling per maand
DIM DelRec&
' Bereken aantal records in VERKOPEN.DBF.
'
AantalRecs& = (LOF(dBHandle%) - HeaderLengte%) \ LEN(REC)
' Positioneer de leeskop.
'
SEEK #dBHandle%, HeaderLengte% + 1
LOCATE 1, 20
PRINT "EUROPA - VERKOPEN PER LAND EN PER MAAND 1991";
PRINT STRING$(80, "─");
LOCATE 5, 1
PRINT "PER LAND AANTAL PER MAAND AANTAL"
PRINT "─────────────── ──────── ───────────────── ────────"
LandIndex% = 0 ' init Land Index.
FOR X& = 1 TO AantalRecs& ' lees alle records
GET #dBHandle%, , REC ' .. in type REC.
' niet gedelete ?
IF REC.Status <> "*" THEN ' init Boolean
LandOK% = 0 ' zoek in de PerLand(). records
FOR X% = 1 TO LandIndex% '
IF PerLand(X%).Land = REC.Land THEN ' reeds aanwezig ?
LandOK% = -1 ' dan ok.
EXIT FOR
END IF
NEXT X%
IF NOT LandOK% THEN ' kwam land nog niet voor ?
LandIndex% = LandIndex% + 1 ' verhoog de index
PerLand(LandIndex%).Land = REC.Land ' plaats naam in variabele
X% = LandIndex% ' kopieer naar X%
END IF
PerLand(X%).Totaal = PerLand(X%).Totaal + VAL(REC.Aantal) ' subtotaal.
LOCATE X% + 6, 1 ' toon op scherm
PRINT PerLand(X%).Land, ' .. land naam en
PRINT USING "##########"; PerLand(X%).Totaal; ' .. subtotaal.
MaandIndex% = VAL(REC.Maand) ' welke maand ?
PerMaand(MaandIndex%).Maand = REC.Maand ' tel subtotaal en kopieer.
PerMaand(MaandIndex%).Totaal = PerMaand(MaandIndex%).Totaal + VAL(REC.Aantal)
LOCATE MaandIndex% + 6, 41 ' toon op scherm
PRINT PerMaand(MaandIndex%).Maand, ' .. maand en subtotaal
PRINT USING "##########"; PerMaand(MaandIndex%).Totaal;
ELSE
DelRec& = DelRec& + 1
END IF ' Status
NEXT X&
' Het hele bestand is nu doorlopen en alles is in één keer
' verzameld en geteld. Toon de Totaal Generaal telling en
' bepaal ook meteen welk land en welke maand de hoogste omzet gaven.
'
LOCATE 19, 1
PRINT " ──────── ────────"
PRINT "Totaal : Totaal :"
MaxLand& = 0 ' Hoogste omzet per land.
FOR X% = 1 TO 6 ' 6 landen
TGLand& = TGLand& + PerLand(X%).Totaal ' Tel totaal generaal.
IF PerLand(X%).Totaal > MaxLand& THEN ' meer dan MaxLand&
MaxLand& = PerLand(X%).Totaal ' .. kopieer.
END IF
NEXT X%
LOCATE 20, 15 ' druk af op scherm.
PRINT USING "##########"; TGLand&
MaxMaand& = 0 ' Hoogste omzet van een maand
FOR X% = 1 TO 12 ' 12 maanden
TGMaand& = TGMaand& + PerMaand(X%).Totaal ' Tel totaal generaal
IF PerMaand(X%).Totaal > MaxMaand& THEN ' meer dan MaxMaand?
MaxMaand& = PerMaand(X%).Totaal ' .. kopieer
END IF
NEXT X%
LOCATE 20, 57 ' druk af op scherm.
PRINT USING "##########"; TGMaand&
'
' De twee totaal generaal tellingen zijn natuurlijk altijd gelijk aan elkaar.
PRINT
PRINT DelRec&; "gedelete record(s) niet meegeteld."
LOCATE 24, 1
PRINT "Druk op een toets...";
I$ = ""
DO
I$ = INKEY$
LOOP UNTIL I$ = CHR$(32)
SCREEN 2
' ------------------------------------------------------------------------
' Teken staafdiagram per Land
'
LINE (0, 0)-(639, 199), , B ' kader
LINE (132, 15)-(450, 40), , B ' kop tekst
PAINT (133, 16), CHR$(136) + CHR$(34)
LOCATE 4, 23
PRINT " OMZET PER LAND IN AANTALLEN "
LINE (20, 150)-(610, 150) ' bodem lijn
Y% = 20 ' start pixel
FOR X% = 1 TO 6 ' 6 maanden
Top% = 150 - ((PerLand(X%).Totaal * 100) \ MaxLand&) ' bereken hoogte staaf
LINE (Y%, Top%)-(Y% + 90, 150), , B ' teken staaf
IF Top% < 149 THEN ' vul staaf met
IF X% MOD 2 = 0 THEN ' diagoale lijnen
PAINT (Y% + 1, 149), CHR$(1) + CHR$(4) + CHR$(16) + CHR$(64)
ELSE
PAINT (Y% + 1, 149), CHR$(64) + CHR$(16) + CHR$(4) + CHR$(1)
END IF
END IF
LOCATE 21, (Y% \ 8) + 3 ' toon totaal per land
PRINT PerLand(X%).Totaal;
LOCATE 23, (Y% \ 8) + 3 ' toon landnaam
PRINT PerLand(X%).Land;
Y% = Y% + 100 ' verhoog start pixel.
NEXT X%
I$ = ""
DO
I$ = INKEY$
LOOP UNTIL I$ = CHR$(32)
CLS
' ------------------------------------------------------------------------
' Teken staafdiagram per maand
'
LINE (0, 0)-(639, 199), , B ' kader
LINE (132, 15)-(450, 40), , B ' kop tekst
PAINT (133, 16), CHR$(136) + CHR$(34)
LOCATE 4, 23
PRINT " OMZET PER MAAND IN AANTALLEN "
LINE (20, 150)-(610, 150) ' bodem lijn
Y% = 20 ' start pixel
FOR X% = 1 TO 12 ' 12 maanden
Top% = 150 - ((PerMaand(X%).Totaal * 100) \ MaxMaand&) ' staaf hoogte
LINE (Y%, Top%)-(Y% + 45, 150), , B ' teken staaf
IF Top% < 149 THEN ' vul met diagonalen
IF X% MOD 2 = 0 THEN
PAINT (Y% + 1, 149), CHR$(1) + CHR$(4) + CHR$(16) + CHR$(64)
ELSE
PAINT (Y% + 1, 149), CHR$(64) + CHR$(16) + CHR$(4) + CHR$(1)
END IF
END IF
LOCATE 21, (Y% \ 8) + 1 ' toon maand totaal
PRINT PerMaand(X%).Totaal;
LOCATE 23, (Y% \ 8) + 3 ' maand aanduding
PRINT PerMaand(X%).Maand;
Y% = Y% + 50
NEXT X% ' verhoog start pixel
ON ERROR GOTO 0
I$ = ""
DO
I$ = INKEY$
LOOP UNTIL I$ = CHR$(32)
' ------------------------------------------------------------------------
' Teken lijngrafiek per maand
'
M$ = "JANFEBMRTAPRMEIJUNJULAUGSEPOKTNOVDEC"
LINE (0, 0)-(639, 199), 7, BF ' kader
LINE (0, 0)-(639, 199), 0, B ' kader
LINE (132, 15)-(450, 40), 0, B ' kop tekst
PAINT (133, 16), CHR$(136) + CHR$(34) ' vul blok
LOCATE 4, 23
PRINT " Omzet per maand in aantallen " ' tekst
REDIM Array%(2000)
GET (22 * 8, 3 * 8)-(52 * 8 - 1, 4 * 8 - 1), Array%(0) ' reverse color
PUT (22 * 8, 3 * 8), Array%(0), PRESET
LINE (60, 152)-(610, 152), 0 ' X-As
LINE (60, 20)-(60, 152), 0 ' Y-As
Afstand% = 152 \ (MaxMaand& \ 200) ' maak
FOR X% = (152 - Afstand%) TO 24 STEP -Afstand% ' verdeel streepjes.
LINE (40, X%)-(60, X%), 0
NEXT X%
YY% = 140 ' Verticaal het
ZZ% = 16 ' woord AAANTAL
FOR X% = (42 * 8) TO ((51 * 8) - 1) ' lees het woord
FOR Y% = 24 TO 31 ' AANTALLEN uit
Z% = POINT(X%, Y%) ' het scherm en
IF Z% = 0 THEN ' plaats het
PRESET (ZZ%, YY%), 0 ' verticaal aan de
PRESET (ZZ% + 1, YY%), 0 ' linkerzijde van
END IF ' de Y-as.
ZZ% = ZZ% + 2
IF ZZ% > 31 THEN
ZZ% = 16
YY% = YY% - 1
END IF
NEXT Y%
NEXT X%
Y% = 96 ' start pixel
FOR X% = 1 TO 12 ' 12 maanden
Top% = 152 - ((PerMaand(X%).Totaal * 100) \ MaxMaand&) ' staaf hoogte
LINE (Y% - 4, Top% - 2)-(Y% + 4, Top% + 2), 0, B ' markeer punt.
IF X% > 1 THEN
LINE (VorigeY%, VorigeTop%)-(Y%, Top%), 0 ' teken grafiek
END IF
VorigeY% = Y% ' kopieer
VorigeTop% = Top%
Rij% = (Top% \ 8) - 1 ' Bereken de rij
Kol = Y% \ 8 ' en de kolom.
LOCATE Rij%, Kol% '
Waarde$ = MID$(STR$(PerMaand(X%).Totaal), 2) ' uit record.
PRINT Waarde$; ' toon waarde.
' maak reverse.
GET ((Kol% - 1) * 8, (Rij% - 1) * 8)-(((Kol% + LEN(Waarde$) - 1) * 8) - 1, (Rij% * 8) - 1), Array%(0)
PUT ((Kol% - 1) * 8, (Rij% - 1) * 8), Array(0), PRESET
Rij% = 21 ' bepaal de rij
Kol% = (Y% \ 8) ' en de kolom.
LOCATE Rij%, Kol% '
PRINT MID$(M$, VAL(PerMaand(X%).Maand) * 3 - 2, 3); ' print maand.
' maak reverse.
GET ((Kol% - 1) * 8, (Rij% - 1) * 8)-(((Kol% + 2) * 8) - 1, (Rij% * 8) - 1), Array%(0)
PUT ((Kol% - 1) * 8, (Rij% - 1) * 8), Array(0), PRESET
Y% = Y% + 40
NEXT X% ' verhoog start pixel
I$ = ""
DO
I$ = INKEY$
LOOP UNTIL I$ = CHR$(32)
SCREEN 0
END SUB
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.
ELSE
PRINT
PRINT "Bestand "; dbFile$; " niet gevonden ..."
END
END IF
END SUB