问题
I am building an application to track time amongst project, employees, etc. The company I work for has significant security red tape, so I have to use MS Access 2016, I am barred from youtube to search solutions, and I cannot download any files from the internet. Luckily, I can still access StackOverflow.
I have an entry form ("Task_List_Entry_Form") that has a button. On click, the button sends values to a table ("tbl_Task_List"). In the form VBA I've included that the table ("tbl_Task_List") refreshes, and all the values go to another table that acts as a corrections log ("tbl_Task_List_Corrections"). But the multi-value fields (I know, they are the worst, if it wasn't something that was seemingly necessary, I wouldn't include them) can't go. So I included a 2nd query in the VBA to take the value of the multi-valued fields and input into the fields, but this has been unsuccessful so far.
The first query option looked like this:strSQL2 = "INSERT INTO tbl_Task_List_Corrections " & Tags.Value & " FROM tbl_Task_List " & "WHERE tbl_Task_List.ID IN (SELECT MAX(tbl_Task_List.ID) FROM tbl_Task_List);"
'DoCmd.RunSQL strSQL2
Result: Error thrown "Run-Time error '3134': Syntax error in INSERT INTO statement", with the error on line "DoCmd.RunSQL strSQL2", The non-multi-value fields transferred correctly, but the value was not pulled, the tbl_Task_List_Corrections.Tags field remains NULL.
Then I tried something more like this:CurrentDb.Execute "INSERT INTO tbl_Task_List_Corrections (Tags) VALUES ('" & Me.[Tags].Value & "');"
Result: No error was thrown, but the value was not pulled, and there is an extra row that was inserted into the "tbl_Task_List_Corrections" table
There is potentially a 3rd solution I could try, that I found at this source, however it is based on an example access database that due to security restrictions, I am unable to download and look at, and I could not figure it out from the code alone. Here is that source: https://www.utteraccess.com/forum/index.php?s=66e048c0880b46f8bd25a0541c30df63&showtopic=2018212&st=0&p=2463687&#entry2463687
This is not all the code, but the code that has to do with moving values after the form is saved.
Me.Requery 'Refresh so the table is complete
Dim strSQL1 As String 'Declaring the Non-Multivalued fields
Dim strSQL2 As String 'attempting the multi-value fields again
strSQL1 = "INSERT INTO tbl_Task_List_Corrections (Task_ID, Task_Title,
Task_Start_Time, Task_End_Time, Break_Length_Minutes, Priority,
Blockage_Reason, Requirements, Notes, Task_Complete) SELECT
tbl_Task_List.ID, tbl_Task_List.Task_Title, tbl_Task_List.Task_Start_Time,
tbl_Task_List.Task_End_Time, tbl_Task_List.Break_Length_Minutes,
tbl_Task_List.Priority, tbl_Task_List.Blockage_Reason,
tbl_Task_List.Requirements, tbl_Task_List.Notes,
tbl_Task_List.Task_Complete FROM tbl_Task_List WHERE tbl_Task_List.ID IN
(SELECT MAX(tbl_Task_List.ID) FROM tbl_Task_List);"
DoCmd.RunSQL strSQL1
'strSQL2 = "INSERT INTO tbl_Task_List_Corrections " & Tags.Value & " FROM
tbl_Task_List " & "WHERE tbl_Task_List.ID IN (SELECT MAX(tbl_Task_List.ID)
FROM tbl_Task_List);"
'DoCmd.RunSQL strSQL2 'THIS IS ATTEMPT 1
'CurrentDb.Execute "INSERT INTO tbl_Task_List_Corrections (Tags) VALUES ('"
& Me.[Tags].Value & "');" 'THIS IS ATTEMPT 2
Dim db As Database 'Attempt4
Dim rs As Recordset 'Attempt4
Dim childRS As Recordset 'Attempt4
'Attempt4
Set db = CurrentDb() 'Attempt4
'Attempt4
' Open a Recordset for the Tasks table. 'Attempt4
Set rs = db.OpenRecordset("tbl_Task_List") 'Attempt4
rs.MoveFirst 'Attempt4
'Attempt4
Do Until rs.EOF 'Attempt4
' Print the name of the task to the Immediate window. 'Attempt4
Debug.Print rs!Task_Title.Value 'Attempt4
'Attempt4
' Open a Recordset for the multivalued field. 'Attempt4
Set childRS = rs!Tags.Value 'Attempt4
'Attempt4
' Exit the loop if the multivalued field contains no records 'Attempt4
Do Until childRS.EOF 'Attempt4
childRS.MoveFirst 'Attempt4
'Attempt4
' Loop through the records in the child recordset. 'Attempt4
Do Until childRS.EOF 'Attempt4
' Print the owner(s) of the task to the Immediate 'Attempt4
' window. 'Attempt4
Debug.Print Chr(0), childRS!Value.Value 'Attempt4
childRS.MoveNext 'Attempt4
Loop 'Attempt4
Loop 'Attempt4
rs.MoveNext 'Attempt4
Loop 'Attempt4
MsgBox "You have successfully added this Task"
DoCmd.Close
End Sub
Below is attempt 5
Dim db As Database 'Attempt5
Dim rs As Recordset 'Attempt5
Dim rs2 As Recordset 'Defining the tbl_Task_List_Corrections
Dim childRS As Recordset 'Attempt5
'Attempt5
Set db = CurrentDb() 'Attempt5
'Attempt5
' Open a Recordset for the Tasks table. 'Attempt5
Set rs = db.OpenRecordset("tbl_Task_List") 'Attempt5
Set rs2 = db.OpenRecordset("tbl_Task_List_Corrections") 'Setting the value of tbl_Task_List_Corrections
rs.MoveLast 'Attempt5
'Attempt5
'Do Until rs.EOF 'Attempt5
' Print the name of the task to the Immediate window. 'Attempt5
Debug.Print rs!ID.Value 'Attempt5
Debug.Print rs!Task_Title.Value 'Attempt5
Debug.Print rs!Priority.Value 'Attempt5
Debug.Print rs!Blockage_Reason.Value 'Attempt5
Debug.Print rs!Requirements.Value 'Attempt5
Debug.Print rs!Notes.Value 'Attempt5
' Open a Recordset for the multivalued field. 'Attempt5
Set childRS1 = rs!Tags.Value 'Attempt5
Set childRS2 = rs!Assigned_To.Value
'Attempt5
' Exit the loop if the multivalued field contains no records. 'Attempt5
Do Until childRS1.EOF 'Attempt5
childRS1.MoveFirst 'Attempt5
'Attempt5
' Loop through the records in the child recordset. 'Attempt5
Do Until childRS1.EOF 'Attempt5
' Print the owner(s) of the task to the Immediate 'Attempt5
' window. 'Attempt5
Debug.Print Chr(0), childRS1!Value.Value 'Attempt5
childRS1.MoveNext 'Attempt5
Loop 'Attempt5
Loop 'End of loop that checks if Tags multi-value field is NULL
' Exit the loop if the multivalued field contains no records. 'Attempt5
Do Until childRS2.EOF 'Attempt5
childRS2.MoveFirst 'Attempt5
' Loop through the records in the child recordset. 'Attempt5
Do Until childRS2.EOF 'Attempt5
' Print the owner(s) of the task to the Immediate 'Attempt5
' window. 'Attempt5
Debug.Print Chr(0), childRS2!Value.Value 'Attempt5
childRS2.MoveNext 'Attempt5
Loop 'Attempt5
Loop 'End of loop that checks if Assigned_To multi-value field is NULL
rs2.AddNew 'Attempt5
rs2!Task_ID = rs!ID.Value 'Attempt5
rs2!Task_Title = rs!Task_Title 'Attempt5
rs2!Tags = childRS1!Value.Value 'Attempt5
rs2!Priority = rs!Priority 'Attempt5
rs2!Assigned_To = childRS2!Value.Value 'Attempt5
rs2!Blockage_Reason = rs!Blockage_Reason 'Attempt5
rs2!Requirements = rs!Requirements 'Attempt5
rs2!Notes = rs!Notes 'Attempt5
rs2.Update 'Attempt5
Below is Attempt 7, referring to the Answer on 4/13 (edited again 4/23)
Me.Requery 'Refresh the table before running the query
Dim strSQL1 As String 'Declaring the Non-Multivalued fields to move to Corrections Log
strSQL1 = "INSERT INTO tbl_Task_List_Corrections (Task_ID, Task_Title, " & _
"Task_Start_Time, Task_End_Time, Break_Length_Minutes, Priority, " & _
"Blockage_Reason, Requirements, Notes, Task_Complete) " & _
"SELECT ID, Task_Title, Task_Start_Time, Task_End_Time, " & _
"Break_Length_Minutes, Priority, Blockage_Reason, Requirements, " & _
"Notes, Task_Complete FROM tbl_Task_List WHERE ID IN " & _
"(SELECT MAX(ID) FROM tbl_Task_List);"
DoCmd.RunSQL strSQL1
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT ID FROM tbl_Task_List") 'error 3061
Set rs = CurrentDb.OpenRecordset("SELECT MAX(ID) FROM tbl_Task_List") '3265
Do Until rs.EOF
CurrentDb.Execute "INSERT INTO " & _
" tbl_Task_List_Corrections(Tags.Value) SELECT Tags.Value FROM " & _
" (SELECT Tags.Value FROM tbl_Task_List WHERE ID = " & rs!ID & ") " & _
" AS T1 WHERE tbl_Task_List_Corrections.Task_ID = " & rs!ID
rs.MoveNext
Loop
MsgBox "You have successfully added this Task"
'DoCmd.SetWarnings False 'Turning the "You are about to Update 1 Row" warning back on
DoCmd.Close
End Sub
回答1:
Turned out to be much simpler than I thought. Looks like original attempt was on right track.
Once new record with non-MVF data is created, run another INSERT SELECT action to populate the MVF. Example shows populating second table MVF in a loop of copied records. Tested and worked. Should be simple to execute the SQL action for a single record specified by record identifier on form instead of looping recordset.
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT RateID FROM CopyOfRates")
Do Until rs.EOF
CurrentDb.Execute "INSERT INTO CopyOfRates(MVTest.Value) SELECT MVTest.Value FROM " & _
"(SELECT MVTest.Value FROM Rates WHERE RateID = " & rs!RateID & ") AS Q1 " & _
"WHERE CopyOfRates.RateID = " & rs!RateID
rs.MoveNext
Loop
来源:https://stackoverflow.com/questions/55542028/access-2016-vba-unable-to-set-button-click-on-form-to-write-multi-value-fields-t