Zie ook elders op deze site:
|
Hebt u inhoudelijke vragen over Access die u niet in deze teksten beantwoord ziet, stel deze dan bij een van de volgende forums: http://office.webforums.nl/forum/, http://www.helpmij.nl/forum of http://forums.breekpunt.nl/. U krijgt meestal dezelfde dag nog een helder antwoord van een van de deelnemers. | ||
In deze tekst:
|
|
In Access komen de Eigenschappen van formulieren en rapporten voor een deel overeen. Waar dit handig is, beschrijft deze tekst de eigenschappen van zowel formulieren als rapporten. Zie Access rapporten voor meer informatie over rapporten en rapporttypen.
In deze tekst worden de volgende begrippen besproken:
Formulieren zijn bedoeld om gegevens in te voeren, maar ook om grafieken te tonen of om een menu te maken. Op het formulier plaatst u een aantal besturingselementen. In Access kunt u kiezen uit onder andere de besturingselementen tekstvakken, labelvakken, keuzelijsten, aankruisvakjes. U kunt per besturingselement vele eigenschappen vastleggen en voor het formulier de tabvolgorde van de besturingselementen bepalen.
Rapporten zijn afdrukvoorbeelden van diverse overzichten en tabellen. De gegevens voor het rapport haalt u uit tabellen of query's.
Formulieren en rapporten in Access zijn opgebouwd uit besturingselementen, die elk een eigen toepassing hebben. De belangrijkste ziet u hier:

In een Label-vak plaatst de programmeur vaste tekst, u kunt niets invoeren.
Een label-vak kan wel als een knop zijn ingesteld: door te klikken op de tekst activeert u een bepaalde actie, bijvoorbeeld het openen van een formulier. U kunt de tekst van een labelvak desgewenst ook verticaal plaatsen (tekst loopt van onder naar boven).
In een Tekst-vak (voorbeeld: Naam) kunt u tekst en/of getallen invoeren. Een tekstvak is meestal gekoppeld aan een veld in de onderliggende tabel of query van het formulier.
In een Keuzelijst met invoervak (voorbeeld: Code) kunt u een keuze uit een lijst kiezen óf een vrije tekst invoeren. (U kunt ook instellen dat de gebruiker alleen uit de lijst mag kiezen.) De tekst die u typt is zelf-aanvullend: na elke letter die u typt vult Access het veld aan met de passende keuze uit de keuzelijst.
In een Keuzelijst (voorbeelden: Keuzelijst1 en Keuzelijst2) kunt u alleen kiezen uit een aantal mogelijkheden. Een keuzelijst kan meer regels tonen, zoals in Keuzelijst1, of slechts één regel, zoals in Keuzelijst2: Wijk. Typ een of meer keren de eerste letter of het eerste cijfer van de keuze om de keuze te maken. In een Keuzelijst moet u altijd een keuze maken. Alleen als de tekst in wit op zwart getoond wordt hebt u een keuze gemaakt. De programmeur kan instellen dat u in een keuzelijst meer dan een items mag kiezen.
Een Knop-vak is een vak waarop u kunt klikken om een actie uit te voeren. U kunt in een formulier knop-vakken tegenkomen met een afbeelding (bijvoorbeeld een afbeelding van een deur of van een printer) of met een tekst.
In een Keuzevak met keuzerondjes kunt u slechts één van de keuzerondjes aanklikken.Zodra u een van de rondjes aanklikt, zet Access de andere rondjes direct 'uit'.
In een Aankruisvakje (voorbeeld: Deelnemer) kunt u per vakje iets aan- of uit zetten. U kunt om tussen deze twee standen te wisselen de linker muisknop of de spatiebalk gebruiken.
In de balk onder dit formulier ziet u de Record-kiezer, waarmee u naar een ander record kunt gaan.
De teller geeft alleen het aantal te tonen records aan, bij formulieren waarbij u alleen nieuwe records kan maken, begint de teller van de recordkiezer op 0, u ziet dus niet hoeveel records er al in de tabel staan. Met de F5-toets springt u snel naar de teller.
Veel tips en voorbeelden voor uw formulierontwerp leest u in de tekst Formulierontwerp.
Bij Access XP en hogere versies kunt u gebruik maken van Draaitabel- en Draaigrafiek formulieren. Deze worden ook in Excel gebruikt. Een Draaitabel is een tabel waarin gegevens handig gegroepeerd en getotaliseerd zijn op door uzelf in te stellen niveau's. Een draaigrafiek is een grafische weergave van een draaitabel. De weergave van zowel een draaitabel als een draaigrafiek kan door de gebruiker aangepast worden, bijvoorbeeld door het maken van een andere selectie van de gegevens, een andere groepering of wijzigen van een lijngrafiek in een staafgrafiek. De gebruiker kan deze aanpassingen in de weergegeven tabel of grafiek doen, hij of zij hoeft hiervoor niet het formulierontwerp aan te passen. De draaigrafiek past zich ook automatisch aan aan de grootte van het weergavevenster.
Voorbeeld: u bent manager van een meldkamer en houdt een tabel bij voor het aantal meldingen per kwartier van de dag. In deze tabel of query staan de velden Jaar, Maand, Dag, Tijd, Soort_melding, Aantal_meldingen. In een draaitabel kunt u het aantal Meldingen groeperen en totaliseren per Jaar (pagina) en dan per Maand en per Soort_melding, maar u kunt ook een draaitabel maken die bijvoorbeeld het aantal meldingen per Uur van de dag per Soort_melding laat zien. In een Draaigrafiek kunt u dit grafisch weergeven: op de horizontal as toont u het kwartier van de dag, op de verticale as het gemiddeld aantal meldingen per dag en elke lijn in het grafiekwerkblad geeft het aantal meldingen van een maand aan.
Klik op de afbeelding om deze te vergroten
Wanneer u de waardes van een Keuzelijst of Keuzelijst met invoervak gewijzigd hebt, dan zult u vaak de Keuzelijst weer bij moeten werken, voordat u deze nieuwe waardes ziet. U kunt dit doen door bij de gebeurtenisprocedure Bij focus op te nemen dat u het veld opnieuw moet berekenen (requery):
Private Sub cboKeuzelijst_GotFocus():
cboKeuzelijst.Requery
End Sub
U kunt er ook functie in een algemene module van maken, en deze iedere keer oproepen als u de focus op het Keuzelijstje met invoervak hebt. Dat scheelt u per keuzelijstje heel wat klik- en typwerk. Ga naar het tabblad Module, maak een nieuwe module en schijf hier de volgende regels in:
Function fReq()
CodeContextObject.ActiveControl.Requery
End Function
U roept deze functie op door bij de Gebeurtenis Bij focus van de keuzelijst met invoervak te schrijven:
=fReq()
U kunt knoppen op uw formulier maken en achter elke knop een van de onderstaande drie acties plaatsen:
|
Het starten van een Macro: zet bij de Gebeurtenis Bij klikken de naam van de macro. |
|
Het starten van een stukje programmacode: kies bij de Gebeurtenis Bij klikken voor een Gebeurtenisprocedure en maak de gebeurtenisprocedure aan. |
|
Het oproepen van een functie: zet bij de Gebeurtenis Bij klikken een =-teken gevolgd door de naam van de functie met de ( ) er bij: =fNaarEerste() |
U kunt geen subroutines starten, wel kunt u het starten van een subroutine opnemen in de programmacode van de knop:
Private Sub cmdKnop1_Click()
Call Mijn_subroutine
End Sub
Wanneer u een waarde uit een tabel wilt halen en deze tabel is niet de bron van het formulier, dan kunt u dit op twee manieren doen:
|
Wijzig de bron van het formulier in een query, waarin de andere tabel en de betreffende velden uit die tabel wel zijn opgenomen, of: |
|
Gebruik functies als =DLookUp() om de waarde uit de andere tabel te halen. DLookUp() heeft de volgende opbouw: |
Voorbeeld: Bereken de waarde van het veld txtAchternaam in de programmacode van het formulier, txtID_Naam is de naam van het veld ID_Naam op het huidige formulier.
txtAchternaam = DLookup("[Achternaam]", "[tblNaam]", "[ID_Naam] = " & [txtID_Naam])
U kunt de functie ook bij de eigenschap Gegevensbron van een veld op een formulier opnemen. In de formulier- en rapporteigenschappen en in query's gebruikt u een ; als scheidingsteken:
=DLookup("[Achternaam]"; "[tblNaam]"; "[ID_Naam] = " & [txtID_Naam])
2. Het is sterk aan te raden om de naam van het veld op het formulier niet gelijk te maken aan de naam van de bron van het veld.
Voorbeeld: als u op een formulier een veld hebt dat als bron het veld ID_Naam heeft, geeft u dit veld de naam txtID_Naam. In functies zoals DLookUp() die verwijzen naar dit formulierveld is het dan duidelijk dat u naar het veld verwijst wat op dat moment op het actieve formulier getoond wordt en niet naar de waarden van het veld van de onderliggende tabel of query van dat formulier. Dit is met name van belang omdat u vaak zult verwijzen naar een veld op een formulier dat nog niet opgeslagen is. Het onderliggende veld in de tabel of query is dan nog niet bijgewerkt en is dus anders dan het zichtbare veld op het formulier.
3. Let op bij het opstellen van de voorwaarde: als u een vergelijking maakt tussen twee tekstwaarden, dan zet u de te vergelijken waarde tussen enkele aanhalingstekens, bij een vergelijking tussen twee numerieke waarden plaatst u geen enkele aanhalingstekens:
|
Vergelijking van twee numerieke waarden: |
|
Vergelijking van twee teksten: |
4. Als u geen spaties of - of andere leestekens (behalve _ ) gebruikt in de veldnamen of tabel- of querynamen, dan kunt u de [ ] weglaten:
=DLookup("Achternaam"; "tblNaam"; "ID_Naam = " & txtID_Naam)
Naast DLookUp() heeft Access ook de volgende, vergelijkbare functies:
|
DCount() (tel het aantal waardes) |
|
DMin(), DMax() (laagste / hoogste waarde) |
|
DFirst(), DLast() (eerste / laatste waarde in een gerangschikte lijst) |
|
DAvg() (gemiddelde), DStDev() (standaarddeviatie) |
|
DSum() (optelling). |
Zie de Help van Access voor de uitleg van deze functies of de webpagina http://www.mvps.org/access/general/gen0018.htm.
Als u op een formulier gegevens hebt ingevuld of gewijzigd en u op basis van dit formulier bijvoorbeeld een rapport wilt afdrukken, dan moet u het formulier eerst verversen, zodat de gegevens verwerkt zijn. U kunt dat als volgt doen: neem in de programmacode van de knop die het rapport oproept, de regel Me.Dirty = False op. Met deze opdracht slaat u de gegevens van het formulier op, voordat u het rapport oproept.
Voorbeeld: u hebt op uw formulier een knop met de naam cmdRapport_factuur die het rapport rptRapport_factuur oproept. De programmacode van deze knop wordt dan:
Sub cmdRapport_factuur_OnClick()
Me.Dirty = False
DoCmd.OpenReport "rptRapport_factuur"
End Sub
U kunt vanaf elk formulier een ander formulier of een rapport openen met de volgende code:
DoCmd.OpenForm "frmnaam", weergave, filter, Where-voorwaarde
DoCmd.OpenReport "rptnaam", weergave, filter, Where-voorwaarde
Weergave: Als weergave kunt u kiezen voor een formulierweergave, een weergave als gegevensblad (vergelijkbaar met een tabel) of een weergave in de ontwerp-modus. In het formulier zelf kunt u bepalen of het formulier als een enkelvoudig formulier of als een doorlopend formulier (alle records onder elkaar) moet worden weergegeven.
Filter of Where-voorwaarde: Wilt u alle records in het formulier of het rapport weergeven, laat dan het filter en de Where-voorwaarde weg. Wilt u slechts enkele records weergeven, geef dan óf een filter, óf een Where-voorwaarde aan.
|
Als filter kunt u een query opgeven die een selectie is van de volledige query van het formulier. |
|
Als Where-voorwaarde geeft u bijvoorbeeld aan, aan welke voorwaarde een bepaald veld van de tabel of query achter het te openen formulier moet voldoen: |
"ID = " & Me!txtID ' bij numerieke vergelijking
"Naam = '" & Me!txtNaam & "'" ' bij vergelijking tussen teksten (strings)Me.txtID en Me!txtNaam verwijzen naar het veld txtID en txtNaam op het huidige (Me) formulier.
Let ook hier weer op bij het opstellen van de voorwaarde: als u een vergelijking maakt tussen twee tekstwaarden, dan zet u de te vergelijken waarde tussen enkele aanhalingstekens, bij een numerieke vergelijking plaatst u geen enkele aanhalingstekens. Plaats tussen de eerste " en de ' en tussen de laatste ' en de " geen spatie: die spatie wordt dan namelijk meegenomen met de vergelijking.
Voorbeelden:
Wilt u op een formulier met een knop cmdRapport_Factuur het hele rapport rptRapport_Factuur tonen, dan zet u de volgende code bij de Gebeurtenis Bij klikken van de knop cmdRapport_Factuur:
Sub cmdRapport_factuur_OnClick()
Me.Dirty = False
DoCmd.OpenReport "rptRapport_factuur"
End Sub
Wilt u alleen het rapport van één record tonen, dan neemt u een voorwaarde op in de opdrachtregel. In onderstaand voorbeeld wordt alleen het rapport van het record getoond met het ID_Factuur nummer dat gelijk is aan die van het veld txtID_Factuur op het huidige formulier:
Sub cmdRapport_factuur_OnClick()
Me.Dirty = False
DoCmd.OpenReport "rptRapport_factuur", , , "ID_Factuur = " & txtID_Factuur
End Sub
Bij een niet-numeriek veld moet u dit tussen ' ' zetten:
Sub cmdRapport_factuur_OnClick()
Me.Dirty = False
DoCmd.OpenReport "rptRapport_factuur", , , "Achternaam = '" & txtIAchternaam & "'"
End Sub
Wilt u het openen van een rapport in een functie zetten, die u overal kunt oproepen, dan kunt u in de functie met CodeContaxtObject (zie verderop in deze tekst) verwijzen naar het formulier waar de knop staat om het rapport te openen:
Function fReport(strNaam As String, Optional strCriteria As String)
'code om een rapport te openen, eventueel met een Filter óf met Where-voorwaarden
On Error GoTo Err_fReport
'eerst het formulier verversen
CodeContextObject.Dirty = False
'dan rapport tonen, eventueel met gefilterde records
'zet een extra , tussen acViewPreview en strCriteria, omdat u geen Filter gebruikt
DoCmd.OpenReport strNaam, acViewPreview, , strCriteria
Exit_fReport:
Exit Function
Err_fReport:
Resume Exit_fReport
End Function
Op het formulier zelf zet u bij de desbetreffende knop bij de gebeurtenis Bij klikken de volgende regel:
=fReport("rptRapport_Factuur"; "ID_Factuur = " & txtID_Factuur)

Als u het hele rapport wilt tonen, zonder filter, dan laat u de optionele voorwaarde weg:
=fReport("rptRapport_Factuur")
Het voordeel van deze werkwijze is dat u geen Gebeurtenisprocedure voor elke Gebeurtenis hoeft te maken, u zet deze opdrachtregel direct achter de Gebeurtenis Bij klikken. Hierdoor is deze opdrachtregel onafhankelijk van de naam van de knop. U kunt de knop kopiëren naar een andere formulier of een andere naam geven, zonder dat u de opdrachtregel hoeft aan te passen. In de programma's die op vanaf deze site kunt downloaden is dit veelvuldig toegepast.
U kunt in de programmacode op verschillende manieren verwijzen naar een formulier of rapport.
|
U kunt verwijzen naar het formulier of rapport waar de programmacode in staat met Me. Voorbeeld: Me.txtFormulierveld.Visible = False maakt het tekstveld txtFormulierveld op het huidige formulier onzichtbaar. |
|
Als u vanuit een formulier een ander formulier opent, kunt u verwijzen naar het actieve formulier met Screen.ActiveForm. |
|
U kunt ook het formulier of rapport aanwijzen met Forms!formuliernaam of Reports!rapportnaam. Het formulier of rapport moet dan wel eerst geopend zijn! |
|
Weet u nog niet de formulier- of rapportnaam omdat deze in een variabele bepaald wordt, zet dan de variabelenaam tussen ronde haakjes: |
|
U kunt in een module een algemene (Public) functie maken en met CodeContextObject verwijzen naar het object (formulier, rapport enz.) waar deze functie van toepassing is. |
|
U kunt naar het actieve veld of de gekozen knop verwijzen met ActiveControl. |
|
Binnen een formulier kunt u met Screen.PreviousControl.SetFocus de focus op het laatst gekozen Besturingselement zetten. U gebruikt dit bijvoorbeeld als u bij een klik op een knop terug wilt gaan naar het laatste gekozen tekstveld, keuzelijstje of ander element. |
|
Wilt u vanaf het hoofdformulier of hoofdrapport naar een veld op een subformulier of subrapport verwijzen, gebruik dan de objectverwijzing Form. of Report. (enkelvoud!), voorafgegaan door de naam van het subformulier of subrapport. Voorbeeld: Me.txtHoofdfrmveld = Me.sfrmSubfrm.Form.txtSubfrmveld wijzigt de waarde van het veld txtHoofdfrmveld van het huidige (Me) hoofdformulier in de waarde van het tekstveld txtSubfrmveld op het subformulier sfrmSubfrm. |
|
U kunt ook naar het actieve subformulier verwijzen, zonder dat u de naam van het subformulier weet. Het subformulier is een besturingselement op het actieve formulier. U verwijst dus eerst naar het actieve formulier (Screen.ActiveForm) en dan naar het actieve besturingselement (ActiveControl) op dat formulier. Voorbeeld: de naam van het actieve subformulier achterhaalt u met de verwijzing Screen.ActiveForm.ActiveControl.Form.Name |
|
Wilt u vanaf een subformulier of subrapport naar een veld op het hoofdformulier of hoofdrapport verwijzen, dan kunt u gebruik maken van de relatieve objectverwijzing Parent. |
U kunt met programmacode instellen of u records in het formulier mag wijzigen. Enkele voorbeelden:
Me.AllowAdditions = True ' toevoegen van records toestaan
Me.AllowEdits = True ' wijzigingen toestaan
Me.AllowDeletions = True ' verwijderen van records toestaan
Me.DataEntry = False ' u opent het formulier met een bestaand record. Als u Me.DataEntry op True zet dan kunt u alleen records toevoegen en geen bestaande records bekijken of wijzigen.
Bij Me.DataEntry = True zet u meestal Me.AllowAdditions ook op True, zodat u de nieuw ingevoerde records nog wel kunt wijzigen. Als u Me.AllowEdits op False hebt staan, dan kunt u alleen nieuwe records invoeren en deze niet meer wijzigen, zodra u het record verlaten hebt.
U kunt op vergelijkbare wijze tekstvelden, groepsvakken ed. vergrendelen of beschikbaar maken:
Me.txtVeldnaam.Locked = True ' veld is vergrendeld
Me.txtVeldnaam.Enabled = True ' veld is wel ingeschakeld
Me.txtVeldnaam.Visible = True ' veld is wel zichtbaar
Wilt u de wijzigingsinstellingen voor een subformulier instellen, verwijs dan eerst naar het subformulier met naamsubformulier.Form:
Me.sfrmFormulier.Form.AllowEdits = False ' u kunt niets wijzigen in het subformulier sfrmFormulier
Een mooie manier om het mogelijk te maken dat een gebruiker records in het formulier wel of niet mag wijzigen, is door het type recordset aan te passen waarop het formulier gebaseerd is. De recordset is de verzameling van records (gegevens) die samen de bron van het formulier vormen. Er zijn binnen Access enkele soorten recordsets:
|
Een Momentopname (Snapshot) is een eenmalige momentopname van de records. U kunt de records alleen bekijken en niet wijzigen, toevoegen of verwijderen. |
|
Een Dynaset is een dynamische opname van de records. U kunt records wijzigen, toevoegen en verwijderen: alle wijzigingen worden direct in de tabel of query doorgevoerd. |
Een formulier is standaard gebaseerd op een dynamische recordset, zie de Eigenschappen van het formulier >> tabblad Gegevens >> Type recordset.
Als u niet wilt dat de gebruiker iets kan wijzigen in de records, zet dan het Type recordset op Momentopname. U kunt wel keuzelijstjes gebruiken op het formulier om records te zoeken, de zoek-keuzelijstjes veranderen immers niets aan de onderliggende records.
U kunt ook met programmacode wisselen tussen een Dynamische recordset (waarde = 0) of een Momentopname (waarde = 2). Voorbeeld uit de Help van Access: om het formulier bij het openen op Alleen lezen te zetten als de gebruiker geen Beheerder is: plaats de volgende code bij de Gebeurtenis Bij openen:
Sub Formulier_Openen(Cancel As Integer)
Const conSnapshot = 2
If gstrGebruikersID <> "BEHEERDER" Then
Forms!Medewerkers.RecordsetType = conSnapshot
End If
End Sub
conSnapshot is een zelf gekozen naam van een constante (een variabele met een vaste waarde), dat in dit voorbeeld de waarde 2 krijgt. U kunt ook het cijfer 2 invullen op de plaats van conSnapshot, maar door deze constante te gebruiken wordt uw programmacode beter leesbaar.
In programma's zoals Inlogmenu (zie elders op deze site) wordt gebruik gemaakt van de functie fInBevoegd() om te kijken of de gebruiker bepaalde rechten heeft. Bij een Beheerder geeft de functie fInBevoegd("B") de waarde Yes / -1 terug als de gebruiker een Beheerder is, anders geeft de functie de waarde No / 0 terug. U gebruikt deze functie als volgt in een formulier om alleen de Beheerders toe te staan het formulier te wijzigen. Zet het Type recordset van het formulier standaard op Dynaset en zet bij de Gebeurtenis Bij openen de volgende programmacode:
Sub Formulier_Openen(Cancel As Integer)
Const conSnapshot = 2
If fInBevoegd("B") = 0 Then
' B = in InlogMenu: de letter voor een Beheerder in de bevoegdhedenfunctie
Forms!Medewerkers.RecordsetType = conSnapshot
End If
End Sub
Als u op een formulier een subformulier hebt staan, dan worden de records in dit subformulier niet vergrendeld. U kunt het subformulier met bijvoorbeeld .Locked vergrendelen (zie hiervoor) of de recordset van het subformulier ook op het type Momentopname zetten.
|
Als uw programmma in een oudere Nederlandstalige versie van Access (2.0 of 97) gemaakt is en u in die versie de Opbouw-functie gebruikt hebt, dan heeft Access de Nederlandse namen Formulieren!... , Formulier!, en Rapport!... opgenomen in de programmacode of expressie. Vertaal deze termen altijd in het Engelstalige Forms, Form, Reports en Report, omdat de Nederlandse termen in andere taalversies van Access niet herkend worden. |
|
In de Nederlandstalige versie van Access gebruikt u in formulieren, rapporten en queries in functies zoals DLookup() de ; om gegevens te scheiden, maar in programmacode (en in de Engelstalige versie van Access ook in formulieren enz.) gebruikt u de , om gegevens te scheiden. Voorbeeld: Formulieren, query's: In de Eigenschappen van het besturingselement txtAchternaam van het formulier frmNaam berekent u de waarde van het veld txtAchternaam met de volgende functie: =DLookup("[Achternaam]"; "[tblNaam]"; "[ID_Naam] = " & [txtID_Naam]) Programmacode: In de programmacode van het formulier of in een Module berekent u deze waarde met de volgende functie: |
|
|
|
U gebruikt een . tussen twee gereserveerde woorden van Access en als het tweede woord een eigenschap of actie is op het eerste woord. U gebruikt een ! als scheidingsteken tussen een gereserveerd woord van Access en een naam die u zelf heeft gegeven, dus van een variabele. Voorbeeld: Screen.ActiveForm![txtMijnVeld].SetFocus |
|
U kunt meer over formulieren in Access lezen bij Formulieren uit AdresMenu, Andere formulieren uit AdresMenu en bij Ontwerpen van formulieren en menu's. |
|
Lees verder bij Access rapporten. |