B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
B3-cursus Practicumopdracht 6
Diverse zaken (vervolg) rond MS Access Inhoud: • het linken van andere tabellen (minder: importeren; ook Copy/Paste); ook dBase-bestanden ed • SQL-actiequeries (vooral: DELETE-FROM-WHERE / UPDATE-SET-WHERE) • het gebruik van de ‘keuzelijst-met-invoerveld’
6.1. Het via ‘Externe gegevens ophalen’ importeren van objecten of koppelen (‘linken’) van andere gegevenstabellen aan je database We tonen in bijgaande figuur een deel van het MS Access-File-menu, met daarbij het submenu bij ‘Externe gegevens ophalen’. We zien daarbij dat je blijkbaar data [N.B. maar ook andersoortige ‘objecten’ zoals Forms e.d.!] kunt importeren (d.w.z.: uit een andere database in je eigen database kopiëren), maar ook dat je [via ‘Link Tables’] blijkbaar externe gegevenstabellen kunt koppelen [zonder ze in je eigen database op te slaan]. Uit de MS Access-Help halen we hierover: Gegevens importeren of koppelen U kunt in Microsoft Access tabelgegevens vanuit andere Microsoft Access-databases importeren, evenals gegevens uit andere programma's en met andere bestandsindelingen, zoals Microsoft Excel, dBASE, Microsoft FoxPro of Paradox. U kunt ook HTML-lijsten en -tabellen (alleen-lezen) importeren of koppelen. Deze tabellen en lijsten kunnen zich op uw lokale computer, op een netwerkserver of op een Internet-server bevinden. Als u gegevens importeert, wordt er in een nieuwe tabel in de Microsoft Access-database een kopie van de informatie gemaakt. De brontabel of het bronbestand wordt hierdoor niet gewijzigd. Als u gegevens koppelt, kunt u de gegevens in de externe gegevensbron lezen en in de meeste gevallen bijwerken zonder deze te importeren. De bestandsindeling van de externe gegevensbron wordt hierdoor niet gewijzigd. U kunt het bestand dus nog steeds gebruiken in het programma waarin het oorspronkelijk is gemaakt, en u kunt gegevens toevoegen, verwijderen of bewerken met behulp van Microsoft Access. In Microsoft Access worden gekoppelde tabellen en tabellen die in de actieve database zijn opgeslagen, met verschillende pictogrammen weergegeven. Als u het pictogram van een gekoppelde tabel verwijdert, wordt alleen de koppeling naar de tabel verwijderd en niet de externe tabel zelf.
N.B. Let in het getoonde figuurtje erop, dat je dus ook gegevenstabellen uit een andere MS Access database kunt koppelen. Dat biedt onder andere de mogelijkheid om je gegevens(tabellen) ergens (bijvoorbeeld op een centrale netwerkserver) in een database te plaatsen en je toepassingen (met Forms, Reports e.d.) in een aparte database op een (op het netwerk aangesloten) pc op je bureau. En dus ook om met meerdere gebruikers vanaf verschillende pc’s gegevens te gebruiken die in zo’n aparte ‘kale’ database (met dus alleen gegevens) zijn opgeslagen. Ook kun je in een bedrijfsomgeving met verschillende databases werken, waarbij in de ene database bijvoorbeeld klantgegevens, in een andere artikelgegevens en in een andere financiële gegevens bijgehouden worden. [Vaak zal men in een wat grotere organisatie financiële gegevens toch ietwat gescheiden van andere gegevens willen bewaren.] Een groot voordeel van dit gescheiden bewaren van een ‘gegevenstabellen’-deel en een applicatie-deel is ook, dat binnen de organisatie met bestaande applicaties doorgewerkt kan worden, terwijl men (al dan niet elders) het applicatie-deel aan het aanpassen is tot een volgende versie. Als die volgende versie
1
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
klaar is, hoeft die maar geïnstalleerd te worden en kan gelijk daarna gebruikt worden om gegevens van het tabellendeel mee te gaan verwerken.
Bij de implementatie van ‘de casus’ wordt vereist, dat je het data-gedeelte en het ‘toepassingsgedeelte’ in aparte MS Access-databases plaatst! Dat ‘splitsen’ is een zovaak gebruikte aanpak, dat er zelfs een aparte menu-optie voor is. Uit de MS Access-Help halen we: U kunt ook tabellen uit andere Microsoft Access-databases koppelen, bijvoorbeeld een tabel uit een Microsoft Access-database in een gemeenschappelijk netwerk. Dit is bijzonder handig als u alle tabellen in één database op een netwerkserver opslaat, terwijl formulieren, rapporten en andere objecten zich in een aparte database bevinden die door de gemeenschappelijke gebruikers wordt gekopieerd. Met behulp van de vervolgopdracht Database splitsen (opdracht Invoegtoepassingen in het menu Extra) kunt u een bestaande database gemakkelijk in twee databases splitsen. Met deze procedure wordt een database gesplitst in twee bestanden: een bestand met de tabellen en een bestand met de query's, formulieren, rapporten, macro's en modules. Op deze manier kunnen gebruikers die de gegevens nodig hebben hun eigen formulieren, rapporten en andere objecten maken terwijl het netwerk één enkele gegevensbron bevat. 1. Wijs naar Invoegtoepassingen in het menu Extra en klik vervolgens op Database splitsen. 2. Volg de instructies in de dialoogvensters Database splitsen. Bij activeren van deze ‘Database splitsen’-optie verschijnt eerst het hiernaast getoonde scherm. Na klikken op de button ‘Split Database’, wordt in een vervolg-dialoogvenster gevraagd aan te geven waar de ‘Back-end database’ moet komen te staan en hoe die moet heten (gesuggereerd wordt de zelfde naam met achteraan ‘_be’ toegevoegd) . . . en na een klik op de OK-button wordt tenslotte [hopelijk] gemeld dat het splitsen succesvol is verlopen. Als je daarna terug gaat naar je database-venster, dan zie je daar bij het tab-blad Tabellen, dat alle tabellen nu gekoppeld zijn . . . en bij verdere controle blijken alle Forms, Reports, Queries e.d. allemaal nog op dezelfde wijze aanwezig te zijn èn gewoon te functioneren; kortom: ze halen nu hun gegevens uit de ‘andere database’ waar de werkelijke gegevenstabellen in opgeslagen zijn. Indien gekoppelde tabellen naar een andere directory of schijf e.d. worden verplaatst, is het mogelijk namen en/of paden aan te passen. Dat kan via Extra/Invoegtoepassingen/Koppelingsbeheer. Voer deze procedure uit om koppelingen te bekijken of te vernieuwen als de structuur of locatie van een gekoppelde tabel is gewijzigd. Koppelingsbeheer geeft de paden van alle gekoppelde tabellen weer. De procedure voor dit ‘Koppelingen bekijken of vernieuwen’ is als volgt: 1 Open de database die koppelingen met tabellen bevat. 2 Wijs Invoegtoepassingen aan in het menu Extra en klik vervolgens op Koppelingsbeheer. 3 Schakel het selectievakje in van de tabellen waarvan u de koppelingen wilt vernieuwen. 4 Klik op OK om de koppelingen te vernieuwen.
Over ‘importeren’ halen we uit de MS Access-Help: U kunt ook andere databaseobjecten dan tabellen importeren, zoals formulieren of rapporten uit een andere Microsoft Access-database.
Bij het aanklikken van de menu-optie Bestand/Externe gegevens ophalen/Importeren, moeten we eerst aangeven van waar we die gegevens willen ophalen. Als we daarbij kiezen voor een MS Access-database, dan verschijnt (na klikken rechts-‘onder’op de knop ‘Opties’) het volgende op een ‘database-venster’-lijkende dialoogvenster. Via tab-bladen is te kiezen uit het soort objecten wat je wilt importeren. Als je kiest voor ‘Tabellen importeren’ kun je via radio buttons beneden aangeven of het je alleen om de structuur te doen is, of dat je behalve de structuur ook de in die tabel zittende gegevens
2
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
wilt importeren. N.B. Mocht je [om wat voor reden dan ook] een gekoppelde tabel willen vervangen door een ‘echt in de database opgenomen tabel’, dan kun je dat doen door eerst de ‘link’ te verwijderen en daarna die tabel te importeren.
Kopieëren van objecten van de ene database naar de andere via Edit/Copy/Paste Ook via Edit/Copy/Paste zijn allerlei objecten van de ene MS Access-database naar de andere over te halen. Als we bijvoorbeeld in het database-venster van de ene database bij Forms een bepaald Form selecteren en het ‘Copy’-commando geven, vervolgens die database sluiten en in een andere database het ‘Paste’-commando, dan wordt het Form [inclusief de eventueel bijbehorende code uit een klasse(!)module] in die tweede database gekopieerd (er wordt wel nog naar een [al dan niet nieuwe] naam gevraagd. Indien we op deze (Copy/Paste-) manier tabellen van de ene naar de andere database willen overhalen (vraag: wanneer zou je zoiets willen doen?), dan verschijnt na het ‘Paste’-commando een dialoogvenster, waarin gevraagd wordt of je alleen de tabelstructuur of ook de gegevens wilt ‘plakken’, of dat je ‘te plakken gegevens’ wilt toevoegen aan een bestaande tabel (waarvan je dan de naam bovenin het dialoogvenster bij tabelnaam moet invullen)! (Ga voor jezelf eens na, wanneer je die laatste optie zinvol zou kunnen gebruiken.)
Practicumopdracht 6.a
Koppelen van externe tabellen / importeren queries e.d.
Oefen nu voor jezelf met het koppelen aan je ‘huidige database’ van bijvoorbeeld de ‘Student’-tabel uit de ‘Studentenadministratie’-database van practicumopdracht 1 over SQL. Kijk hoe je kunt werken met zo’n gekoppelde gegevenstabel (stel er bijvoorbeeld een SQL-vraag aan) en probeer of het mogelijk is de structuur van die gekoppelde tabel te veranderen. Importeer uit die ‘Studentenadministratie’database ook een aantal [daar opgeslagen] Queries op die ‘Student’-tabel en kijk of het uitvoeren daavan (door activeren binnen je huidige database!) op specifieke problemen stuit (en los die problemen zonodig op). Experimenteer ook eens met Copy/Paste van database-objecten. Verwijder daarna weer de koppeling en de queries uit je database! N.B. Van dit onderdeel hoef je dus niks ‘blijvends’ in te leveren; het gaat hier alleen om het ervaring/inzicht met deze fenomenen opdoen.
6.2. SQL-actiequeries
[DELETE / UPDATE / INSERT]
Behalve SQL-SELECT-queries [voor het opvragen van gegevens uit de database] bestaan er ook SQLopdrachten waarmee het mogelijk is databasegegevens te wijzigen [waar we hier ook ‘verwijderen’ en ‘toevoegen’ onder verstaan]. In MS Access worden deze ‘wijzig’-SQL-commando’s zogenaamde actiequeries genoemd. De syntax voor de verwijderings- en de verander-actiequeries (op tabellen!) zijn: Verwijderen: DELETE FROM [tabelnaam] WHERE
Veranderen: UPDATE [tabelnaam] SET [kolomnaam1] = <waarde1> , [kolomnaam2] = <waarde2> , ... WHERE
Uiteraard kunnen we ook ‘verwijder’ en ‘verander’-commando’s op gegevens in record/dynasets laten werken en de wijzigingen daarna laten doorvoeren in de achterliggende gegevenstabel(len). Indien we zulke [normaal gesproken: zeer snel uit te voeren] actiequeries rechtstreeks op tabellen willen laten uitvoeren (meestal zal dat zijn als we in één operatie méér dan één record willen verwijderen/veranderen), dan kunnen we dat zoals in het volgende voorbeeld getoond ook in VBA via een QueryDef realizeren. Uiteraard moeten we dan géén ‘Openrecordset’ of iets in die trant gebruiken (we willen geen gegevens tonen, maar wijzigen) en moeten daarom de QueryDef-methode ‘Execute’ gebruiken.
3
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
Het voorbeeld gaat over het via het hiernaast getoonde Form laten verwijderen van alle opnames uit een bepaalde (via de keuzelijst te selecteren) categorie. We hebben hier voor een ‘doorlopend’ formulier gekozen (met een koptekst- en een voettekst-deel). De keuzelijst linksonder is gebaseerd op alle mogelijk voorkomende muziek-categoriën (via een SELECT-query). De voor een ‘klik’-gebeurtenis aan de ‘Verwijderknop’ gehangen code is: Private Sub VerwijderKnop_Click() Dim db As Database Dim OnzeActieQuery As QueryDef Dim Selectiecriterium As String Forms!Verwijderformulier!OpnameKeuzelijst.SetFocus ‘ om te verwijzen naar een waarde ‘ of methode van een formulier-element moet dat eerst ‘de focus krijgen’ Selectiecriterium = Forms!Verwijderformulier!OpnameKeuzelijst.Text Set db = CurrentDb Set OnzeActieQuery = db.CreateQueryDef ( "", _ "Parameters Waarde String; DELETE FROM Opnames WHERE [Music Category ID] = Waarde") OnzeActieQuery.Parameters!Waarde = Selectiecriterium OnzeActieQuery.Execute OnzeActieQuery.Close Forms!Verwijderformulier.Requery End Sub
Practicumopdracht 6.b
‘ niets ‘tonen’ maar verandering doorvoeren! ‘ om getoonde overzicht te ‘verversen’
Actiequery: verwijder alle leden uit één plaats.
Pas de voorgaande aanpak toe om een formulier [zoals hiernaast getoond] te implementeren, waarbij het mogelijk is om via een keuzelijst van (‘distinct’) plaatsnamen via een druk op de knop alle leden uit de geselecteerde plaats via een actiequery te verwijderen. N.B. Als je tussen de ‘betalingen’-tabel en de ‘leden’-tabel een relatie hebt gelegd (met ‘lidnr’ in de betalingentabel als ‘vreemde sleutel verwijzing’ naar ‘lidnr’ van de ledentabel) en je daarbij opgegeven hebt, dat ‘referentiële integriteit’ moet worden afgedwongen, dan wordt het je terecht(!) niet toegestaan om de leden uit die plaats te verwijderen, die in de betalingen-tabel een [naar hen verwijzend] record hebben zitten. MS Access maakt hier uit zich zelf géén melding van en als je niet terdege de werking van je formulier op allerlei situaties uit test, dan kom je hier niet achter en zit er dus een grove fout in je applicatie! Suggestie: probeer een elegante oplossing voor dit probleem te verzinnen en doe dit liefst in overleg met de ontwerpers binnen je projectgroep om ook hen met deze problematiek kennis te laten maken.
6.3. Keuzelijst met invoervak met ‘niet-in-lijst’-optie In de vorige practicumopdracht (5) waren we bij het werken met combo-boxes beperkt tot het kiezen van een van de bestaande (en in de combo-box getoonde) waarden. Vaak willen we dat werken echter flexibeler maken, door ook nieuwe waarde toe te staan. We hebben het dan over een zogenaamde ‘keuzelijst-met-invoervak’ die je kunt zien als een combinatie van een keuzelijst en een tekst-invoerveld. Zo’n keuzelijst-met-invoervak is op het ‘Werkset’/Toolboxschermpje te vinden aan de linker kant, direct ónder de radio button.
4
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
We halen allereerst uit de MS Access-Help: Moet ik een keuzelijst maken of een keuzelijst met invoervak? Als u moet kiezen tussen het maken van een keuzelijst of een keuzelijst met invoervak, dan moet u eerst bepalen hoe u het besturingselement in het formulier wilt weergeven en hoe dit waarschijnlijk gebruikt zal worden. Elk van beide besturingselementen heeft bepaalde voordelen: • Voordelen van een keuzelijst. De lijst wordt altijd weergegeven en de waarde van het besturingselement is beperkt tot de alternatieven in de lijst. Als u snel naar de eerste waarde wilt gaan die met een bepaalde letter begint, dan typt u de desbetreffende letter. Als u het formulier gebruikt om gegevens in te voeren en te bewerken, kunt u geen waarde toevoegen die niet in de lijst staat. • Voordelen van een keuzelijst met invoervak. Het besturingselement gebruikt minder ruimte op het formulier, omdat de lijst alleen wordt weergegeven als u deze opent. Als u snel een waarde in de lijst wilt zoeken, dan kunt u de eerste letters van de waarde in het invoervak typen. U kunt ook bepalen of een willekeurige waarde kan worden ingevoerd of alleen de waarden die in de lijst staan. Keuzelijsten met invoervak: wat het zijn en hoe ze werken Vaak is het selecteren van een waarde in een lijst sneller en gemakkelijker dan het onthouden en typen van een waarde. Bij een keuzelijst met invoervak kunt u beide doen, zonder dat er veel ruimte wordt gebruikt op het formulier. Een keuzelijst met invoervak is een combinatie van een tekstvak en een keuzelijst. Als u tekst invoert of een waarde selecteert in een afhankelijke keuzelijst met invoervak, wordt de ingevoerde of geselecteerde waarde ingevoegd in het veld waarvan de keuzelijst met invoervak afhankelijk is.
Het lijstgedeelte van een keuzelijst met invoervak bestaat uit rijen gegevens. De rijen kunnen één of meer kolommen bevatten, die met of zonder kolomkoppen worden weergegeven. Als een keuzelijst met invoervak waarvan de keuzelijst uit meerdere kolommen bestaat, afhankelijk is, worden de waarden uit een van de kolommen opgeslagen. Met een niet-afhankelijke keuzelijst met invoervak kunt u een waarde opslaan die u in een ander besturingselement wilt gebruiken. Met een niet-afhankelijke keuzelijst met invoervak kunt u bijvoorbeeld het aantal waarden in een andere keuzelijst met invoervak of in een aangepast dialoogvenster beperken. Ook kunt u een niet-afhankelijke keuzelijst met invoervak gebruiken om een record te zoeken op basis van de geselecteerde waarde in de keuzelijst met invoervak. Keuzelijsten met invoervak hebben een eigenschap Alleen lijst waarmee u kunt bepalen of een willekeurige waarde in de lijst mag worden ingevoerd of alleen tekst die overeenkomt met een van de waarden in de lijst. Als er voldoende ruimte is op het formulier en u wilt dat een lijst altijd wordt weergegeven of u wilt de gegevensinvoer altijd beperken tot de waarden in de lijst, dan kunt u wellicht beter een keuzelijst gebruiken in plaats van een keuzelijst met invoervak.
In de figuur hiernaast is via een ‘keuzelijst-met-invoervak’ een aangepaste reactie [en dus functionaliteit] getoond van het in die opdracht 5 besproken Form voor het toevoegen van nieuwe opnames. Ons ‘categorieën’-aanbod was daar immers wel érg beperkt en we willen in dit scherm nu ook nieuwe categorieën kunnen toevoegen. Hoe implementeren we dit gedrag? Indien we de gebruiker de mogelijkheid willen geven ook een andere waarde in te voeren dan de aangeboden keuze-waarden uit een ‘keuzelijst-met-invoervak’, dan moeten we in het Eigenschappen/Gegevens-tabblad de eigenschap ‘Alleen lijst’ op ‘Nee’ zetten. Een willekeurige ingetikte waarde [die voldoet aan de eventueel ingevulde ‘validatieregel’] wordt dan geaccepteerd. Een vervelend punt is wel, dat we dan zeer waarschijnlijk als ‘rijbron’ een query als: “SELECT DISTINCT [Music Category ID] FROM Opnames” moeten gebruiken, die bij een gegevenstabel met veel records niet erg efficiënt zal zijn.
5
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
Hoe maken we dit efficiënter? We halen daarvoor uit de Help: The NotInList event occurs when the user enters a value in the text box portion of a combo box that isn't in the combo box list. This event enables the user to add a new value to the combo box list. The LimitToList property must be set to Yes for the NotInList event to occur. The NotInList event doesn't trigger the Error event. The NotInList event occurs for combo boxes whose LimitToList property is set to Yes, after you enter a value that isn't in the list and attempt to move to another control or save the record. The event occurs after all the Change events for the combo box.
Kortom: als we zoals eerder getoond een (fout)melding willen veroorzaken als we een niet tot de aangeboden keuzemogelijkheden behorende waarde intikken, dan moeten we in Eigenschappen/Gegevens de optie ‘Alleen lijst’ op ‘Ja’ zetten en de optredende ‘fout’ afvangen. Dat eist wat meer programmeerwerk, maar heeft ook als voordeel, dat we efficiënt de lijst-waarden kunnen baseren op een aparte gegevenstabel (waardoor we op een aparte Categorieën-tabel een eenvoudige SELECT . . . FROM . . . als ‘rijbron’ definiëren, waarbij dat DISTINCT kan weg blijven).
Essentieel is dan ook de wijze waarop de Gebeurtenisprocedures moeten worden ingevuld.
Uit de Help halen we weer: NotInList Event — Event Procedures To create an event procedure that runs when the NotInList event occurs, set the OnNotInList property to [Event Procedure], and click the Build button. Syntax: Private Sub controlname_NotInList(NewData As String, Response As Integer) The NotInList event procedure has the following arguments. Argument Description controlname The name of the control whose NotInList event procedure you want to run. NewData A string that Microsoft Access uses to pass the text the user entered in the text box portion of the combo box to the event procedure. Response The setting indicates how the NotInList event was handled. The Response argument can be one of the following intrinsic constants: Constant Description acDataErrDisplay (Default) Displays the default message to the user. You can use this when you don't want to allow the user to add a new value to the combo box list. acDataErrContinue Doesn't display the default message to the user. You can use this when you want to display a custom message to the user. For example, the event procedure could display a custom dialog box asking if the user wanted to save the new entry. If the response is Yes, the event procedure would add the new entry to the list and set the Response argument to acDataErrAdded. If the response is No, the event procedure would set the Response argument to acDataErrContinue. acDataErrAdded Doesn't display a message to the user but enables you to add the entry to the combo box list in the NotInList event
6
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6
procedure. After the entry is added, Microsoft Access updates the list by requerying the combo box. Microsoft Access then rechecks the string against the combo box list, and saves the value in the NewData argument in the field the combo box is bound to. If the string is not in the list, then Microsoft Access displays an error message. Remarks You can create an event procedure for the NotInList event that provides a way for the user to add a new item to the combo box list. For example, you can add a record to the table that supplies the list's values, or add a value to the value list that is the source for the combo box list. To add a new entry to a combo box list, your event procedure must add the value in the NewData argument to the source of the combo box list. How you do this depends on the type of source the combo box list uses, as determined by the RowSourceType and RowSource properties of the combo box. In the Example in this topic, the event procedure adds the new value to a value list for the combo box. If you let the user change the value originally typed in the combo box (for example, in a custom dialog box), you must set the combo box value to the new entry entered in the custom dialog box. This saves the new value in the field the combo box is bound to. Set the Response argument to acDataErrContinue, and Microsoft Access will add the new value to the combo box list.
In ons voorbeeld is dit als volgt uitgewerkt: Private Sub Categorielijst_NotInList ( NewData As String, Response As Integer ) Dim CategorieSet As Recordset Dim Antwoord As Integer Dim ctl As Control Set CategorieSet = CurrentDb.OpenRecordset("Categorien") ' Control-object ophalen dat wijst naar keuzelijst met invoervak. Set ctl = Me!Categorielijst ' Gebruiker vragen of deze nieuwe waarde wil toevoegen aan lijst. Antwoord = MsgBox("De door U ingevoerde categorie " & NewData & " komt niet in de lijst voor. " & _ Chr(13) & "Wilt U deze categorienaam toevoegen?", vbYesNo, "Categorie toevoegen aan lijst") If Antwoord = vbYes Then ' Argument Response instellen om aan te geven dat element wordt toegevoegd. Response = acDataErrAdded 'In de tabel van de plaatsen het element opslaan CategorieSet.AddNew CategorieSet!Categorie = NewData CategorieSet.Update Else ' Als gebruiker Nee heeft gekozen, foutbericht onderdrukken en wijzigingen ongedaan maken. Response = acDataErrContinue ctl.Undo End If CategorieSet.Close End Sub
Bovendien geven we: Private Sub Categorielijst_Exit ( Cancel As Integer ) If IsNull(Titeltekst) Then MsgBox "Vul ook een titel in!" Titeltekst.SetFocus ElseIf IsNull(Groeptekst) Then MsgBox "Vul ook een groepsnaam in!" Groeptekst.SetFocus Else Bewaarknop.Enabled = True End If End Sub
En: Private Sub Categorielijst_AfterUpdate ( ) Categorielijst.Requery ' uitbreiden categorielijst met nieuwe waarde (‘verversen’) End Sub
7
B3: Systematisch ontwikkelen van eenvoudige informatiesystemen
Practicumopdracht 6.c
Practicumopdracht 6
Ledeninvoer via ‘plaatsen’-keuzelijst met invoervak
Maak een Form waarmee je gegevens van nieuwe leden of mutaties van bestaande leden kunt invoeren. Daarbij moet het plaatsnaamveld via een keuzelijst-met-invoerveld geïmplementeerd zijn en moet het totale Form zich analoog gedragen aan wat eerder in deze handout getoond werd over het aangepaste Form voor het toevoegen van nieuwe opnamegegevens (dus inclusief een reactie van het systeem ‘wil je deze nog onbekende plaatsnaam inderdaad gebruiken . . ?). Werk in je Form zonder ‘recordselectors’ en dus met aparte push buttons voor ‘Bewaar’, ‘Nieuw lid’ en ‘Sluiten’. Gebruik het ‘aan’ en ‘uit’-schakelen van deze buttons voor als je wel/niet bepaalde operaties mag laten plaatsvinden.
Lever je in de (opgeschoonde) database opgeslagen uitwerkingen uiterlijk ten tijde van het volgende B3-werkcollege onder een ‘eigen naam’ in per email naar <[email protected]> ‘Compacteer’ (via Tools/Database Utilities/Compact Database) je database voordat je hem inlevert !!!
8