Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 
[Het probleem]   [1 Elementaire feiten]   [2 Invoeren in FCO]   [3 IGD]   [4 Beperkingen]   [5 Groeperen]  
[6 VBA-programma aanmaken voor tabellen]   [7 Tabellen laten genereren]   [8 Verder met Access]  

Informatieanalyse, uitwerking van het excursieweek-project (Opgave 14 van hoofdstuk 11).

Informatieanalyse of informatiemodellering houdt in dat je bepaalde gegevens hebt, en je moet er voor zorgen dat die in een database kunnen worden opgeslagen zodat alle benodigde informatie er snel is uit te halen.
Je moet dan dus eerst weten welke tabellen je moet hebben, en welke velden in welke tabellen voorkomen.

Daar heb je een methode voor: FCO-IM (Fully Communication Oriented Information Modelling), dat is de opvolger van de NIAM-methode (Nijssens informatie analyse methode).

Die methode wordt hier aan de hand van het excursieweek-project uitgelegd.

  Het probleem: De organisatie van een excursie in het buitenland.

De vierde klassen HAVO en VWO hebben in mei een meerdaagse excursie.
De ouders en de leerlingen worden hiervan op de hoogte gebracht door middel van een stencil.
Een gedeelte hieruit is als volgt:

De excursieweek valt dit jaar in de week van maandag 12 mei t/m vrijdag 16 mei.
Alle leerlingen uit de klassen vier-havo en 4-vwo kiezen uit één van de volgende bestemmingen: Praag, Parijs, Londen of de Ardennen.
De keuze is vrij maar er is maar een beperkt aantal plaatsen voor elke bestemming.
Op de reis naar Praag kunnen 25 leerlingen mee, en deze reis wordt begeleid door de docenten KCO en PVO (dat zijn de docentcodes).
Op de reis naar Parijs kunnen 40 leerlingen mee, en de begeleiders zijn RFQ, WB en THK.
Op de reis naar Londen kunnen 40 leerlingen mee, en de begeleiders zijn BAN en AWD.
En op de reis naar de Ardennen kunnen 20 leerlingen mee, en de begeleiders zijn LAV, RAD en BUR.

Om te voorkomen dat er iemand tussen wal en schip valt moeten leerlingen een eerste en een tweede voorkeur opgeven.
Omdat de reiskosten nogal uiteenlopen zijn ook de kosten verschillend: Praag kost € 390, Parijs € 420, Londen € 440 en de Ardennen € 360. Bij inschrijving moet een bedrag van € 100 worden betaald, de rest van het bedrag kan in termijnen worden betaald in de periode tot 1 mei.

De bussen naar Praag en Londen vertrekken op maandag 12 mei vanaf het schoolplein om 8.00 uur, die naar Parijs en naar de Ardennen om 9.00 uur.
De bussen worden terugverwacht op vrijdagavond 16 mei: uit de Ardennen en Parijs omstreeks 18.00 uur, uit Londen omstreeks 23.00 uur en uit Praag omstreeks 24.00 uur.

Dit is dus het verhaal dat de leerlingen op stencil mee naar huis krijgen.
Ze krijgen ook nog een aanmeldingsformulier dat ze moeten invullen.
Dat ziet er als volgt uit:

Aanmeldingsformulier excursieweek
Naam:           
Klas:           
Leerlingnummer:           
1e voorkeur:           
2e voorkeur:           

De leiding bepaalt wie er uiteindelijk naar welke bestemming gaat.

De FCO-IM methode toepassen

Die methode werkt als volgt:

  Stap 1: Concrete voorbeelden van alle informatie in elementaire zinnen.

Je moet beginnen met het opstellen van zinnetjes, waarin de gegevens die in de database een rol spelen, voor moeten komen.
Dat moeten elementaire feiten zijn, dus zinnen die je niet kunt splitsen, tenminste niet zonder dat er informatie verloren gaat.
Alle zinnen opschrijven is niet nodig, één of twee zinnen per soort is al genoeg.

Hier de voorbeeldzinnetjes, van elke soort één:

Bas de Graaf heeft llnr 576
llnr 576 zit in klas H4B
llnr 576 heeft als eerste voorkeur Parijs
llnr 576 heeft als tweede voorkeur Londen
De reis naar Praag kost 390 euro
Op de reis naar Praag kunnen maximaal 25 leerlingen mee
De reis naar Praag wordt begeleid door docent KCO
De reis naar Praag vertrekt op 12 mei
De reis naar Praag vertrekt om 9.00 uur
De reis naar Praag komt terug op 16 mei
De reis naar Praag komt terug om 18.00 uur
llnr 576 is ingedeeld voor Parijs
llnr 576 heeft op 28 okt 100 euro betaald

  Stap 2: Het analyseren van de zinnen.

Dat doen we met behulp van het casetool.
Als je bijvoorbeeld het eerste zinnetje -Bas de Graaf heeft llnr 576- wilt invoeren dan doe je dat als volgt:
  • Je klikt op New Expression, en je voert de zin in.
  • Als naam van het feittype voer je in: heeft leerlingnummer, en je klikt op Qualify.
    Zorg er voor dat in de naam van het feittype een werkwoord of persoonsvorm zoals kunnen, heeft, is, vertrekt, komt, wordt zit !!
  • Je selecteert -Bas de Graaf- en als naam van het objecttype voer je in: naam. Daarna klik je op Qualify
  • Je selecteert -llnr 576- en als naam van het objecttype voer je in: persoon. Daarna klik je op Qualify
  • Je klikt op Ready. Dan selecteer je -Bas- en als naam van het labeltype voer je in: voornaam. Daarna klik je op Qualify
  • Dan selecteer je -de- en als naam van het labeltype voer je in: tussenvoegsel. Daarna klik je op Qualify
  • Dan selecteer je -Graaf- en als naam van het labeltype voer je in: achternaam. Daarna klik je op Qualify
    Dan klik je op Ready, net zo lang tot de cursor op -llnr 576- staat
    Als je niet weet hoe je het labeltype zult noemen, zet dan het woord naam of label achter het objecttype !!
  • Dan selecteer je -llnr 576- en als naam van het labeltype voer je in: llnummer. Daarna klik je op Qualify, en dan op Ready. Dan nog eens op Ready, en dan op OK

Bijna alle zinnetjes zijn van het binaire type, dat wil zeggen dat er twee objecten in voorkomen.
Maar er is één ternair feit bij: het laatste zinnetje.
Daar komen drie objecten in voor, namelijk llnr 576 en 28 okt en 100 euro
Als je het laatste zinnetje wilt invoeren, dan doe je dat als volgt:
  • Je klikt op New Expression, en je voert de zin llnr 576 heeft op 28 okt 100 euro betaald in.
  • Als naam van het feittype voer je in: heeft betaald op, en je klikt op Qualify.
  • Je selecteert -llnr 576- en als naam van het objecttype kies je uit: persoon. Daarna klik je op Qualify
  • Je selecteert -28 okt- en als naam van het objecttype voer je in: datum. Daarna klik je op Qualify
  • Je selecteert -100- en als naam van het objecttype voer je in: bedrag. Daarna klik je op Qualify
  • Je klikt op Ready. Dan wordt -llnr 576- automatisch geselecteerd, en als naam van het labeltype wordt aangegeven: leerlingnummer. Klik op Match
    (als je dus een object hebt dat al bij een vorige zin is ingevoerd dan wordt het labeltype automatisch aangegeven en hoef je alleen maar op Match te klikken)
  • Dan selecteer je -28 okt- en als naam van het labeltype voer je in: datumlabel. Daarna klik je op Qualify
  • En tenslotte selecteer je -100- en als naam van het labeltype voer je in: bedraglabel. Daarna klik je op Qualify. Dan twee keer op Ready en dan op OK
Als je alle zinnetjes hebt ingevoerd, en gekwalificeerd dan is het IG (informatie-grammatica) klaar.

Als je de zinnetjes wilt afdrukken dan klik je op Tasks (in de menubalk) en dan op Regenerate Expressions.
Dan moet je het tekstbestand met zinnetjes eerst opslaan; noem dat tekstbestand excursie.txt
En daarna kun je het afdrukken.



  Stap 3: Het maken van het IGD: het informatie-grammaticadiagram.

Je klikt op het icoontje van IGD.
Dan verschijnt er een nieuw, leeg, venster.
Je sleept alle feittypen, objecttypen en labeltypen uit het IG-venster naar het IGD-venster.
Dat kun je één voor één doen, maar je kunt ze ook allemaal tegelijk selecteren en verslepen. Je moet dan bij het selecteren de control-toets ingedrukt houden. (Of de eerste selecteren en de laatste terwijl je de shift-toets ingedrukt houdt)
Daarna kun je tekening nog wat verfraaien door dingen te verslepen.
Soms is het handig om bij een feittype de rollen om te wisselen omdat je anders snijdende lijnen krijgt.
Dat kun je doen door één rol van een feittype te selecteren terwijl je de alt-toets ingedrukt houdt, en die rol dan naar de andere te verslepen. Dan worden ze omgewisseld.

Het IGD van het excursie-IG ziet er als volgt uit:



Als je het IGD wilt afdrukken dan klik je op File (in de menubalk) en dan op Print IGD.
Zet een vinkje voor Fit to page en klik dan op Print.

  Stap 4: Het aanbrengen van de uniciteits- en totaliteits-beperkingen.

Als je dit wilt doen dan moet je het IGD in beeld hebben, en dan moet je eerst even klikken op het icoontje met een U in een cirkel: constraint rollup.
Dan verschijnt het volgende werkbalkje:


Hiervan gebruik je de eerste twee icoontjes.
De eerste (een U in een cirkel) is voor de uniciteits-beperking.
De tweede (een dikke stip in een cirkel) is voor de totaliteits-beperking.

Een persoon kan maar in één klas zitten.
De persoon is bij het feittype -zit in- uniek. Dat geef je aan door boven de rechthoek van persoon een dubbele pijl te zetten.
Dat doe je door die rechthoek te selecteren (houd de control-toets ingedrukt terwijl je er op klikt !) en op het icoontje met de U te klikken.
Je hebt misschien de neiging om de dubbele pijl boven de klas te zetten, omdat een persoon maar in één klas kan zitten, maar dat is verkeerd.
Als je een heleboel zinnetjes van het type -zit in- opschrijft dan krijg je bijv. het volgende:
llnr 500 zit in klas h4a
llnr 501 zit in klas h4b
llnr 502 zit in klas h4a
llnr 503 zit in klas h4c
llnr 504 zit in klas h4c
llnr 505 zit in klas h4b

Elke persoon kan in dit rijtje maar één keer voorkomen, de klas wel vaker.
Daarom is de rol van de persoon bij dit feittype uniek !


Je denkt misschien dat er bij een naam ook maar één leerlingennummer kan horen, maar dat hoeft niet zo te zijn.
Er kunnen op een school best twee leerlingen met dezelfde naam zijn die verschillende leerlingennummers hebben.

Zo breng je alle uniciteitsbeperkingen aan.
Denk er om dat boven een rechthoek in een cirkel (dat hoort bij een objecttype) ook een dubbele pijl gezet moet worden.
En dat er bij elk feittype een dubbele pijl geplaatst moet worden.
Als er geen pijl boven de linker rechthoek moet, en ook niet boven de rechter, dan moet er een dubbele pijl boven de twee rechthoeken samen.


Met het ternaire feittype is iets speciaals:
Als je een aantal zinnetjes van dat feittype opschrijft dan krijg je bijvoorbeeld: llnr 500 heeft op 28 okt 100 euro betaald
llnr 501 heeft op 28 okt 150 euro betaald
llnr 502 heeft op 28 okt 100 euro betaald
llnr 503 heeft op 28 okt 200 euro betaald
llnr 504 heeft op 28 okt 100 euro betaald
llnr 500 heeft op 21 nov 150 euro betaald
llnr 501 heeft op 21 nov 100 euro betaald
llnr 502 heeft op 21 nov 150 euro betaald

Je ziet dat het llnr niet uniek is, de datum is ook niet uniek en het bedrag niet.
Maar de combinatie van llnr en datum is wel uniek.
We gaan er tenminste maar van uit dat een leerling niet twee keer op een dag een betaling zal doen.
Daarom moet er een dubbele pijl boven de combinatie van llnr en datum !

Elke persoon die meegaat op excursie moet wel in een klas zitten.
De persoon voldoet bij het feittype -zit in- aan de totaliteitsbeperking.
Dat geef je aan door bij de rechthoek van persoon een dikke punt te zetten.
Dat doe je door de rechthoek van persoon bij het feittype -zit in- te selecteren (houd de control-toets ingedrukt terwijl je er op klikt !) en op het icoontje met de dikke punt te klikken.

Uniciteitsbeperking betekent eigenlijk: er is maximaal één
Totaliteitsbeperking betekent eigenlijk: er is minstens één

Het IGD zier er na het aanbrengen van de beperkingen als volgt uit:



Als je het IGD wilt afdrukken dan klik je op File (in de menubalk) en dan op Print IGD.
Zet een vinkje voor Fit to page en klik dan op Print.

  Stap 5: Het groeperen van de objecten, het bepalen van de tabellen.

Als je klikt op het GLR-icoontje (GLR=grouping, lexicalizing, reducing) dan gaat het programma controleren of aan alle voorwaarden voldaan is. En als dat het geval is dan worden de tabellen gevormd.
Je krijgt dan eerst het volgende venster:



Als je dan op Run klikt gaat het programma bezig.
Als je niet op alle feittypen en objecttypen een pijl hebt geplaatst krijg je een foutmelding en dan moet je dat eerst veranderen.
Soms krijg je ook nog waarschuwingen, maar daar hoef je je niets van aan te trekken

Als je voor verschillende objecten hetzelfde objecttype gebruikt hebt dan krijg je het volgende venster in beeld:



Bij hokje 11, 14 en 35 had ik elke keer het object met reisbestemming aangegeven.
Bij 11 ging het om de eerste voorkeur, bij 14 om de tweede voorkeur en bij 35 de toegewezen bestemming, zoals bepaald door de leiding.
Het ging dus inderdaad steeds om een reisbestemming.

Maar het programma wil weten hoe de verschillende kolommen, die er mee corresponderen, genoemd moeten worden.
Die kolommen mogen niet dezelfde naam hebben.

Klik op 11 en vul bij column fix in: 1e
En klik op het rondje voor Prefix,
dan wordt het voor de kolomnaam Reisbestemming gezet, en dan wordt het dus 1eReisbestemming.
Klik op 14 en vul bij column fix in: 2e en klik op het rondje voor Prefix.
Klik op 35 en vul bij column fix in: def en klik op het rondje voor Prefix

Bij 25 en 31 was bij beide objecten datum ingevoerd, dat geeft hetzelfde probleem.
Klik op 25 en vul bij column fix in: vertrek en klik op het rondje voor Prefix
Klik op 31 en vul bij column fix in: aankomst en klik op het rondje voor Prefix

Bij 28 en 33 was bij beide objecten tijd ingevoerd, dat geeft ook weer hetzelfde probleem.
Klik op 28 en vul bij column fix in: vertrek en klik op het rondje voor Prefix
Klik op 33 en vul bij column fix in: aankomst en klik op het rondje voor Prefix

Klik dan op OK

En als alles goed gaat dan krijg je een nieuw IGD dat er als volgt uitziet:



Je ziet dat er vier tabellen zijn.
En je ziet ook wat de bijbehorende sleutelvelden zijn.

Hoe heeft het programma dat nu uitgezocht ?

Dat had je zelf ook wel kunnen doen !
Als je in het IGD met de uniciteitsbeperkingen en totaliteitsbeperkingen naar het object persoon in het rondje kijkt, dan zie je dat dat object met een heleboel feittypen is verbonden, en dat bij bijna al die feittypen er een dubbele pijl staat op de rechthoek die verbonden is met persoon.
De objecten die horen bij die feittypen zitten bij elkaar in een tabel.

Het object persoon is ook met het feittype -heeft betaald op- verbonden, maar er staat geen dubbele pijl op de rechthoek die verbonden is met persoon. Daarom vormen de objecten die verbonden zijn met dat feittype een aparte tabel, die bestaat uit de kolommen persoon (llnr), bedrag en betaaldatum.

Als je naar het object reisbestemming in het rondje kijkt, dan zie je dat dat object met een heleboel feittypen is verbonden, en dat bij zes van die feittypen er een dubbele pijl staat op de rechthoek die verbonden is met reisbestemming.
De objecten die horen bij die feittypen zitten ook weer bij elkaar in een tabel.


Dan zijn er nog vier feittypen over, die verbonden zijn met reisbestemming.
Drie van die feittypen, die verbonden zijn met reisbestemming, horen bij objecten die al in de eerste tabel zitten met het sleutelveld persoon.

En dan is er nog één die verbonden is met het feittype -wordt begeleid door-
Dat laatste heeft tot gevolg dat er nog een tabel is waarin alleen docent en reisbestemming zitten.

Wil je wat meer informatie over de tabellen, klik dan op View (in de menubalk) en dan opTable Documentation. En klik in het IG-venster op de naam van de tabel die je wilt bekijken.

Sommigen lopen tegen het probleem op dat het IGD readonly is geworden na een GLR, en dan kun je er niets meer aan veranderen.
Dat het readonly wordt gemaakt na een GLR kun je opheffen door te klikken op:
Options --> Environmentoptions en dan het vinkje voor Undo after Save weg te halen.

  Stap 6: Een programma laten genereren om de database te maken.

Als je klikt op Tasks (in de menubalk) en dan op Plug-in modules



dan krijg je een venster waarin je uit verschillende programma's kunt kiezen.
Kies voor MS-Access 7.0 en klik dan op Invoke.



Geef als naam van het programma dat gemaakt wordt excursie.bas, en kies de map uit waarin het opgeslagen moet worden.



  Stp7: De database laten genereren.

Start nu Access op en kies voor: Een nieuwe database maken en klik op het rondje voor Op basis van een lege database. Klik dan op OK
Geef als bestandsnaam excursie.mdb, en kies de map uit waarin het bestand moet worden opgeslagen.

Klik dan op Invoegen (in de menubalk) en dan op Module.



Klik weer op Invoegen, en dan op Bestand.



Dan verschijnt er een venster waarin je een bestand uit kunt kiezen.
Kies bij bestandstypen voor Basic-bestanden, en zorg er dan voor dat excursie.bas wordt ingelezen.



Dan verschijnt het visual-basic programma dat is aangemaakt met FCO.
Zet de cursor voor de regel: Public Sub FCO_CreateDatabase( )         (zie hieronder)
en klik dan op Uitvoeren (op de menuregel) en dan op Ga naar/Doorgaan.



Als alles is goedgegaan dan zijn nu de tabellen aangemaakt.
Klik de module weg (die hoeft niet bewaard te worden) en klik dan eerst op Queries en dan op Tabellen, en dan staan de tabellen er.
Je moet nog wel even het aantal tekens dat je per veld mag gebruiken aanpassen, want het aantal dat automatisch is aangemaakt is waarschijnlijk te laag.

  Stap 8: De namen en typen in de database aanpassen.

Als de database is aangemaakt dan zijn de namen van de kolommen vaak niet naar wens.
Die kolommen krijgen automatisch de namen van de labels die je hebt gebruikt in FCO. Als je die namen in Access niet goed vindt dan kun je die veranderen.
Ook de namen van de tabellen kun je eventueel veranderen.

Als je op het tabblad tabellen klikt in Access dan krijg je de namen van de tabellen te zien, en die namen kun je daar dan eventueel veranderen (in Access 2003, in Access 2007 wil dat niet)

Als je de naam of het type van een kolom wilt veranderen dan moet je rechtsklikken op de naam van de bijbehorende tabel, en dan moet je (Access 2003) op Ontwerpen klikken, of (Access 2007) op Ontwerpweergave
En dan kun je daar in de linker kolom van het venster de namen van de velden eventueel veranderen.

In de rechter kolom van het venster staan de typen van de velden.
Als de database automatisch is aangemaakt dan is het type van alle velden tekst.
Als het inderdaad tekst is dan laat je dat gewoon staan, maar dan moet je in het venster er onder wel even de Veldlengte veranderen, die is meestal te klein.



Het is niet handig als Bedragen van het type tekst zijn, die kun je beter van het type numeriek maken anders kun je de bedragen niet optellen.

En datums kun je beter van het type datum maken, zodat er bij invoer gecontroleerd wordt of je een bestaande datum invoert.
Als je dat wilt veranderen dan klik je bij een datumveld in de type-kolom (waar Tekst staat), je klikt op het pijltje dat verschijnt en dan kies je datum/tijd uit.
In het onderste venster klik je op Notatie, je klikt op het pijltje dat verschijnt en dan kies je korte datumnotatie uit.

     

En een nummer (leerlingennummer bijv.) moet van het type numeriek zijn.
Als je dat wilt veranderen dan wordt er een foutmelding gegeven omdat er een relatie op dat veld zit.
Dan moet je die relatie eerst verwijderen , dan het type veranderen, en dan de relatie opnieuw aanbrengen.
Je kunt ook het type Autonummering kiezen, dan hoef je de nummers niet zelf in te voeren; als je een nieuwe leerling invoert krijgt die leerling automatisch het volgende nummer dat aan de beurt is.

Als je gegevens wilt invoeren dan open je de tabel of het formulier dat je ervoor hebt gemaakt, en dan kun je op de onderste regel steeds nieuwe gegevens invoeren.

Denk wel om de volgorde waarin je gegevens invoert !
In de excursie-database moet je bijvoorbeeld eerst de reisbestemmingen invoeren.
Als je direkt met de gegevens van de leerlingen wilt beginnen krijg je een probleem: je kunt dan niet de reisvoorkeur invoeren!