Dubbele velden vvorkomen.

Status
Niet open voor verdere reacties.

Joost V

Gebruiker
Lid geworden
12 dec 2008
Berichten
23
Hallo,

Stel ik heb een tabel met 4 kolommen, nu mag de inhoud van een veld in kolom1 meerdere keren voorkomen. Dit zelfde geld ook voor kolom2. Kolom 3 en 4 zijn niet van belang.
Nu wil ik graag het volgende: Als de inhoud van een veld in kolom1 in combinatie met de inhoud van een veld in kolom2 (dezelfde rij) al een keer voorkomt dat er een melding komt, omdat dit niet mag.
Kan iemand mij hiermee helpen?

Groet,
Joost
 
De makkelijkste manier is om van de twee velden een sleutelveld te maken; daarmee is het uitgesloten dan je een combinatie twee keer kan opslaan. De foutmelding die je krijgt is niet heel erg fraai, maar kun je op een formulier wel afvangen.
Andere oplossing is dat je op een formulier vóór het opslaan een check laat uitvoeren of de combinatie al bestaat. Dat kan bijvoorbeeld met een query, waarin je beide velden gebruikt, en als criterium bij elk veld het overeenkomende veld uit het formulier. Zodra een combinatie voorkomt, heb je een resultaat in de query van tenminste één record. Je kunt dus met een Count op die query controleren of de Countwaarde 0 is (niet bestaand).
 
Michael,
Sorry voor het late reageren, ik ben er een poosje tussenuit geweest.
Dat met die sleutels heb ik geprobeerd en op zich werkt dat wel alleen heb ik ook een ID wat een primaire sleutel is. Deze is gerelateerd aan andere tabellen en kan ik volgens mij niet verwijderen. Ik kies dus voor de andere oplossing maar daar heb ik wel wat hulp bij nodig. Kun je mij op weg helpen?
Bij voorbaad dank,

Joost
 
Uiteraard geen probleem...
Hier een (heel simpel...) voorbeeldje hoe je het zou kunnen doen.
Op een formulier staat een knop Opslaan. Daar hang je deze gebeurtenis achter:

Code:
Private Sub Opslaan_Click()

With CurrentDb.OpenRecordset("SELECT PersoneelNr, Achternaam FROM tblTabel " _
    & "WHERE (PersoneelNr = " & Me.cboPersNr & " AND Achternaam = '" & Me.txtAchternaam & "')")
    ' Eerst controleren of het record al bestaat...
    If .RecordCount = 0 Then
        iCheck = MsgBox("Wil je opslaan?", vbYesNoCancel)
        If iCheck = 6 Then
            'Hier een actie voor opslaan, bijvoorbeeld:
            strSQL = "INSERT INTO tblTabel " _
            & "( PersoneelNr, Achternaam)" & vbCrLf
            strSQL = strSQL & "VALUES (" & Me.cboPersNr & ", '" & Me.txtAchternaam & "')"
            DoCmd.RunSQL (strSQL)
        ElseIf iCheck = 7 Then
            'Hier een actie voor niet opslaan, bijvoorbeeld formulier sluiten
            DoCmd.Close acForm, Me.Form.Name
        Else
            'Niks doen, op het formulier blijven...
        End If
    End If
    .Close
End With

End Sub

In de regel With CurrentDb.OpenRecordset wordt de tabel met de te controleren waarden geopend. Ik heb in het voorbeeld twee varianten gebruikt: een numeriek veld (PersoneelNr) en een tekstveld (Achternaam). De Where clausule is namelijk verschillend voor de twee.
De opdracht opent dus de tabel, met een filtering op de twee velden die je wilt controleren.
Als een record al bestaat, is de Recordcount groter dan nul. Er is namelijk minstens één record gevonden. (zou overigens niet mogen, hooguit eentje...)
Als de RecordCount dus nul is, bestaat het record niet.
Dan wordt er een SQL string opgebouwd, die alle velden die je wilt opslaan bevat (achter de INSERT INTO tblTabel) , en vervolgens alle waarden die zijn ingevuld van het formulier gebruikt (VALUES (" & Me.cboPersNr & ", '" & Me.txtAchternaam & "')) in het voorbeeld.
Ook hier weer: een numeriek veld doe je anders als een tekstveld.
Vervolgens wordt de query uitgevoerd, en het record dus toegevoegd.
Als je twee keer op de knop drukt, zou het record de tweede keer dus niet mogen worden toegevoegd, omdat de Recordcount dan 1 is.
Kun je hier wat mee?
 
Michael,

Vast wel ik ga er mee aan de gang, maar ben op mijn werk. Kan dus wel even duren.

Groeten,
Joost
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan