So on the offchance that two clients are trying to autogenerate a key at exactly the same time, I'm trying to trap the 3022 error raised when a duplicate key is entered so that I can repeat the operation with a goto.
I'm raising the error with requery like this:
DoCmd.Save acForm, Me.Name 'next line triggers 3022
DoCmd.Requery
After I realised that the normal handler wouldn't trap it I got the database from this thread:
Okay, I'm kind of stumped here.I have a subform that has a button that sends a user to a "sibling" subform on another tab page, pass some information to ensure they are adding more details to the same records rather than creating two separate record.First time I programmed it, I got an error 3022 (keys cannot have duplicate values). I checked the query of the sibling subform and saw that the ID is from the one side table. I changed it so many table's foreign key is used. Second try, I got an error 3341 (there isn't a matching key in one side table).After some thinking, it also occured to me that I had set the query this way to allow addition of new record which wouldn't be possible if I had the query pulling the many side key, not the one side key.How do I get the subform to accept the ID that is being passed and create a new record using that ID?:confused:
I am using a select query meanz no modification at all but still getting the error 3022(The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. (Error 3022))
Hi, I have a rather large database that was built in Access '97 and recently converted to 2003. I have a couple problems now. I get an error message about not being able to update the form because it would create a duplicate value in the primary key, index, or relationship. (Error 3022) I didn't build this particular database so I'm not totally sure why somethings are done the way they are. I've spent a long time going through everything to try to understand the relationships and I've asked lots of people at work to look at it, but no one seems to understand why it's doing what it's doing. The Access Help information has helped me understand some things better, but not this problem. I've gone through every table and removed all primary keys and set all indexes to allow duplicates. Then, when I was looking at the relationships and object dependancies, I think everything looks to be in order. However, when i add info directly to the table instead of using the form, the form is not updated with the new info. the table keeps the information, but isn't communicating with the form and i suspect reverse is true which is where the error is coming from. But how do I detect that for sure and how can I fix it with out starting over? I've gone through and added data to one field in the form at a time to try and narrow down what field is causing the problem, but no matter what i get the same error. Is there a way to find out exactly what field is causing the error? Thanks for any help you can offer!
I created a subforum with an updateable query, and this works. I can view the results of the query, modify them and add new records.
However I shortly realized that once I deleted a record (either by some VBA code, or by SQL) that I could not re-add the same record through the subform.
I've made sure that the record is deleted, so there is no duplication of the key. I've made sure that Index is Duplicates OK, so there is no duplication issues there.
I dont use linked tables very often, and when I always seem to run into the same problem.
I have two tables. The pri table has an index key defined as an autoindex, with no duplicates. The sub-table is linked to the pri table key in a many-to-one relationship. The linked field in the subtable is defined as a long integer non-keyed field.
All is okay, until I attemp to add a SECOND record. At that point I get a 3022 error, stating I cant do something because I am attempting to create a duplicate key.
I would love to fix it, nut I am not sure exactly what the problem is that needs to be fixed. The pri key would not SEEM to be getting duplicated, and the subtable linked field is not keyed. Hmmm, I guess I need a steer here please.
I have an Access 2010 database with a form that allows me to input data which is saved into two tables (i.e. Orders and OrderDetails). I use a simple select query to bind the form to the tables.
When the form loads it asks for an order number, which it uses to pull details from the Orders table and auto-fill some fields on the form (these fields are not enabled as they are predefined, such as the order date).
So, when the order number is entered my VBA code does a Form.Refresh, which then breaks the code with the Run-time error 3022 - "The changes you requested to the table were not successful yada yada.." (I'm sure you all know the one)...
I have checked that there are no duplicated keys in my tables, I have checked that what should be indexed, is indexed. I have done a compact and repair on the database, and even created a new database and imported all the tables (used new data). Still get the same issue.
hi guys i was wondering if you can help me this is my code: i have a main form with this code, this form contains a subform linked by the All_PricingID
Set rst = CurrentDb.OpenRecordset("tblAll_Pricing") 'main table ' adding data to the table rst.AddNew ' Main table rst!All_PricingID = Me.txtPricingID 'Main table pk rst!MainContract_ID = Me.cmbMainContract 'combo box in parent form rst!ItemNumber = Me.txtItem 'Main form text rst.Update
'sub Table Set rst2 = CurrentDb.OpenRecordset("tblPricing") 'sub table For varItem = 0 To Me.lstsubContracts.ListCount - 1 'this is a list in the main form '--- loop through all the items in the list box and create a new row in the subform for each subcontract in the listbox lstSubcontracts. rst2.AddNew rst2!ID = Me.All_PricingID 'sub table foreign key rst2!SubContractID = Me.lstsubContracts.Column(0, varItem) 'sub table rst2.Update Next varItem '--- close the tables rst.Close rst2.Close Set rst = Nothing Set rst2 = Nothing
the subform appears correctly with the rows i wanted added but i need the user to be able to edit a column in the subform for the rows just created (my form is on datasheet view). but everytime i move to cursor into the subform, i can't even scroll up and down.
i keep getting an error that says :
The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. (Error 3022)
but when i check my tables tblAll_Pricing and tblPricing , everything is inserted correctly according to my recorset above, do you know why this is happening? and why i am not able to edit my subform. my subform allowsedits and additions.
Private Sub NextApplication_Click() On Error GoTo Err_NextApplication_Click DoCmd.GoToRecord , , acNext
Exit_NextApplication_Click: Exit Sub
Err_NextApplication_Click: If Err.Number = 2105 Then MsgBox "Cannot navigate to the next record. This is the last record." Else MsgBox Err.Description End If
Resume Exit_NextApplication_Click
End Sub
but even when this error occurs nothing is being properly handled the way i specified - any ideas ?
I have the following in the after update event in a Combo bound to a tbl on a Main form; Sub Combo8_AfterUpdate() ' Find the record that matches the control. Me.RecordsetClone.FindFirst "[Vendor] = '" & Me![Combo8] & "'" Me.Bookmark = Me.RecordsetClone.Bookmark End Sub
The Combo gets its data from a table and I use the Not In List to add data which is not in the Tbl and of course Limit To List is set to Yes. It works ok with one exception, when data is entered, but not saved, then deleted And the form closed. In this set of circumstances I get an error in the code above. Granted that normally a user will not delete data from the combo then exit the form but it does happen occasionally. I have tried adding On error goto.... but with no luck. Any suggestions?
I have a VBA code that runs an append query to update a table. Due to relationship integrity a validation error shows (a type does not exist in the connected table): What I want to do is trap the error and write something that the user can understand. Help !
The Code: Code:Private Sub Report_Deactivate()Dim Msg, Style, Title, Response, MyStringMsg = "Click OK to Import Verified Data to the Invoice Table"Style = vbYesNo + vbMsgSetForegroundTitle = "Verify Import"Response = MsgBox(Msg, Style, Title)If Response = vbYes Then 'This is the problem line DoCmd.OpenQuery "qry_Step_5_appending_invoices", acViewNormal, acEdit DoCmd.OpenQuery "Qry_Step_6_update_fob", acViewNormal, acEditElse MyString = "No"End IfEnd Sub
I have a "homemade" switchboard that I am using and the first page allows the choice of administrator or user. I have used access user level security to deny all but administrators access to the administrator "path" in my switchboard.
When a user clicks on it, they get the runtime error 2603 saying that they don't have access. I am trying to modify the on error event so that the error won't show up and a custom message box I create will show up instead, however I cannot seem to get my on error code to do anything. I always get the standard access runtime error return box. Does anyone have any ideas??
I have an "Error trapping" problem. I am relatively new to VBA and wondered if someone would be so kind and point out the error in my code.
I have a form "frmSelectInvoices" that opens another form, "frmInvoice".
I use the Select Invoices form to select completed jobs that are not invoiced, based on a query.
The user would then select a job that he/she wants to invoice, and "frmInvoice" opens in front of "frmSelectInvoice".
"frmInvoice" is based on "tblInvoices" and a couple of the required fields, (customer, JobID, etc) are filled-in automatically using the information from a couple of fields from "frmSelectInvoice"
"frmInvoice" also has an InvoiceNumber field which tblInvoices needs as it is set as a required field with no duplicates, (this is NOT the primary key).
I am trying to notify the user that the InvoiceNumber has already been used, and to reset the record, so they can enter a new Invoice Number.
The code I have so far is as follows; Code:Private Sub Notes_Exit(Cancel As Integer)On Error GoTo Err_SameNumber Dim iResponse As Integer iResponse = MsgBox("Do you wish to Print an Invoice", vbYesNo, "SELECT AN OPTION") If iResponse = vbYes Then DoCmd.RunCommand acCmdSaveRecord Forms!frmSelectInvoice!Invoiced.Value = True Forms!frmSelectInvoice.Requery DoCmd.Save acForm, "frmInvoice" DoCmd.OpenReport "rptInvoice", acNormal, "", "[pkInvoiceID]=[Forms]![frmInvoice]![pkInvoiceID]" Me.btnClose.SetFocus Exit Sub End If If iResponse = vbNo Then MsgBox "You can Print it out later from the Invoices Main Menu", , "You Selected NO" End If DoCmd.RunCommand acCmdSaveRecord Forms!frmSelectInvoice!Invoiced.Value = True Forms!frmSelectInvoice.Requery Me.btnClose.SetFocusExit_SameNumber:DoCmd.RunCommand acCmdUndo DoCmd.GoToRecord , , acNewRec Me.fkBookingID.Value = Forms!frmSelectInvoice!pkBookingID.Value Me.fkCustomerID.Value = Forms!frmSelectInvoice!fkCustomerID.ValueMe.InvoiceNumber.SetFocusExit SubErr_SameNumber: MsgBox "Invoice Number has already been used", vbInformation, "Please use a New Invoice Number" Resume Exit_SameNumberEnd Sub When I test the form with a number I know already exists, or even a number that has not been used before, the error message comes up and it then sets the focus to InvoiceNumber, but when I try and close the form it still keeps coming up and the only way I can get rid of it is to close the application using Windows Task Manager. Any help on this would be appreciated. Thanx
Hi guys, I was looking for a way to trap err.number 3314 (when required field is null) before Jet generates its warning. I came across an old post from Rich (below), but I couldn't make it work as yet. In the calling form, under the Form_Error event I wrote the following:
Dim f As Form Set f = Me Call fnValidateForm(f)
Could anyone please tell me where my error lays here? I have several forms which have several text and/or combo boxes bound to required fields and I would want to have a generic code, like the one here to trap errors before Jet shows it's Error Message.
Thanks in advance Regards Jaime Premy - Belém-Brasil
******************Rich's Function******************** Public Function fnValidateForm(frmA As Form) As Boolean Dim ctl As Control Dim Msg, Style, Title, Response, MyString fnValidateForm = True For Each ctl In frmA.Controls 'value in the control is required If InStr(1, ctl.Tag, "Required") > 0 Then ' no value entered or value is null ' or zero for numeric fields If (IsNull(ctl.Value)) Or (Len(ctl.Value) = 0) Then ctl.SetFocus MsgBox "You have not entered all the required fields return to the record and correct this! The record will not be saved if you do not! " fnValidateForm = False
Exit For End If
If InStr(1, ctl.Tag, "NumberRequired") > 0 Then If ctl.Value = 0 Then ctl.SetFocus MsgBox "You have not entered all the required fields return to the record and correct this! The record will not be saved if you do not! " fnValidateForm = False
Ok, I have a delete query that I use to delete records form a table. I have created a form that I run that query from. It has Delete button that runs the query. After I get the message that says "You are about to delete 56 records" and I click No, I get a "run-time error '3059'. Operation Cancel by user"
I did some searching on the forum and thought I could trap this error. But I still continue to get the error at
"DoCmd.OpenQuery stDocName, acNormal, acEdit"
What am I doing wrong and how can I prevent this error from appearing when I click NO or cancel the operation.
Private Sub cmdDelete_Click() On Error GoTo Err_cmdDelete_Click
cmdDelete_Error: Select Case Err.Number Case 3059 MsgBox "You have canceled the delete operation.", vbOKOnly, "Delete Canceled" Exit Sub Case Else MsgBox "Error number: " & Err.Number & " has occurred. " & Err.Description, vbOKOnly, "Error" End Select
I've made my own record navigation buttons on a form. they work fine, except when i get to the first record. if i click 'previous' then the 2105 error pops up "you can't go to specified record". the buttons were created through the wizard, and have error trapping in them. for some reason, it never actually goes to the error handler. the error message comes up, i press debug, and the 'DoCmd.GoToRecord , , acPrevious' is highlighted.
any ideas why the error trapping isn't working? here's the code:
Private Sub cmdPrevJob_Click() Dim x As Variant On Error GoTo Err_cmdPrevJob_Click DoCmd.GoToRecord , , acPrevious Exit_cmdPrevJob_Click: Exit Sub Err_cmdPrevJob_Click: If Err.Number = 2105 Then stop MsgBox Err.Description Resume Exit_cmdPrevJob_Click End Sub
I've got my form working, and all of the record updating is working fine, so now I am working on error trapping. I need to check if any of the two textboxes are empty, or nothing has been selected from the combobox. I am using the BeforeUpdate method. I am not getting any syntax errors. I am using an INSERT INTO SQL statement. Thanks.
related DB fields: SOPNumber (text) RevisionNumber (text) TrainingDate (date/time)
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.cboSOPNumber) Then Cancel = True MsgBox "The SOP number is required", vbOKOnly, "Notice" Me.cboSOPNumber.SetFocus End If
If IsNull(Me.txtRevisionNumber) Then Cancel = True MsgBox "The Revision Number is required", vbOKOnly, "Notice" Me.txtRevisionNumber.SetFocus End If
If IsNull(Me.txtTrainingDate) Then Cancel = True MsgBox "The training date is required", vbOKOnly, "Notice" Me.txtTrainingDate.SetFocus End If
I am using following routine to lift data from Excel files into Access tables. Whole thing works, well, most of the time. The only issue I have is the spreadsheets are received from warehouses and even though they have been given strict instruction to stick to the template, I have had to adjust the spreadsheets. Amongst errors I get are:
Field 'F16' does not exist in table 'SA1'. (In this case I simply delete the last most empty column to fix this).
Or there are column name spellings and in such cases, I get no error and the simply code hangs.
Is there any routine that I could incorporate in the code that clearly states what issues are being experienced. This way I can pass the db to the user to run it themselves.
'Dim dbs As Database, tdf As TableDef Set dbs = CurrentDb On Error GoTo Macro1_Err DoCmd.SetWarnings False ' RunSQL executes a SQL string
What's the best way to trap the error I get when I don't input the time correctly in a date/time control?? I have a the following as an input mask: 99:00 >LL;0;_...02:30 PM
I've a form in which one of the fields the user enters is supposed to be a unique id. The unique id is an alphanumeric text box.
However, it's possible that another user enters an id that has already been previously used.
I'm thinking that I need to run a Find Duplicates Query with the text box entry and a table that holds all the previously entered ids prior to the form being saved so that I can inform the user of the possible duplication.
My question is are there any ideas on how I can do this or code it?
I like having the action query warning appear with what I am doing - "You are about to update xxx rows". The problem that I am having is that when my RunSQL statement in the code executes and selects no to the warning, I get the error -
Run-time Error '2501' The RunSQL action was canceled.
How can I trap the no selection so that this vba error does not appear?
Hi guys i got a form and sub form. When i leave the field hours empty in the sub form and try to click on close or some where in the form i get this error:
MsgBox "Primary key violation", , "Explanation"
instead of
MsgBox "Violation of Not Null constraint", , "Explanation"
i want to trap not null error and prompt the user that he has to enter value for hours field but aparently it does not. i be happy if some one help me fix this error .Thanks
Code:Private Sub Form_Error(DataErr As Integer, Response As Integer)Select Case DataErr Case 3162 MsgBox "Violation of Not Null constraint", , "Explanation" Case 3146 MsgBox "Primary key violation", , "Explanation" Case 3155 MsgBox "Trigger violation: 'Wages of the employee in this project is not existed. You must enter data of hourly wage first'", , "Explanation" Case Else MsgBox "Other errors" End SelectEnd Sub
We are currently developing a simple Point Of Sale Form which consists of 2 text boxes and a list box.We need to trap numeric input from either the keyboard or a barcode scanner at form level,then setfocus on a textbox and enter the input into the textbox.So far have used the keydown event on the form to trap numeric input and setfocus using the following code.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode >= 48 And KeyCode <= 57 And KeyCode >= 96 And KeyCode <= 105 Then Me.Input.SetFocus End If End Sub
This does not however enter the keyboard or scanner input into the textbox.Is there a method to trap the input,set the focus and enter the input into the textbox once it has recieved the focus.
I am writing a small database using MS Access 2007. I have in it a function for running queries and printing reports. Printing works just fine if any one of the multiple query criteria is give.
I also want to trap errors and present a message if the user clicks the "Print" button without a query criteria. At the moment I only get a run-time syntax error message which has a "debug" button for accessing the entire code. I want a message that will say "There was no search criteria".
This is the code for printing:
Code: Private Sub cmdPrint_Click() Dim varWhere As Variant varWhere = BuildFilter ' Update the record source Me.RecordSource = "SELECT * FROM q_Vehicles " & varWhere
:confused: Anyone know how to trap/prevent the msg "The DoMenuItem action was cancelled" after answering no to deleting a record? I followed the instructions at the following thread but no luck:
---------------------------------- Private Sub Delete_Click() On Error GoTo Err_Delete_Click DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70 Exit_Delete_Click: Exit Sub Err_Delete_Click: MsgBox Err.Description Resume Exit_Delete_Click End Sub
----------------------------------- Private Sub Form_Delete(Cancel As Integer) DoCmd.SetWarnings False If MsgBox("Are you sure you want to delete this record?", vbYesNo) = vbNo Then Cancel = True Else MsgBox "Record deleted!" End If End Sub -------------------------------------