Inhoud vorige record als standaardwaarde voor nieuw record

RoVo1211

Gebruiker
Lid geworden
24 feb 2024
Berichten
86
Besturingssysteem
Windows 11
Office versie
Office 365
frm_Speeldata.jpg
Ik ben bezig de wedstrijdkalender van de Nederlandse Bowling Federatie (NBF) om te zetten van een spreadsheet naar een database-formaat.
In sommige velden moet vaak dezelfde waarde komen te staan, zoals in bovenstaand voorbeeld het veld Seizoen.
Hoe krijg ik het voor elkaar om de waarde van het laatste record als standaardwaarde voor het nieuwe record automatisch wordt ingevuld. Ik meen me te herinneren dat ik ook de optie bij de formulier-eigenschappen heb gezien iets van autoherhalen, maar ik kan het niet meer vinden.

Zijn hier oplossingen voor?
 

Bijlagen

  • NMTL.zip
    155,6 KB · Weergaven: 4
Ik zie maar één veld dat in aanmerking komt: seizoen. Dat is zo te zien een keuzelijst, dus zit er waarschijnlijk (hopelijk) een tabel achter (ik heb de bijlage nog niet kunnen bekijken). In die tabel zou je een (ja/nee-) veld op kunnen nemen dat aangeeft of een seizoen al dan niet het huidige seizoen is. Bij het toevoegen van een speeldatum gebruik je dat om het huidige seizoen op te zoeken.
De speelweekdag sla je niet op, want is af te leiden uit de datum.
 
Dit was een voorbeeld, maar ik heb meer tabellen/formulieren waar dit van toepassing kan zijn.
Ook bij het formulier frm_Wedstrijdkalender zal dit handig zijn.
 
Het blijft lastig. In Access kan je nu eenmaal niet simpelweg verwijzen naar het "vorige record". Je kan alleen verwijzen naar records met bepaalde gegevens. In de genoemde voorbeelden zouden de ID's (autonummers) houvast kunnen bieden. Je kan dan voordat je een record toevoegt, de gegevens van het record met het hoogste ID ophalen en die plaatsen in het nieuwe record. Maar ook daar zitten haken en ogen aan.

Ik zou wel iets voor je willen uitwerken, dat heeft alleen zin als je database op orde is en dat is mijns inziens niet het geval.
Eerder noemde ik in relatie tot tbl_Speeldata al de Speelweekdag (afleidbaar uit speeldatum) als overbodig gegeven. Bij nader inzien twijfel ik ook over seizoen versus speeldatum. Een wedstrijd uit 2023 kan immers niet behoren tot het seizoen 24/25. Seizoen is dus waarschijnlijk afleidbaar uit speeldatum.
Ook in de tbl_Wedstrijdkalender zitten redundante gegevens en die horen er dus niet in thuis. Ik noem:
  • Seizoen en Datum; die horen alleen in tbl_Wedstrijdkalender thuis (al twijfel ik of seizoen daar wel in hoort);
  • League; via de tbl_Poules kan je vaststellen over welke League gaat;
  • Lengte (en Patroon?); weet ik niet direct, maar ik kan me voorstellen dat ze bij bowlingcentrum horen.

Kortom: het heeft pas zin om na te denken over het automatisch invullen van gegevens als je scherp hebt over welke gegevens het gaat.

Je oplossing voor de beschikbaarheid kan denk ik ook beter. Ik zou in ieder geval een relatie leggen met de wedstrijddata. In een koppeltabel tussen en wedstrijdleiders zou je kunnen vastleggen welke wedstrijdleiders op een bepaalde datum niet beschikbaar zijn.

Tot slot: als je een relationele database bouwt, dan ligt het voor de hand van meet af aan relaties tussen de tabellen te leggen.

Met alle opmerkingen kom ik tot dit plaatje:
NBF.jpg
 
Het blijft lastig. In Access kan je nu eenmaal niet simpelweg verwijzen naar het "vorige record".
Het gaat er ook helemaal niet om dat je verwijst naar het 'vorige record'; die techniek moet je ook helemaal niet gebruiken. Het is namelijk heel simpel: stel de standaardwaarde in voor de objecten waarvan je de waarde wilt herhalen. En dat is heel simpel te doen. Ik heb in je voorbeeldje even simpel de standaardwaarden ingesteld voor de keuzelijst Seizoen (met de idiote naam Keuzelijst24; waarom niet cboSeizoen zodat je weet waarvoor hij dient?) en het tekstvak Wedstrijddag. De wedstrijddag vul je, als je een andere wilt, handmatig in, en de keuzelijst verander je door te klikken. Dan krijg je de volgende VBA procedures op je formulier om e.e.a. in te stellen

Code:
Private Sub Form_Open(Cancel As Integer)
Dim rs As Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT TOP 1 [Seizoen], [Speeldag] " _
        & "FROM tbl_Speeldata Order By Speeldata_ID Desc")
    With rs
        Me.Keuzelijst24.DefaultValue = rs.Fields(0).Value
        Me.Speeldag.DefaultValue = rs.Fields(1).Value
    End With
End Sub

Code:
Private Sub Keuzelijst24_Click()
    Me.Keuzelijst24.DefaultValue = Me.Keuzelijst24.Value
End Sub

Code:
Private Sub Speeldag_AfterUpdate()
    Me.Speeldag.DefaultValue = Me.Speeldag.Value
End Sub
De rest van het verhaal van Peter gaat mij volledig boven de pet, dus dat laat ik aan hem :).
Wél kan er m.i. één veld weg uit tabel en formulier: het veld [Speelweekdag]. Dat is volgens mij volledig uit het veld [Speeldatum] te halen. En dat voorkomt dus a) dataredundantie en b) foutieve gegevens. Nu kun je probleemloos Zondag invullen, en als speeldatum 3-5-2024. Wat toch écht een zaterdag is. Wat voor nut heeft dat veld dan nog, behalve dat je verkeerde gegevens invult?
 
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan