Voorkomen van dubbele waarde Access

Status
Niet open voor verdere reacties.

Checkagain

Gebruiker
Lid geworden
6 nov 2008
Berichten
17
Een poosje gelden heb ik een database gemaakt. Het werkt uitstekend maar ik mis nog 1 ding, en dat krijg ik niet voor elkaar.

De database heeft 1 hoofdtabel. Via een formulier wordt deze tabel gevuld. Wat ik graag zou willen is dat wanneer iemand het teskt/nummer ingeeft er een waarschuwing komt indien het gelijknummer al bestaat in de tabel. Deze waarde kan echter in meerdere records én kolommen staan. Bijv.

Tekst 1,Tekst 2,Tekst 3 is samen record 1

Indien bij een nieuwe record, dus record 2, opnieuw "tekst 2" ingevuld wordt moet er een foutmelding komen.

Hoop het het een beetje duidelijk is? Moet eigelijk in de hele tabel zoeken volgens mij..
 
Dat kan denk ik alleen maar door een gebeurtenis te maken waarbij je via een recordset van de tabel door de te controleren velden loopt en de inhoud ervan controleert met de ingevoerde tekst.
Niet simpel, wel mogelijk.

Heb je hier hulp bij nodig, dan kan dat uiteraard!

Michel
 
Dat kan denk ik alleen maar door een gebeurtenis te maken waarbij je via een recordset van de tabel door de te controleren velden loopt en de inhoud ervan controleert met de ingevoerde tekst.
Niet simpel, wel mogelijk.

Heb je hier hulp bij nodig, dan kan dat uiteraard!

Michel

Alle hulp is welkom, thx. Is het niet (eenvoudig) mogelijk om via in invoervak in een gedeelte (of de hele) tabel te zoeken dan? Wat jij zegt, is wel wat ik zoek!! Ben geen access held...
 
Laatst bewerkt:
Daar gaat-ie komen dan:
Het gaat om twee stukken code, die je op het formulier moet zetten.
De eerste code zet je op de gebeurtenis <Na bijwerken> van het tekstveld. In de voorbeeldtekst heet dat veld Veldnaam, zal bij jou uiteraard anders zijn.

Code:
Private Sub Veldnaam_AfterUpdate()

    Call LijstVergelijken(Me.[Veldnaam].Value)

End Sub

De code roept niet veel anders op dan onderstaande routine, die ergens op dezelfde VBA pagina moet staan, bijvoorbeeld onder de End Sub van de vorige code.

Code:
Sub LijstVergelijken(temp As String)
Dim rst As New ADODB.Recordset, intI As Integer, intX As Integer
Dim strSQL As String
Dim sLijst() as String
bCheck As Boolean

    strSQL = Me.RecordSource
    If Not Left(UCase(strSQL), 6) = "SELECT" Then
        strSQL = " SELECT * FROM " & strSQL
    End If
    rst.ActiveConnection = CurrentProject.Connection
    rst.Open strSQL, , adOpenStatic, adLockOptimistic
    intI = rst.RecordCount
    intX = rst.Fields.Count - 1
    ReDim Preserve sLijst(intI, intX)
    rst.MoveFirst
        i = 0
    Do While Not rst.EOF
        For x = 0 To intX
            sLijst(i, x) = rst.Fields(x).Value
            If rst.Fields(x).Value = temp Then
                bCheck = True
                Exit Do
            End If
        Next x
        i = i + 1
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing

If bCheck = True Then MsgBox temp & " zit al in de tabel in record " & i + 1 & ", kolom " & x + 1

End Sub

Deze code opent de onderliggende tabel van het formulier. Ik heb hem uitgetest op een onderliggende tabel, en een query, dus hij zou in de meeste gevallen wel moeten werken.
De routine opent de tabel, telt het aantal records en het aantal velden, en loopt vervolgens door het hele zwikkie heen en vergelijkt de waarden uit de velden met de tekst uit het tekstveld, die is meegegeven vanuit de eerste routine.
Als er een match is, wordt de loop afgebroken, en krijg je een melding waar de dubbele waarde zit.

Probeer 'm uit, en laat effe weten of-tie werkt!

Michel
 
Laatst bewerkt:
>>Ben geen access held...

Tja dan wordt het moeilijk!
Maar toch iets simpeler dan hierboven
Code:
Private Sub tVeldNaam_AfterUpdate()
    If fZoekOp(Me!tVeldNaam) Then
        MsgBox "die waarde komt al voor"
    Else
        MsgBox "invoer niet gevonden"
    End If
End Sub

Function fZoekOp(s As String) As Boolean
    Dim fld                      As Object
    With CurrentDb.OpenRecordset("Hier de naam van de betreffende tabel")
        While Not .EOF And Not fZoekOp
            For Each fld In .Fields
                If fld.Value = s Then
                    fZoekOp = True
                    Exit For
                End If
            Next
            .MoveNext
        Wend
    End With
End Function

Om het nog moeilijker te maken de referentie/verwijzing moet ook gezet zijn naar DAO..
 
>>Ben geen access held...

Tja dan wordt het moeilijk!
Maar toch iets simpeler dan hierboven
Code:
Private Sub tVeldNaam_AfterUpdate()
    If fZoekOp(Me!tVeldNaam) Then
        MsgBox "die waarde komt al voor"
    Else
        MsgBox "invoer niet gevonden"
    End If
End Sub

Function fZoekOp(s As String) As Boolean
    Dim fld                      As Object
    With CurrentDb.OpenRecordset("Hier de naam van de betreffende tabel")
        While Not .EOF And Not fZoekOp
            For Each fld In .Fields
                If fld.Value = s Then
                    fZoekOp = True
                    Exit For
                End If
            Next
            .MoveNext
        Wend
    End With
End Function

Om het nog moeilijker te maken de referentie/verwijzing moet ook gezet zijn naar DAO..

Thx. Helemaal gelukt!! Werkt perefect. Als ik een waarde invul die reeds bestaat verschijnt de msg box. Zou je me nog met een klein ding willen helpen? Bovenstaande code geeft ook een melding als het niet niet bestaat "invoer niet gevonden". Dit hoeft niet aangezien er dan steeds ok OK moet worden geklikt. Wat is de juiste code om dit eruit te halen?
 
Dat is heel makkelijk, haal de volgende regels weg:
Code:
    Else
        MsgBox "invoer niet gevonden"

ps. mooi stukje code.
 
Dat is heel makkelijk, haal de volgende regels weg:
Code:
    Else
        MsgBox "invoer niet gevonden"

ps. mooi stukje code.

Ja, dat dacht ik ook. maar toen ik dat deed kreeg ik een foutmelding, iets met nul waarde en foutoporing. Heb het nu nog een sgeprobeerd en lijkt idd wel te werken..

Inderdaad een hele mooi code. Heb er zelf een poosje geleden een halve dag aan gezeten met DLOOPUP functie, maar zonder succes. SUPER!!
 
Laatst bewerkt:
Vraag over de DAO verwijzing

Hallo allemaal,

Kwam dit stuk tegen, omdat ik met een zelfde soort probleem zit. Zag dit stuk code wat tot nu een stuk mooier is als andere dingen die ik tegenkwam.

Zit alleen met het volgende probleem ben nog niet zo heel lang van 2003 naar 2007 over (ik weet het oud en vastgeroest haha), maar heb mijn database overgezet naar een ACCDB, in dit geval werkt, als ik het goed begrepen heb, DAO niet meer toch maar is vervangen door Microsoft Office 12.0 Access database engine Object Library.

Is deze code toch mogelijk met deze referentie ? Want ik krijg tot nu toe een foutmelding

"Fout 3001 Ongeldig Argument"

Blijft hangen op:
If fld.Value = s Then

Komt dit door DAO of het gebrek daarvan.

Alvast enorm bedankt weer !!

Gr.
Bart
 
Maak een nieuwe vraag aan; deze is al een paar jaar oud, opgelost etc.... Bovendien is jouw probleem niet hetzelfde als van TS.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan