Пишите конфликты - даже со мной - PullRequest
1 голос
/ 28 мая 2009

В приложении, которое я пишу, я получаю конфликты записи, когда я использую код VBA для изменения значения флажка в форме. Я попытался вставить следующий код в события, в которых VBA изменяет значения любого объекта в форме:

If Me.Dirty Then
    Me.Dirty = False
End If

Но проблема сохраняется - как будто запись не сохраняется, прежде чем я пытаюсь что-то изменить с помощью ручных манипуляций.

Вот несколько примеров полного кода из формы, где я сталкиваюсь с этой проблемой:

Код для изменения флажка «Чистая цена»:

Private Sub chkSupAllowBlankPrice_AfterUpdate()

    If Me.Dirty Then
        Me.Dirty = False
    End If

    If (chkSupAllowBlankPrice.Value = True) Then
        chkSupRequirePrice.Value = False
    End If
End Sub

Код для изменения флажка Требовать цены:

Private Sub chkSupRequirePrice_AfterUpdate()
    If Me.Dirty Then
        Me.Dirty = False
    End If

    If (chkSupRequirePrice.Value = True) Then
        chkSupAllowBlankPrice.Value = False
        chkSupAllowBlankPrice.Visible = False
        chkSupAllowBlankPrice.Enabled = False
        chkSupAllowBlankPrice.Locked = True
        lblSupAllowBlankPrice.Visible = False
    Else
        chkSupAllowBlankPrice.Visible = True
        chkSupAllowBlankPrice.Enabled = True
        chkSupAllowBlankPrice.Locked = False
        lblSupAllowBlankPrice.Visible = True
    End If
End Sub

Не уверен, поможет ли это, но таблицы хранятся в экспресс-базе данных SQL Server - отсюда и тег.

- отредактировано 29.05.2009 @ 1201 часов -

Я пытался закомментировать все изменения значений объекта, оставляя только видимые, заблокированные и включенные изменения - но я продолжаю получать конфликты записи. Я попытался поместить Me.Dirty = False в конце процедуры события, и я даже попытался удалить его. Пока что я получаю конфликты записи всякий раз, когда я изменяю Требовать цену или Разрешить пустую цену, без изменения другого значения кодом VBA.

- отредактировано 29.05.2009 @ 1318 часов -

Поля, которыми эти флажки манипулируют, не будут принимать какие-либо изменения после создания записи, создавая конфликт записи каждый раз, когда я пытаюсь с ними работать. Теперь я в полном замешательстве, думая о том, чтобы все потрошить и начать все сначала.

- отредактировано 01.06.2009 @ 1209 часов -

После исследования кажется, что на сервере определен ряд проверочных ограничений для задействованных таблиц, которые я не могу удалить. Что-то заставляет связанные таблицы всегда сообщать о загрязнении, даже если элементы не были изменены - и я думаю, что Access и SQL борются со значениями по умолчанию. Я собираюсь стереть все таблицы, удалить всю информацию и начать заново с моим дизайном, так как проверочные ограничения, по-видимому, не снимаются без опускания таблицы в любом случае. Спасибо всем за помощь, мог ли этот вопрос быть закрыт - ссылаясь на проблему с этим новым вопросом ( Обновление записей не разрешено - Конфликт записи )?

- отредактировано 03/03/2009 @ 1307 часов -

Кросс-пост от другого вопроса, решение описано ниже для всего, что было любопытно. Спасибо всем людям, которые ударили меня по голове, чтобы получить это далеко, я действительно рассчитываю на помощь. Я обнаружил, что странная проблема возникает при использовании флажков Да / Нет и SQL Server с Access. Очевидно, Access будет интерпретировать NULL как Нет - при изменении значения, но SQL Server не будет интерпретировать NULL как поле Нет в бите (во что да / нет превращается при преобразовании), поэтому он выдает ошибку Write Conflict, когда значение не требуется, и имеет значение NULL. Решение состояло в том, чтобы изменить структуру таблицы таким образом, чтобы было необходимо значение и чтобы для КАЖДОГО прежнего флажка Да / Нет было назначено значение по умолчанию. Это решило загадочные сообщения о конфликте записи и позволило вносить изменения в записи после их создания.

Ответы [ 3 ]

1 голос
/ 29 мая 2009

Несколько комментариев:

  • есть ли какая-то особая причина, по которой вы сохраняете данные формы (установите Dirty=false) перед изменением значения другого поля (что снова сделает форму грязной)?
    Сначала я изменил бы данные другого поля , а затем сохранил данные формы, в противном случае форма всегда грязная .

  • изменение значений элемента управления из кода не вызывает их события, поэтому изменение значения chkSupRequirePrice с chkSupAllowBlankPrice_AfterUpdate() не вызовет chkSupRequirePrice_AfterUpdate().

  • Вместо того, чтобы помещать определенный код в каждое событие, лучше перегруппировать все в одну, скажем, подпрограмму Update(), вызываемую из каждого обработчика события.
    Это облегчит управление вашим кодом и его побочными эффектами, потому что это один и тот же фрагмент кода, который вызывается постоянно.

  • сказав это, ваш код должен работать , поэтому я предполагаю, что проблема возникла где-то еще в вашем коде.
    Конфликты записи происходят, если одна и та же запись уже открыта для редактирования в другом месте.
    Вы можете поиграть с типом блокировки и посмотреть, изменит ли он что-либо.

  • чтобы увидеть, действительно ли проблема связана с настройкой SQL Server, попробуйте отсоединить таблицу и вместо этого скопировать ее в локальную базу данных Access, чтобы проверить, не возникла ли эта проблема при работе с локальным Access. стол.

0 голосов
/ 29 июня 2009

Существует различие между тем, как Access обрабатывает значения флажков Да / Нет, и SQL Server. При переводе логических значений «Да / Нет» из Access в SQL Server необходимо помнить, чтобы определить состояние по умолчанию, а также пометить его как требующий ответа. В противном случае вы будете получать конфликты записи каждый раз, и это будет препятствовать сохранению записи с вашими изменениями после установки начальных значений.

0 голосов
/ 28 мая 2009

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

...