MS Access Forum / Forms / May 2008
Check For Existing Record
|
|
Thread rating:  |
ridgerunner - 22 May 2008 17:54 GMT I have a unique index set on two fields in my table, InspDate and StoreNo. I am trying to trap the error of attempting to add a duplicate by having the code below in the LostFocus Event for the InspDate. I am running around in circles. Can someone please help?
Private Sub InspDate_LostFocus() If DMInspections.StoreNo = True Then ElseIf DMInspDet.InspDate = True Then MsgBox "Store and Inspection Date already exist. Please correct" Me.InspDate.SetFocus Else: Me.DMnameID.SetFocus Exit Sub End If End Sub
tia ridgerunner
ruralguy - 22 May 2008 18:08 GMT Usually verification code is placed in the BeforeUpdate event of a control using a Domain function to look for duplicates.
>I have a unique index set on two fields in my table, InspDate and StoreNo. I >am trying to trap the error of attempting to add a duplicate by having the [quoted text clipped - 13 lines] >tia >ridgerunner
 Signature RuralGuy (RG for short) aka Allan Bunch MS Access MVP - acXP WinXP Pro Please post back to this forum so all may benefit.
ridgerunner - 22 May 2008 18:39 GMT Can you please explain "Domain Function".
> Usually verification code is placed in the BeforeUpdate event of a control > using a Domain function to look for duplicates. [quoted text clipped - 16 lines] > >tia > >ridgerunner ruralguy - 22 May 2008 18:58 GMT Either the Dlookup() or DCount() functions as the next post shows.
>Can you please explain "Domain Function". > [quoted text clipped - 3 lines] >> >tia >> >ridgerunner
 Signature RuralGuy (RG for short) aka Allan Bunch MS Access MVP - acXP WinXP Pro Please post back to this forum so all may benefit.
Klatuu - 22 May 2008 19:17 GMT I would recommend using the form BeforeUpdate event. There is no certainty that any control will get the focus. When more than one field, thus more than one control, the testing is more complex and likely to be less accurate.
 Signature Dave Hargis, Microsoft Access MVP
> Usually verification code is placed in the BeforeUpdate event of a control > using a Domain function to look for duplicates. [quoted text clipped - 16 lines] > >tia > >ridgerunner Ryan Tisserand - 22 May 2008 18:23 GMT Here is my solution for multiple field duplication. I first join the two fields in a query. For your example I would do this in a query. NoDuplicates:[InspDate]&""&[StoreNo] Now that you have one field named NoDuplicates to deal with, in the "Before Update" event of InspDate you would use this code
If not IsNull(DLookup("[NoDuplicates]", (YourQueryName), "[NoDuplicates]=" & Forms(YourFormName)![InspDate])) Then MsgBox "Store and Inspection Date already exist. Please correct", vbCritical, "Duplicate Entry" End If Exit Sub
Dont know if this will help but this works for me.
> I have a unique index set on two fields in my table, InspDate and StoreNo. I > am trying to trap the error of attempting to add a duplicate by having the [quoted text clipped - 13 lines] > tia > ridgerunner Douglas J. Steele - 22 May 2008 19:10 GMT Why would you concatenate the fields? (And you've forgotten to concatenate the StoreNo into the argument you're passing to DLookup)
As well, you need to check in the BeforeUpdate of both InspDate and StoreNo, since you can't be sure what order the fields will be filled in. Use a generic function like:
Function DuplicateValue() As Boolean
If IsNull(Format(Forms![YourFormName]![InspDate]) And _ IsNull(Forms![YourFormName]![StoreNo]) = False Then DuplicateValue = (IsNull(DLookup("StoreNo", "[YourTableName]", _ "[InspDate] = " & Format(Forms![YourFormName]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![YourFormName]![StoreNo]) = False) End If
End Function
You can then call that function in the BeforeUpdate event of both controls:
Private Sub InspDate_BeforeUpdate(Cancel As Integer)
If DuplicateValue() = True Then MsgBox "Store and Inspection Date already exist. Please correct", _ vbCritical, "Duplicate Entry" Cancel = True End If
End Sub
Private Sub StoreNo_BeforeUpdate(Cancel As Integer)
If DuplicateValue() = True Then MsgBox "Store and Inspection Date already exist. Please correct", _ vbCritical, "Duplicate Entry" Cancel = True End If
End Sub
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no e-mails, please!)
> Here is my solution for multiple field duplication. I first join the two > fields in a query. For your example I would do this in a query. [quoted text clipped - 33 lines] >> tia >> ridgerunner ridgerunner - 22 May 2008 19:39 GMT Thank you. Can you please tell me where I need to put the Function?
> Why would you concatenate the fields? (And you've forgotten to concatenate > the StoreNo into the argument you're passing to DLookup) [quoted text clipped - 74 lines] > >> tia > >> ridgerunner Douglas J. Steele - 22 May 2008 20:14 GMT Well, you'd put it in the same module as the rest of the code associated with the form.
However, I agree with Klatuu that it probably makes more sense just to put the code in the form's BeforeUpdate event, as opposed to in the BeforeUpdate event of the two text boxes.
Private Sub Form_BeforeUpdate(Cancel = True) Dim strMessage As String
If IsNull(Me.StoreNo) Then strMessage = strMessage & "You must provide a Store Number." & vbCrLf End If
If IsNull(Me.InspDate) Then strMessage = strMessage & "You must provide an Inspection Date." & vbCrLf End If
If Len(strMessage) = 0 Then If IsNull(DLookup("StoreNo", "[YourTableName]", _ "[InspDate] = " & Format(Forms![YourFormName]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![YourFormName]![StoreNo]) = False) Then strMessage = strMessage & "Store and Inspection Date already exist." End If End If
If Len(strMessage) > 0 Then Cancel = True MsgBox strMessage, vbCritical End If
End Sub
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no e-mails, please!)
> Thank you. Can you please tell me where I need to put the Function? > [quoted text clipped - 82 lines] >> >> tia >> >> ridgerunner ridgerunner - 22 May 2008 21:38 GMT I am sorry I missed seeing this earlier. I have the part about making certain that a store and a date are entered covered in a command button on the form.
I copied and pasted the code but I am getting a syntax error message and "IF" through the "THEN" are in red when I run compile.
Private Sub Form_BeforeUpdate(Cancel As Integer) If IsNull(DLookup("StoreNo", "[DMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspection]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo]) = False) Then strMessage = strMessage & "Store and Inspection Date already exist." End If
End Sub
> Well, you'd put it in the same module as the rest of the code associated > with the form. [quoted text clipped - 117 lines] > >> >> tia > >> >> ridgerunner Douglas J. Steele - 22 May 2008 21:46 GMT You may have fallen victim of word-wrap. Then is supposed to be on the line above, after = False)
That's odd, though. It looks correct when I look at what I posted to you.
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no private e-mails, please)
>I am sorry I missed seeing this earlier. I have the part about making > certain that a store and a date are entered covered in a command button on [quoted text clipped - 142 lines] >> >> >> tia >> >> >> ridgerunner ridgerunner - 22 May 2008 21:56 GMT Yes, ord wrap is messing things up. "Then" is in the correct place in the property sheet or should I call it module, but this screen makes it look like it is one line down.
At any rate, the code below is highlighted with I get the syntax error message.
If IsNull(DLookup("StoreNo", "[DMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspection]![InspDate],
> You may have fallen victim of word-wrap. Then is supposed to be on the line > above, after = False) [quoted text clipped - 147 lines] > >> >> >> tia > >> >> >> ridgerunner ridgerunner - 22 May 2008 22:39 GMT Sorry about the "ord". I found out why the syntax error was popping up: I had to pull this "\#yyyy\-mm\-dd\#") & _ to the line above. I now do not received any syntax errors but the code is not catching a duplicate entry.
This is how it looks now. I had to make a correction to the table name.
Private Sub Form_BeforeUpdate(Cancel As Integer) If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspection]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo]) = False) Then strMessage = strMessage & "Store and Inspection Date already exist." End If
End Sub
> Yes, ord wrap is messing things up. "Then" is in the correct place in the > property sheet or should I call it module, but this screen makes it look like [quoted text clipped - 157 lines] > > >> >> >> tia > > >> >> >> ridgerunner Beetle - 22 May 2008 23:09 GMT Try moving the "False" outside the parentheses.
Private Sub Form_BeforeUpdate(Cancel As Integer) If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspection]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo])) = False Then strMessage = strMessage & "Store and Inspection Date already exist." End If
 Signature _________
Sean Bailey
> Sorry about the "ord". I found out why the syntax error was popping up: I > had to pull this "\#yyyy\-mm\-dd\#") & _ to the line above. I now do not [quoted text clipped - 175 lines] > > > >> >> >> tia > > > >> >> >> ridgerunner ridgerunner - 22 May 2008 23:17 GMT If I do that then I get the message Compile Error: Expected: list separator or )
> Try moving the "False" outside the parentheses. > [quoted text clipped - 186 lines] > > > > >> >> >> tia > > > > >> >> >> ridgerunner Beetle - 22 May 2008 23:23 GMT Do you have double parentheses at the end (just before the = False)?
 Signature _________
Sean Bailey
> If I do that then I get the message > Compile Error: [quoted text clipped - 190 lines] > > > > > >> >> >> tia > > > > > >> >> >> ridgerunner ridgerunner - 22 May 2008 23:30 GMT Below is what I have now and I am not receiving any error messages but it is not trapping the duplicates either.
Private Sub Form_BeforeUpdate(Cancel As Integer) Dim strMessage As String
If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspections]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo]) = False) Then strMessage = strMessage & "Store and Inspection Date already exist." End If
End Sub
> Do you have double parentheses at the end (just before the = False)? > [quoted text clipped - 192 lines] > > > > > > >> >> >> tia > > > > > > >> >> >> ridgerunner Beetle - 22 May 2008 23:41 GMT When you moved the "False" outside the parentheses, did you keep the last parentheses, or was it deleted? It should look like;
If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspections]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo])) = False Then ^(double) strMessage = strMessage & "Store and Inspection Date already exist." End If
See the notation where it should be double parentheses
I did a quick test on one of my apps. If the False is outside the parentheses it works, if it's inside nothing happens.
 Signature _________
Sean Bailey
> Below is what I have now and I am not receiving any error messages but it is > not trapping the duplicates either. [quoted text clipped - 208 lines] > > > > > > > >> >> >> tia > > > > > > > >> >> >> ridgerunner ridgerunner - 23 May 2008 00:05 GMT Where do you have this located? I copied the code exactly into the BeforeUpdate event for the form and it does not trap the error. I would like to trap the error after data is entered into the Store and InspDate fields, but right now I would like to see it work anywhere. I may be off line for a while.
> When you moved the "False" outside the parentheses, did you keep the > last parentheses, or was it deleted? It should look like; [quoted text clipped - 225 lines] > > > > > > > > >> >> >> tia > > > > > > > > >> >> >> ridgerunner Beetle - 23 May 2008 00:45 GMT Here is the code I'm using, copied as is from my app;
If IsNull(DLookup("InvoiceNumber", "tblDeliveries", "InvoiceNumber = """ & _ Me.txtInvoiceNumber & """ AND DealerID = " & Me.cboDealerID)) = False Then MsgBox strMsg, vbOKOnly + vbExclamation, "Duplicate Invoice" Cancel = True Me.txtInvoiceNumber.Undo End If It does exactly what I want, as long as the "False" is outside the parentheses. I'm using it in the Before Update of a control, not the form, but that shouldn't matter as to whether the code works or not.
Keep in mind, I'm only making suggestions for things you can try, Perhaps there is some other factor that is causing your criteria not to evaluate correctly.
 Signature _________
Sean Bailey
> Where do you have this located? I copied the code exactly into the > BeforeUpdate event for the form and it does not trap the error. I would like [quoted text clipped - 224 lines] > > > > > > > > > >> >> >> MsgBox "Store and Inspection Date already exist. Please correct" > > > > > > > > > >> >> >> Me.InspDate.SetFocus ridgerunner - 23 May 2008 02:08 GMT Thanks for posting your code. After much comparison back and forth with mine, I realized the MsgBox wasn't working used yours as a model. I think I need this in both controls BeforeUpdate event to make this work properly. What a long day.
Private Sub InspDate_BeforeUpdate(Cancel As Integer)
Dim strMessage As String If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspections]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo])) = False Then MsgBox strMessage & "Store and Inspection Date already exist. Press ESC and start over." End If
End Sub
> Here is the code I'm using, copied as is from my app; > [quoted text clipped - 220 lines] > > > > > > > > > > >> >> > "[NoDuplicates]=" > > > > > > > > > > >> >> > & Douglas J. Steele - 23 May 2008 02:19 GMT NO! It should be in the form's BeforeUpdate event, not the BeforeUpdate event of the individual controls.
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no private e-mails, please)
> Thanks for posting your code. After much comparison back and forth with > mine, I realized the MsgBox wasn't working used yours as a model. I think [quoted text clipped - 306 lines] >> > > > > > > > > > >> >> > "[NoDuplicates]=" >> > > > > > > > > > >> >> > & ridgerunner - 23 May 2008 02:34 GMT Even if I want them to see the error before the form is complete?
> NO! It should be in the form's BeforeUpdate event, not the BeforeUpdate > event of the individual controls. [quoted text clipped - 227 lines] > >> > > > > > > > > > >> > >> > > > > > > > > > >> End Sub ruralguy - 23 May 2008 11:07 GMT It is just my opinion but I prefer to notify a user as soon as they make a mistake. My preference would be to have verification in the BeforeUpdate event of both controls and just check for missing entries in the BeforeUpdate event of the form. Just my $0.02.
>Even if I want them to see the error before the form is complete? > [quoted text clipped - 3 lines] >> >> > > > > > > > > > >> >> >> > > > > > > > > > >> End Sub
 Signature RuralGuy (RG for short) aka Allan Bunch MS Access MVP - acXP WinXP Pro Please post back to this forum so all may benefit.
ridgerunner - 23 May 2008 14:35 GMT I am having another problem now. When I put data into the Store control, before putting data in the InspDate control, I receive the following error message:
Run-time error '3075': Syntax error (missing operator) in query expression '[InspDate]= AND [StoreNo] = 11'.
Below is the code:
Private Sub StoreNo_BeforeUpdate(Cancel As Integer)
Dim strMessage As String If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspections]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo])) = False Then MsgBox strMessage & "Store and Inspection Date already exist. Press Esc to correct." End If
End Sub
The arrow in the debug screen points to the line starting with AND.
> It is just my opinion but I prefer to notify a user as soon as they make a > mistake. My preference would be to have verification in the BeforeUpdate [quoted text clipped - 8 lines] > >> >> > > > > > > > > > >> > >> >> > > > > > > > > > >> End Sub ruralguy - 23 May 2008 15:52 GMT You do not want to check for duplicates until *both* controls and been completed. The first test should be to check if *both* controls have data.
>I am having another problem now. When I put data into the Store control, >before putting data in the InspDate control, I receive the following error [quoted text clipped - 27 lines] >> >> >> > > > > > > > > > >> >> >> >> > > > > > > > > > >> End Sub
 Signature RuralGuy (RG for short) aka Allan Bunch MS Access MVP - acXP WinXP Pro Please post back to this forum so all may benefit.
Douglas J. Steele - 23 May 2008 15:54 GMT That indicates that you've got a StoreNo, but no InspDate.
If you look at the snippets I posted earlier, I think you'll see that I used the Nz function to handle those cases:
If IsNull(DLookup("StoreNo", "[tblDMInspections]", _ "[InspDate] = " & _ Format(Nz(Forms![frmAddDMInspections]![InspDate], #01/01/100#), _ "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & _ Nz(Forms![frmAddDMInspections]![StoreNo], 0))) = False Then
All I'm doing is putting in a value that should never occur naturally, so it won't blow up the DLookup and won't return a duplicate.
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no e-mails, please!)
>I am having another problem now. When I put data into the Store control, > before putting data in the InspDate control, I receive the following error [quoted text clipped - 37 lines] >> >> >> > > > > > > > > > >> >> >> >> > > > > > > > > > >> End Sub Beetle - 23 May 2008 00:04 GMT Line wrap screwed up my reply, so my notation is totally iout of place but anyway, it should be )) before the = False
 Signature _________
Sean Bailey
> Below is what I have now and I am not receiving any error messages but it is > not trapping the duplicates either. [quoted text clipped - 208 lines] > > > > > > > >> >> >> tia > > > > > > > >> >> >> ridgerunner Ryan Tisserand - 22 May 2008 19:42 GMT Wow Douglas, you are right. I forgot two main elements. I also put an unbound textbox on the main form that is not visible and set the control source to [InspDate]&""&[StoreNo] and call it the same name "NoDuplicates". Then on my main form I add a button thats "On Click" event reads like this:
If isnull (me!InspDate) Then msgbox "Inspection date is required" Exit Sub End if If isnull (Me!StoreNo) Then msgbox "Store number is required" Exit Sub End if If not IsNull(DLookup("[NoDuplicates]", (YourQueryName), "[NoDuplicates]=" & Forms(YourFormName)![NoDuplicates])) Then MsgBox "Store and Inspection Date already exist. Please correct", vbCritical, "Duplicate Entry" End If Exit Sub
I applogize for my quick incomplete answer.
> Why would you concatenate the fields? (And you've forgotten to concatenate > the StoreNo into the argument you're passing to DLookup) [quoted text clipped - 74 lines] > >> tia > >> ridgerunner Douglas J. Steele - 22 May 2008 20:10 GMT I see no point whatsoever in concatenating the two fields.
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no e-mails, please!)
> Wow Douglas, you are right. I forgot two main elements. I also put an > unbound textbox on the main form that is not visible and set the control [quoted text clipped - 105 lines] >> >> tia >> >> ridgerunner ridgerunner - 22 May 2008 21:07 GMT I have added the Function to the OnOpen Property of the form and I am getting a syntax error message when I try to run it.
Function DuplicateValue() As Boolean
If IsNull(Format(Forms![frmAddDMInspections]![InspDate]) And _ IsNull(Forms![AddDMInspections]![StoreNo]) = False Then DuplicateValue = (IsNull(DLookup("StoreNo", "[DMInspections]", _ "[InspDate] = " & Format(Forms![frmAddDMInspections]![InspDate], "\#yyyy\-mm\-dd\#") & _ " AND [StoreNo] = " & Forms![frmAddDMInspections]![StoreNo]) = False) End If
End Function
> Why would you concatenate the fields? (And you've forgotten to concatenate > the StoreNo into the argument you're passing to DLookup) [quoted text clipped - 74 lines] > >> tia > >> ridgerunner ridgerunner - 22 May 2008 19:24 GMT I am getting this message "Runtime error 424" "Object Required". The second and third lines, below, are highlighted in the debug screen.
Private Sub InspDate_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("[NoDuplicates]", (qryFrmAddDMInsp), "[NoDuplicates]=" & frmAddDMInspections![InspDate])) Then MsgBox "Store and Inspection Date already exist. Please correct", vbCritical, "Duplicate Entry" End If Exit Sub
End Sub
> Here is my solution for multiple field duplication. I first join the two > fields in a query. For your example I would do this in a query. [quoted text clipped - 28 lines] > > tia > > ridgerunner Klatuu - 22 May 2008 19:32 GMT You are missing quote marks------------v---------------------v If Not IsNull(DLookup("[NoDuplicates]", (qryFrmAddDMInsp), "[NoDuplicates]=" & frmAddDMInspections![InspDate])) Then
Should be: If Not IsNull(DLookup("[NoDuplicates]", "qryFrmAddDMInsp", "[NoDuplicates]=" & frmAddDMInspections![InspDate])) Then
 Signature Dave Hargis, Microsoft Access MVP
> I am getting this message "Runtime error 424" "Object Required". The second > and third lines, below, are highlighted in the debug screen. [quoted text clipped - 43 lines] > > > tia > > > ridgerunner ruralguy - 22 May 2008 19:40 GMT All arguments to Domain functions need to be strings. Here's a good reference:
http://www.mvps.org/access/general/gen0018.htm
>I am getting this message "Runtime error 424" "Object Required". The second >and third lines, below, are highlighted in the debug screen. [quoted text clipped - 15 lines] >> > tia >> > ridgerunner
 Signature RuralGuy (RG for short) aka Allan Bunch MS Access MVP - acXP WinXP Pro Please post back to this forum so all may benefit.
ridgerunner - 22 May 2008 20:14 GMT Thanks. After looking at the example, I changed a few things and I am not receiving any error messages but the "trap" is failing. Closer examination causes me to ask if the = 'frmAddDMInspections![InspDate]'")) is correct since it only refers to the InspDate? I am going to try Doug's example when I find out where to put the Function.
Private Sub InspDate_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("[NoDuplicates]", "qryFrmAddDMInsp", "[NoDuplicates]= 'frmAddDMInspections![InspDate]'")) Then MsgBox "Store and Inspection Date already exist. Please correct", vbCritical, "Duplicate Entry" End If Exit Sub
End Sub
> All arguments to Domain functions need to be strings. Here's a good reference: > [quoted text clipped - 19 lines] > >> > tia > >> > ridgerunner
|
|
|