Запись была изменена ошибка, если данные были изменены с помощью VBA - PullRequest
1 голос
/ 20 июня 2020

У меня есть база данных MS Access (2016), использующая связанные таблицы с базой данных MySQL. В базе данных доступа у меня есть форма, которую я использую для ввода данных. Мне нужно было пересчитывать определенные поля (вручную), когда я нажимаю кнопку Recal c.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю код VBA для обновления полей в форме, если я затем попробую для перехода к другой записи я получаю сообщение об ошибке «Эта запись была изменена другим пользователем с тех пор, как вы начали ее редактировать…»

Я единственный пользователь, имеющий доступ к этой базе данных. Все работает нормально, если я НЕ обновляю связанное поле в форме. Как только я это сделаю, я получаю эту ошибку при переходе к следующей записи.

Вот мой код vba для кнопки Recal c:

Private Sub Recalculate()
    vendorID = Me.product_supplier_id
    supplierID = "supplier_id=" & vendorID

    supplierHandling = Me.product_handling
    vendorFee = Me.product_vendor_fee
    supplierMarkupPercent = DLookup("supplier_markup_percent", "suppliers", supplierID)
    supplierMarkupFixed = DLookup("supplier_markup_fixed", "suppliers", supplierID)

    productCost = Me.product_cost
    productShipping = Me.product_shipping
    totalCost = productCost + productShipping + supplierHandling
    totalCost = totalCost + vendorFee
    markup = supplierMarkupFixed + (totalCost * supplierMarkupPercent)
    productPrice = (totalCost + markup) / 0.85
    amzFee = productPrice * 0.15
    totalCost = totalCost + amzFee
    profit = productPrice - totalCost

    Me.product_total_cost = totalCost
    Me.product_price = productPrice
    Me.product_profit = profit

    SetPriceColor
End Sub

3 оператора в конце (до SetPriceColor) виноваты.

Я не знаю, как решить эту проблему. Я просмотрел множество поисков в Google, но ничего не подсказывает мне решение для этого конкретного случая c.

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Да, проблема связана со связанными таблицами ODB C. Плюс столбцы с числами с плавающей запятой, которые могут вызвать проблемы, когда Access проверяет, конфликтуют ли ваши изменения в связанной форме (будь то VBA или вручную) с предыдущей версией сохраненной записи.

Решение должно заключаться в добавлении столбец TIMESTAMP с DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP в вашу таблицу.

Из здесь :

ALTER TABLE myTable
ADD COLUMN updated_at 
  TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
  ON UPDATE CURRENT_TIMESTAMP;

См. эти вопросы:

Сообщения о конфликте записи внезапно начинают появляться в ODB C связанные таблицы

Есть ли у MySQL эквивалент SQL Server rowversion?

Для таблиц, связанных с SQL Сервером, добавление столбца ROWVERSION определенно решает проблему. Для MySql (и его драйвера ODB C) он должен работать, и здесь он работал.

0 голосов
/ 23 июня 2020

Когда у вас есть связанная база данных SQL с базой данных Access, вам необходимо убедиться в наличии нескольких вещей.

Что касается SQL, то SQL Таблица должна иметь первичный ключ и поле Timestamp, где тип данных - timestamp.

На стороне доступа, при обращении к таблицам и использовании наборов записей, включают dbOpenDynaset и dbSeeChanges. Вот пример:

Dim qry As String
Dim rs As Recordset

qry = "SELECT * FROM yourtable"
Set rs = CurrentDB.OpenRecordset(qry, dbOpenDynaset, dbSeeChanges)

Это должно остановить появление вашей ошибки. Кроме того, если вы вносите изменения в таблицу SQL, база данных Access не всегда будет улавливать эти изменения, поэтому вам нужно обновить sh свои соединения с помощью диспетчера связанных таблиц.

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