Проблемы с обновлением MySQL и Access

0

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

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

  • 0
    Яблоки имеют какое-либо отношение к вашему заявлению или дате? Хорошо подумай. Это не может быть просто случайным.
  • 0
    Это просто пример, но набор случайных значений - это имя, используемое в других записях работы. Но это значение имени нигде не существует в конкретной записи «Маршрут работы». (person_in_chargeN) И так как вы упомянули об этом, независимо от того, по какому номеру работы они все по какой-то причине имеют одинаковое имя, так что ... это определенно не случайно. Значения текстового поля правильно заполняются из локальной таблицы.
Теги:
odbc
ms-access
access-vba

1 ответ

0

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

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

  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
  • 0
    Спасибо, я попробую это! Надеюсь, это станет тем случаем, когда использование устаревшей / медленной механики VBA послужило причиной, по которой при обновлении были установлены разные значения. Я знал, что DAO на самом деле не рекомендуется использовать в эти дни, но я надеюсь, что это вызвало случайную ошибку обновления. Эта ошибка случается редко, поэтому, если я не увижу, что ошибка происходит сама, я не могу отследить ее и причину.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню