Как я могу получить последнее значение вставки из базы данных MySQL и обновить поле в Access? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть сложная база данных, включающая человеческие останки, поэтому формы доступа для ввода данных также довольно сложны.У меня есть несколько подчиненных форм (Skeleton_index, Element_index и несколько других).Две подформы, которые я назвал по имени, отправляют данные в соответствующие поля (element_link, skeleton_link) в несвязанной главной форме, откуда данные используются другими формами.Для Skeleton_index пользователь должен ввести имя человека, и оно сразу же появится в поле skeleton_index.У меня проблема в том, что я не хочу, чтобы пользователь вводил данные первичного ключа для Element_index, как это должно происходить в auto_increment.Это проблема, потому что автоматически увеличенное значение в Element_id не появляется в поле element_link сразу.Чтобы показать это, пользователь должен создать новый элемент и затем вернуться к тому, который он редактировал.Я хочу избежать этого.

Я хочу обновить текстовое поле Element_id до нового первичного ключа auto_increment, когда он получит фокус.Код VBA должен извлечь последний первичный ключ из таблицы Element_index в MySQL (InnoDB), добавить один к нему и затем обновить значение в поле Element_id в форме Element_index.

Это моя попытка, и это простоне удается.

Private Sub Element_id_GotFocus()
    SQL = "SELECT LAST_INSERT_ID();"
    lastID = DoCmd.RunSQL(SQL)
    newID = Int(lastID) + 1
    Element_id.Value = newID
End Sub

РЕДАКТИРОВАТЬ:

База данных будет иметь одного пользователя в первом случае, но может быть больше в будущем.

РЕШЕНИЕ: я добавилкнопка с двумя макросами: одна, которая сохраняет вставленную запись, и вторая, которая обновляет форму.Нет необходимости в сложных VBA.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Я полагаюсь на ошибку, когда ID недействителен.

Сначала получите max (ID), затем увеличьте и, наконец, выполните Insert-Query с увеличенным ID. Если ошибки нет, у вас есть идентификатор для FK, в случае ошибки обработайте его (например, повторите попытку со следующим шагом)

On Error Goto myErrHandler
Dim newID as Long
newID = Nz(DMax("ID","myTable"),0) + 1
With CurrentDb()
    .Execute "INSERT INTO myTable (ID) Values (" & newID & ")", dbFailOnError
End With
'...
' here code for inserts in tables with ID as FK
0 голосов
/ 24 августа 2018

Ваша попытка неверна во многих отношениях. Основные из них:

  1. Вы не можете использовать DoCmd.RunSQL для запуска запросов выбора. Он только выполняет запросы действий.
  2. Вам нужно использовать сквозной запрос для запуска запросов, которые содержат специфичные для MySQL функции.
  3. Вы не можете использовать LAST_INSERTED_ID(), если не выполните его по тому же соединению, которое использовалось для вставки строки в интересующую вас таблицу.

Вам лучше использовать QueryDef для выполнения сквозного запроса и использовать таблицу INFORMATION_SCHEMA.TABLES для получения следующего автономного номера:

'Create a new temporary query, uses `With` instead of storing it in a variable
With CurrentDb.CreateQueryDef("")
    'Make it a pass-through query that connects to MySQL
    .Connect = "ODBC;<enter connection string here>"
    'Set the SQL for the query: queries table definition, gets auto_increment seed
    .SQL = "SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ""<table name here>"" AND TABLE_SCHEMA = ""<database name here>"""
    'The query should return records (not an action query)
    .ReturnsRecords = True
    'Execute the query, get the results into a snapshot-type recordset
    'And set your field equal to the first column of the first row of the recordset
    Element_id.Value = .OpenRecordset(dbOpenSnapshot).Fields(0).Value
End With
...