dubbele gegevens contrtole bij invoer

Status
Niet open voor verdere reacties.

RSpan

Gebruiker
Lid geworden
10 jun 2009
Berichten
166
Beste forumleden

Na veel zoek en probeer werk kom ik er toch niet uit.
Ik wil bij invoer van gegevens dat er aangegeven wordt wanneer gegevens dubbel worden ingevoerd.
Leek me niet zo ingewikkeld maar zelfs met een eenvoudige query voor weergave van dubbele gegeven gaat het fout.:(
Situatie is als volgt:
Tabel rooster, hier worden o.a. de volgende gegevens ingevoerd:
Naam cliënt
Naam freelancer
Datum
Uren
En nog een aantal zaken die hier niet van belang zijn.
Wat ik nu wil is dat er na invoer van uren gekeken wordt of de tot nu toe ingevoerde gegevens niet al voorkomen in de tabel. Dus bij gebeurtenisprocedure after_update()
Ik heb het geprobeerd om met een query voor het zoeken naar dubbele gegevens, te kijken of ik dan iets kon doen met de SQL code maar bij het uitvoeren van de query kloppen de gegevens niet.

Een freelancer kan op één dag twee verschillende diensten draaien dus mag er alleen dan een mededeling van dubbele gegevens komen als niet alleen de “naam” en “datum” gelijk zijn maar ook het aantal “uren”.
Vb.
Piet,12-12-2009, 7
Piet,12-12-2009, 1
Zijn geen dubbele gegevens
Jan,10-10-2009,7
Jan,10-10-2009,7
Zijn wel dubbel en nu moet er dus een melding komen “dubbele gegevens”

Heeft iemand een idee/aanwijzing
Misschien met Dlookup of toch SQL

ik heb het volgende geprobeerd:

Code:
Private Sub Uren_AfterUpdate()
Dim strSQL As String


strSQL = "SELECT Voornaam,uren,datum FROM TblRooster "
strSQL = strSQL & "WHERE Voornaam = '" & Me.FreelancerID & "' "
strSQL = strSQL & "AND uren = '" & Me.Uren & "' "
strSQL = strSQL & "AND datum = #" & CDate(Me.Datum) & "# "

 With CurrentDb.OpenRecordset(strSQL)
     If .RecordCount > 0 Then
          MsgBox "Dit record bestaat al"
     Else
       '(Weet ik nog niet, moet ik nog uitzoeken, eigenlijk moet er niets gebeuren je moet gewoon verder kunnen gaan met het invullen van de gegevens in de volgende velden)
     End If
 End With

End Sub

ik krijg nu de foutmelding:
"er zijn te weinig parameters. Het verwachte aantal is 1"

En de volgende regel wordt dan geel gekleurd.

"With CurrentDb.OpenRecordset(strSQL)"


Iemand enig idee waar het fout gaat?:(

Groet
René:thumb:
 
Laatst bewerkt:
Je controleert het veld uren (numeriek verwacht ik) met een string value
Code:
strSQL = "SELECT Voornaam,uren,datum FROM TblRooster "
strSQL = strSQL & "WHERE Voornaam = '" & Me.FreelancerID & "' "
strSQL = strSQL & "AND uren =" & Me.Uren
strSQL = strSQL & "AND datum = #" & CDate(Me.Datum) & "# "

Overigens kun je dat ook zo schrijven:
Code:
strSQL = "SELECT Voornaam,uren,datum FROM TblRooster " & _
               "WHERE Voornaam = '" & Me.FreelancerID & "' " & _
               "AND uren =" & Me.Uren & _
               "AND datum = #" & CDate(Me.Datum) & "# "
 
Je controleert het veld uren (numeriek verwacht ik) met een string value
Code:
strSQL = "SELECT Voornaam,uren,datum FROM TblRooster "
strSQL = strSQL & "WHERE Voornaam = '" & Me.FreelancerID & "' "
strSQL = strSQL & "AND uren =" & Me.Uren
strSQL = strSQL & "AND datum = #" & CDate(Me.Datum) & "# "

Overigens kun je dat ook zo schrijven:
Code:
strSQL = "SELECT Voornaam,uren,datum FROM TblRooster " & _
               "WHERE Voornaam = '" & Me.FreelancerID & "' " & _
               "AND uren =" & Me.Uren & _
               "AND datum = #" & CDate(Me.Datum) & "# "



Ik krijg nog dezelfde fout melding .



Code:
Private Sub Uren_AfterUpdate()
Dim strSQL As String

strSQL = "SELECT Voornaam,uren,datum FROM TblRooster "
strSQL = strSQL & "WHERE Voornaam = '" & Me.FreelancerID & "' "
strSQL = strSQL & "AND uren =" & Me.Uren
strSQL = strSQL & "AND datum = #" & CDate(Me.Datum) & "# "


 With CurrentDb.OpenRecordset(strSQL)
     If .RecordCount > 0 Then
          MsgBox "Dit record bestaat al"
     Else
          'het record opslaan
     End If
 End With

End Sub

"er zijn te weinig parameters. Het verwachte aantal is 1"

En de volgende regel wordt dan geel gekleurd.

"With CurrentDb.OpenRecordset(strSQL)"


Kan iemand me verder helpen?

Alvast bedankt
René


Ik heb het probleem gevonden :Dmaar weet nog niet de oplossing:(
Het probleem zit in het veld Voornaam, dit is een opzoek veld, de gegevens die hier ingevuld worden (geselecteerd) komen uit een andere tabel.
Deze worden dus niet herkend
Hoe kan ik de formule aanpassen zodat deze wel de invoer, die in het veld Voornaam is geselecteerd, herkent .


In de tabel Rooster staat de volgende verwijzing bij rijbron naar de tabel Freelancer.

SELECT TblFreelcrs.iFreelancerID, TblFreelcrs.Voornaam, TblFreelcrs.Achternaam, TblFunctie.Functie FROM TblFunctie INNER JOIN TblFreelcrs ON TblFunctie.FunctieID=TblFreelcrs.FunctieID ORDER BY TblFreelcrs.Voornaam;



Groet
René
 
Laatst bewerkt:
Het verbaast me niks dat je een probleem hebt met Voornaam; dat was het eerste dat mij opviel. De keuzelijst die je gebruikt zal een PersoonsID opzoeken; blijkbaar sla je in de tabel Rooster het veld Voornaam op? Dat zou ik absoluut in die tabel veranderen.... Het is een gevaarlijk veld om op te fitleren, want de kans dat je twee Jannen als freelancer krijgt, lijkt mij niet denkbeeldig... Waarom niet koppelen op het veld FreelancerID? Want ik neem toch aan, dat je die koppeling wel zult willen maken tussen Rooster en Freelancers...
In de regel is het zo, dat je altijd een sleutelveld uit de hoofdtabel terug laat komen in de tabel met gerelateerde gegevens (Rooster in dit geval).
Tweede (mogelijke) probleem: Een sql maakt gebruik van Amerikaanse datumnotatie. Het kan dus zijn dat je 4-6-2010 vergelijkt met 6-4-2010 en dat die check dan overeenkomt.... Wat je veel beter kunt doen, is de datum converteren naar een getal, en vervolgens in de query terugvertalen naar een datum.

Je krijgt dan dit:
Dim dtDatum AS Date
Dim iDatum AS Double
dtDatum=CDate(Me.Datum)
iDatum=CDbl(dtDatum)

strSQL = "SELECT FreelancerID, Uren,Datum FROM TblRooster" & VbCrLf
strSQL = strSQL & "WHERE FreelancerID = " & Me.FreelancerID & VbCrLf
strSQL = strSQL & "AND Uren =" & Me.Uren & VbCrLf
strSQL = strSQL & "AND Datum = CDate(" & iDatum & ") "
 
Het verbaast me niks dat je een probleem hebt met Voornaam; dat was het eerste dat mij opviel. De keuzelijst die je gebruikt zal een PersoonsID opzoeken; blijkbaar sla je in de tabel Rooster het veld Voornaam op? Dat zou ik absoluut in die tabel veranderen.... Het is een gevaarlijk veld om op te fitleren, want de kans dat je twee Jannen als freelancer krijgt, lijkt mij niet denkbeeldig... Waarom niet koppelen op het veld FreelancerID? Want ik neem toch aan, dat je die koppeling wel zult willen maken tussen Rooster en Freelancers...
In de regel is het zo, dat je altijd een sleutelveld uit de hoofdtabel terug laat komen in de tabel met gerelateerde gegevens (Rooster in dit geval).
Tweede (mogelijke) probleem: Een sql maakt gebruik van Amerikaanse datumnotatie. Het kan dus zijn dat je 4-6-2010 vergelijkt met 6-4-2010 en dat die check dan overeenkomt.... Wat je veel beter kunt doen, is de datum converteren naar een getal, en vervolgens in de query terugvertalen naar een datum.

Je krijgt dan dit:
Dim dtDatum AS Date
Dim iDatum AS Double
dtDatum=CDate(Me.Datum)
iDatum=CDbl(dtDatum)

strSQL = "SELECT FreelancerID, Uren,Datum FROM TblRooster" & VbCrLf
strSQL = strSQL & "WHERE FreelancerID = " & Me.FreelancerID & VbCrLf
strSQL = strSQL & "AND Uren =" & Me.Uren & VbCrLf
strSQL = strSQL & "AND Datum = CDate(" & iDatum & ") "


Dank Michel voor je uitleg en inbreng.:thumb:
ik heb echter nog wel twee vragen.
Ik probeer altijd zoveel mogelijk te begrijpen wat er gebeurt in de formule opdat ik er ook iets van leer.:)
In jouw formule begrijp ik niet waar “VbCrLf” voor staat, wat betekent het en wat doet het, Wil je me dat uitleggen?

En dan zit ik nog met het volgende:
Met de TAB toets spring je van veld naar veld om vervolgens de gegevens in te vullen.
Wanneer ik het veld uren verlaat dan gaat de controle op dubbele invoer werken, is die ok (geen dubbele geg.) dan spring je naar het volgende veld.
Is het niet ok dan geeft hij de melding dubbele geg.
Vervolgens klik je op ok of drukt op Enter maar dan spring je naar het volgende veld maar ik wil in het zelfde veld blijven.
Ik dacht met focus maar dat werkt niet.:(

Code:
With CurrentDb.OpenRecordset(strSQL)
     If .RecordCount > 0 Then
          MsgBox "Dubbele gegevens"
          Me.Uren.SetFocus    
    End If
End With

Hoe kan ik dat bewerkstelligen?
 
Het laatste is niet zo een-twee-drie aan te geven; het commando Setfocus doet normaal niet zoveel bijzonders. Je kunt er niks op instellen. Als de focus dus niet op het aangegeven veld komt te staan, dan is dat meestal omdat er na het commando nog iets gebeurt op het formulierveld. Zoals je al had gezien, zijn er verschillende momenten dat er acties kunnen worden uitgevoerd. Een hoop acties zie je niet, maar gebeuren op de achtergrond. Ik vermoed dus, dat na het Setfocus commando er nog iets anders op het formulier wordt gedaan. Zowiezo heb je al een tabtoets ingedrukt, om naar het volgende veld te gaan. Wanneer dat gebeurt, weet ik eigenlijk ook niet helemaal, maar het zou dus kunnen, dat dat gebeurt nadat je de focus handmatig op het veld Uren hebt gezet. Dus: je zet de focus op het veld Uren, maar er volgt nog een commando: voer de tabtoets uit. Gevolg: de focus ligt alsnog op het verkeerde fout!
Om alles in de hand te houden, zou je de check dus ook kunnen leggen op de <Enter> gebeurtenis van het volgende veld. Oftewel: je voert alles in, gaat naar het volgende veld en dáár doe je de check op de dubbele waarden.

Wat betreft het commando VbCrLf: het plaatst een Regeleinde in de sql code. Ik zet dat er meestal bij om te voorkomen dat woorden aan elkaar worden geplakt, waardoor het commando niet meer werkt.
Zoals in dit voorbeeld:

strSQL = strSQL & "WHERE FreelancerID = " & Me.FreelancerID
strSQL = strSQL & "AND Uren =" & Me.Uren

De tekst in de querystring zou nu zijn: WHERE FreelancerID = 12AND Uren =4

strSQL = strSQL & "WHERE FreelancerID = " & Me.FreelancerID & VbCrLf
strSQL = strSQL & "AND Uren =" & Me.Uren

In mijn variant:
WHERE FreelancerID = 12
AND Uren =4

Het eerste voorbeeld geeft een foutmelding, de tweede werkt! De fout wordt veroorzaakt door 12AND. Dit wordt gezien als één woord; er ontbreekt namelijk een spatie tussen 12 en AND. Je kunt het overigens ook oplossen door overal spaties tussen de sleutelwoorden te zetten, maar ik vind dit netter.

Om SQL strings te testen zet ik vaak de volgende opdracht onder de opgebouwde strSQL:

Dim tmp
tmp=Inputbox("","",strSQL)

Je krijgt hiermee een Inputbox, met de daadwerkelijke sql die je op hebt gebouwd. Deze kopieer je vervolgens naar Kladblok bijvoorbeeld, waarna je de inputbox sluit, en de rest laat doorlopen.
Als de hele handel niet blijkt te werken (bijvoorbeeld omdat er een fout in de sql zit) kun je de gekopieerde tekst in een nieuw te maken query zetten, en kijken waar hij een fout geeft. Soms zie je het gelijk aan de syntax van het resultaat, bijvoorbeeld als er haakjes of spaties ontbreken.
 
Het laatste is niet zo een-twee-drie aan te geven; het commando Setfocus doet normaal niet zoveel bijzonders. Je kunt er niks op instellen. Als de focus dus niet op het aangegeven veld komt te staan, dan is dat meestal omdat er na het commando nog iets gebeurt op het formulierveld. Zoals je al had gezien, zijn er verschillende momenten dat er acties kunnen worden uitgevoerd. Een hoop acties zie je niet, maar gebeuren op de achtergrond. Ik vermoed dus, dat na het Setfocus commando er nog iets anders op het formulier wordt gedaan. Zowiezo heb je al een tabtoets ingedrukt, om naar het volgende veld te gaan. Wanneer dat gebeurt, weet ik eigenlijk ook niet helemaal, maar het zou dus kunnen, dat dat gebeurt nadat je de focus handmatig op het veld Uren hebt gezet. Dus: je zet de focus op het veld Uren, maar er volgt nog een commando: voer de tabtoets uit. Gevolg: de focus ligt alsnog op het verkeerde fout!
Om alles in de hand te houden, zou je de check dus ook kunnen leggen op de <Enter> gebeurtenis van het volgende veld. Oftewel: je voert alles in, gaat naar het volgende veld en dáár doe je de check op de dubbele waarden.

Wat betreft het commando VbCrLf: het plaatst een Regeleinde in de sql code. Ik zet dat er meestal bij om te voorkomen dat woorden aan elkaar worden geplakt, waardoor het commando niet meer werkt.
Zoals in dit voorbeeld:

strSQL = strSQL & "WHERE FreelancerID = " & Me.FreelancerID
strSQL = strSQL & "AND Uren =" & Me.Uren

De tekst in de querystring zou nu zijn: WHERE FreelancerID = 12AND Uren =4

strSQL = strSQL & "WHERE FreelancerID = " & Me.FreelancerID & VbCrLf
strSQL = strSQL & "AND Uren =" & Me.Uren

In mijn variant:
WHERE FreelancerID = 12
AND Uren =4

Het eerste voorbeeld geeft een foutmelding, de tweede werkt! De fout wordt veroorzaakt door 12AND. Dit wordt gezien als één woord; er ontbreekt namelijk een spatie tussen 12 en AND. Je kunt het overigens ook oplossen door overal spaties tussen de sleutelwoorden te zetten, maar ik vind dit netter.

Om SQL strings te testen zet ik vaak de volgende opdracht onder de opgebouwde strSQL:

Dim tmp
tmp=Inputbox("","",strSQL)

Je krijgt hiermee een Inputbox, met de daadwerkelijke sql die je op hebt gebouwd. Deze kopieer je vervolgens naar Kladblok bijvoorbeeld, waarna je de inputbox sluit, en de rest laat doorlopen.
Als de hele handel niet blijkt te werken (bijvoorbeeld omdat er een fout in de sql zit) kun je de gekopieerde tekst in een nieuw te maken query zetten, en kijken waar hij een fout geeft. Soms zie je het gelijk aan de syntax van het resultaat, bijvoorbeeld als er haakjes of spaties ontbreken.

Geweldig bedankt,:thumb::thumb: helemaal duidelijk, nu weet ik ook waar het fout ging.:D
Niet door de datum maar door het aan elkaar voegen van de gegevens.
Ik heb weer veel geleerd, :D :D nogmaal hertelijk dank Michel:thumb:

Groet
René
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan