Проблемы с обновлением MySQL и Access - PullRequest
0 голосов
/ 28 февраля 2019

Так что это проблема, которая начала происходить день назад.

У меня есть файл базы данных Access, в котором хранится форма для создания заданий, обновления сектора заданий и удаления из таблицы MySQL.

Для этой формы используются две таблицы: локальная, хранящаяся в Access с именем «Маршрут задания», и другая с помощью драйвера ODBC для MYSQL, версия ANSI 5.3, называемая «To Do».Локальная таблица хранит предоставленные пользователем данные, содержащие информацию обо всех областях работы и состоянии, в то время как таблица MYSQL показывает только одну область работы за раз.

Когда создается новая запись, текстовое поле подробно из AccessФорма хранится в обеих таблицах.Если каждое задание содержит до 4 различных секторов (например, [дата начала], [область1], [ответственное лицо 1], [описание1], ... [область4], [ответственное лицо 4], [описание4]).Всякий раз, когда данные обновляются до следующего состояния, в локальной таблице увеличивается только поле счетчика заданий, а каждое поле в таблице MYSQL с именем «Задачи» обновляется до следующих полей состояния.

Соединениек серверу это хорошо, и все работало нормально, пока не возникла проблема в функции обновления.

По сути, эта функция работает так, что в элементе управления списком все текущие данные задания запрашиваются из таблицы «Задачи».Пользователь выбирает запись и нажимает кнопку, которая загружает информацию о следующем секторе из «Маршрута задания» в различные элементы управления текстовым полем.Пользователь может изменить эти входные данные текстового поля, если они хотят - единственное, что изменяется при запуске функции, это «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, имеющая проблемы со стабильностью в соединении?Почему при обновлении значение меняется на что-то совершенно другое?Любое понимание будет оценено.

1 Ответ

0 голосов
/ 01 марта 2019

Хотя нет воспроизводимого примера, который бы помог в вашей конкретной ситуации, рассмотрите возможность выполнения запросов чистого SQL UPDATE с привязанными параметрами.Вашу условную логику area можно переписать во вложенное выражение IIF.Возможно, это упростит вашу проблему и оптимизирует ваши потребности без DLookup или нескольких обновлений набора записей.Кроме того, ваше переназначение на RowSource не является необходимым.Ниже используется параметризация, которая рекомендуется при запуске SQL на уровне приложений:

SQL (сохраните оба ниже как запросы Access)

  1. 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;
    
  2. 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
...