Так что это проблема, которая начала происходить день назад.
У меня есть файл базы данных Access, в котором хранится форма для создания заданий, обновления сектора заданий и удаления из таблицы MySQL.
Для этой формы используются две таблицы: локальная, которая хранится в Access и называется "Маршрут задания", а другая - через драйвер ODBC MYSQL, версия ANSI 5.3, называемая "Задача". Локальная таблица хранит данные, представленные пользователем, содержащие информацию обо всех областях работы и состоянии, в то время как таблица MYSQL показывает только одну область работы одновременно.
Когда создается новая запись, данные текстового поля из формы доступа сохраняются в обеих таблицах. Если каждое задание содержит до 4 различных секторов (например, [дата начала], [область1], [ответственное лицо 1], [описание1],... [область4], [ответственное лицо 4], [описание4]). Всякий раз, когда данные обновляются до следующего состояния, в локальной таблице увеличивается только поле счетчика заданий, а каждое поле в таблице MYSQL, называемое "To Do", обновляется до следующих полей.
Соединение с сервером хорошее, и все работало нормально, пока не возникла проблема с функцией обновления.
По сути, эта функция работает так: в элементе управления списком все текущие данные задания запрашиваются из таблицы "Задачи". Пользователь выбирает запись и нажимает кнопку, которая загружает информацию о следующем секторе из "Маршрута задания" в различные элементы управления текстовым полем. Пользователь может изменить эти входные данные текстового поля, если они хотят - единственное, что изменяется при запуске функции, это "To Do". Информация в "Пути работы" остается неизменной. Когда пользователь нажимает кнопку обновления, данные поля следующего сектора обновляются до "To Do", в то время как только счетчик в "Job Route" увеличивается для обозначения текущего сектора.
Моя проблема в этом. По большей части почти все работает нормально, но для одного из полей таблицы "Задачи" не обновляются значения, которые должны быть из текстового поля. Так, например, если элемент управления textbox был установлен на "Wyntile", имя поля должно быть установлено на это, но по какой-то причине вместо этого появляется другое значение, пример = "Яблоки". Вот код:
Private Sub moveJob2_Click()
'get the job number
JobNum = Text31
CurrArea = DLookup("[Area]", "[To_Do]", "[Job_Number] =""" & JobNum & """")
area1 = DLookup("[Area1]", "[Job Route]", "[Job Number] =""" & JobNum & """")
area2 = DLookup("[Area2]", "[Job Route]", "[Job Number] =""" & JobNum & """")
area3 = DLookup("[Area3]", "[Job Route]", "[Job Number] =""" & JobNum & """")
area4 = DLookup("[Area4]", "[Job Route]", "[Job Number] =""" & JobNum & """")
'get what the current area is
Current = DLookup("[Current]", "[Job Route]", "[Job Number] =""" & JobNum & """")
'if the current area is the first area then check to make sure there is a second
'if so, then set the new area to it
If Current = 1 Then
If area2 = "---" Then
MsgBox area1 + " was the last area in the route. The job cannot be moved."
Exit Sub
End If
newArea = area2
ElseIf Current = 2 Then
If area3 = "---" Then
MsgBox area2 + " was the last area in the route. The job cannot be moved."
Exit Sub
End If
newArea = area3
ElseIf Current = 3 Then
If area4 = "---" Then
MsgBox area3 + " was the last area in the route. The job cannot be moved."
Exit Sub
End If
newArea = area4
Else
MsgBox area4 + " was the last area in the route. The job cannot be moved."
Exit Sub
End If
'set up link to both the To_Do and Job Route tables
Dim dbJobNumbers As DAO.Database
Dim rstJob As DAO.Recordset
Dim jobRoute As DAO.Recordset
Set dbJobNumbers = CurrentDb
Set rstJob = dbJobNumbers.OpenRecordset("To_Do")
Set jobRoute = dbJobNumbers.OpenRecordset("Job Route")
' >> Edit the job in the To_Do table
****' ERROR: Out of all these, only [Person_In_Charge] is being set to something
****' completely different from Text33, which wasn't changed by the user.
rstJob.FindFirst "[Job_Number]=""" + Text31 + """"
rstJob.Edit
rstJob("[Area]").Value = newArea
rstJob("[Person_In_Charge]").Value = Text33
rstJob("[Equipment]").Value = Text37
rstJob("[Description]").Value = Text35
rstJob.Update
'update the current area for the Job Route
jobRoute.FindFirst "[Job Number]=""" + Text31 + """"
jobRoute.Edit
jobRoute("[Current]").Value = CInt(Current) + 1
jobRoute.Update
'success message
MsgBox Text31 + " has been moved from " + CurrArea + " to " + newArea + "."
'requery the listboxes
Dim selectParas As String
selectParas = "SELECT [a].[Job_Number] as [Job Number], [a].[Description], [a].[Person_In_Charge] as [Person in Charge], [a].[Area] " & _
" FROM [To_Do] As [a];"
listRemoveJobs.RowSource = selectParas
listRemoveJobs.Requery
listChangeJobArea.RowSource = selectParas
listChangeJobArea.Requery
End Sub
Функция работает нормально, и даже сейчас, когда я проверяю ее снова, она работает как запрограммировано. Хотя сегодня я получил сообщение об ошибке "Вставка ODBC в" To Do "не удалась", но для другой функции ". Поэтому я подумал, что что-то не так в соединении ODBC/таблице MySQL, но когда я проверял таблицу в phpmyadmin по большей части, эта таблица следует аналогичному формату других таблиц mysql, используемых в Access.
Также следует отметить, что человек, который сообщил мне об этой проблеме, работает на старой версии Windows XP, где ранее на этом компьютере были известные проблемы с определенным экземпляром драйвера OBDC ANSI 5.3, который ранее полностью исчез из списка источников данных Access. (Драйвер все еще установлен в Windows). Тогда, очевидно, экземпляр драйвера позже снова волшебным образом появился снова в списке DS, когда тот компьютер был перезагружен.... Я знаю, что это довольно долго, но я не могу найти причину, по которой происходит эта ошибка обновления в Access. Есть ли известная проблема ODBC, имеющая проблемы со стабильностью в соединении? Почему при обновлении значение меняется на что-то совершенно другое? Любое понимание будет оценено.
Хотя нет воспроизводимого примера, который мог бы помочь в вашей конкретной ситуации, рассмотрите возможность выполнения запросов SQL UPDATE
с привязанными параметрами. Условную логику вашей области можно переписать во вложенное выражение IIF
. Возможно, это упростит вашу проблему и оптимизирует ваши потребности без DLookup
или нескольких обновлений набора записей. Кроме того, ваше переназначение RowSource
не является необходимым. Ниже используется параметризация, лучшая практика при запуске SQL на уровне приложений:
SQL (сохраните оба ниже как запросы доступа)
mySavedJoinUpdateQuery
PARAMETERS Text33Param Text(255), Text35Param Text(255)
Text37Param Text(255), JobNumberParam Text(255);
UPDATE [To_Do] d
INNER JOIN [Job Route] r
ON d.Job_Number = r.Job_Number
SET [Area] = IIF([Current] = 1 AND [Area2] != '---', [Area2],
IIF([Current] = 2 AND [Area3] != '---', [Area3],
IIF([Current] = 3 AND [Area4] != '---', [Area4], [Area1)
)
),
[Person_In_Charge] = Text33Param,
[Equipment] = Text37Param,
[Description] = Text35Param
WHERE r.[Job Number] = JobNumberParam;
mySavedSimpleUpdateQuery
PARAMETERS JobNumberParam Text(255);
UPDATE [Job Route] r
SET r.[Current] = r.[Current] + 1
WHERE r.[Job Number] = JobNumberParam;
VBA
Private Sub moveJob2_Click()
Dim qdef As QueryDef
Dim selectParas As String
' UPDATE JOIN QUERY
Set qdef = CurrentDb.QueryDefs("mySavedJoinUpdateQuery")
qdef!JobNumberParam = Text31
qdef!Text33Param = Text33
qdef!Text35Param = Text35
qdef!Text37Param = Text37
qdef.Execute dbFailOnError
Set qdef = Nothing
' UPDATE SIMPLE QUERY
Set qdef = CurrentDb.QueryDefs("mySavedSimpleUpdateQuery")
qdef!JobNumberParam = Text31
qdef.Execute dbFailOnError
Set qdef = Nothing
' REQUERY LIST BOXES
listRemoveJobs.Requery
listChangeJobArea.Requery
End Sub