Я создаю приложение для отслеживания времени среди сотрудников проекта, сотрудников и т. Д. Компания, в которой я работаю, обладает значительным бюрократическим средством защиты, поэтому мне приходится использовать MS Access 2016, я не могу использовать YouTube для поиска решений и не могу скачать любые файлы из интернета. К счастью, я все еще могу получить доступ к StackOverflow.
У меня есть форма ввода ("Task_List_Entry_Form"), в которой есть кнопка. При нажатии кнопка отправляет значения в таблицу ("tbl_Task_List"). В форме VBA я включил, что таблица ("tbl_Task_List") обновляется, и все значения попадают в другую таблицу, которая действует как журнал исправлений ("tbl_Task_List_Corrections"). Но многозначные поля (я знаю, они худшие, если бы это было не то, что казалось бы необходимым, я бы их не включил) не могут пройти. Поэтому я включил второй запрос в VBA, чтобы получить значение многозначных полей и ввести их в поля, но пока это не удалось.
Первый вариант запроса выглядел так:
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
Результат: выдана ошибка «Ошибка времени выполнения 3134»: синтаксическая ошибка в операторе INSERT INTO », с ошибкой в строке« DoCmd.RunSQL strSQL2 », поля, не содержащие нескольких значений, переданы правильно, но значение не было извлечено, поле tbl_Task_List_Corrections.Tags остается NULL.
Тогда я попробовал что-то более похожее на это:
CurrentDb.Execute "INSERT INTO tbl_Task_List_Corrections (Tags) VALUES ('" & Me.[Tags].Value & "');"
Результат: не было выдано никакой ошибки, но значение не было извлечено, и в таблицу "tbl_Task_List_Corrections" была добавлена дополнительная строка
Существует потенциально третье решение, которое я мог бы попробовать найти в этом источнике, однако оно основано на примере базы данных доступа, из-за ограничений безопасности я не могу скачать и посмотреть, и я не могу понять это из одного кода. Вот этот источник: https://www.utteraccess.com/forum/index.php?s=66e048c0880b46f8bd25a0541c30df63&showtopic=2018212&st=0&p=2463687&#entry2463687
Это не весь код, а код, связанный с перемещением значений после сохранения формы.
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
Пытаться до rs.EOF5
' 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
Ниже приведена попытка 7 со ссылкой на ответ 4/13 (снова отредактировано 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