Как явно сохранить или закрыть набор записей при деактивации формы? - PullRequest
0 голосов
/ 06 февраля 2020

Я прошу прощения, если это слишком расплывчатый вопрос, но у нас возникла следующая проблема: мы используем форму поиска, чтобы найти запись, а затем загружаем ее в форму с ограниченным контролем, где вносятся изменения. Затем мы возвращаемся в форму поиска и открываем еще одну запись. Когда мы делаем это, свойство BeforeUpdate формы вызывает ошибку 3020, «Обновление без добавления нового или редактирования» и пошаговое выполнение кода, который ссылается на первую открытую запись. Это странно, потому что нет явного вызова обновления, но после долгих проб и ошибок я думаю, что ошибка такова:

Запись # 1 открывается через форму и вносятся изменения. Запись №2 открывается в той же форме без закрытия первого набора записей. Несмотря на то, что мы теперь заново открыли форму со второй записью, Access по-прежнему предполагает, что мы редактируем запись 1, т.е. что мы пытаемся редактировать 2 записи одновременно. То же самое, как если бы у нас была форма таблицы данных, и мы отредактировали одну строку, а затем попытались отредактировать вторую строку без сохранения первой. Я хочу иметь возможность автоматически обновлять первую запись, когда форма деактивируется, поэтому загрузка новой записи не вызывает этот конфликт.

Итак, суть такова: ** Есть ли способ, скажем, в событии Dirty или Deactivate формы, что мы можем принудительно обновить и закрыть набор записей формы ** перед загрузкой второй записи?

Надеюсь, я сделал это достаточно ясно, это сложно проблема, поэтому любое небольшое руководство поможет. Кстати, вы можете спросить: «Почему вы используете один и тот же код, чтобы открыть одну и ту же форму дважды?» Хороший вопрос! Эй, это старое и плохо написанное приложение (в нем есть GoSubs ради Пита), но у меня нет выбора, кроме как выбрать лучшее из плохой ситуации.

РЕДАКТИРОВАТЬ: меня попросили опубликовать код, который разумно, но это в нескольких разных местах. Итак, у меня есть форма данных, она имеет кнопку «Поиск», чтобы go вернуться к форме поиска для открытия другой записи. Кнопка поиска в форме ввода данных:

    Private Sub CommandSearch_Click()
      On Error GoTo Err_CommandSearch_Click
      DoCmd.OpenForm "Reference Form", acNormal 'This is the form that does the searching

    Exit_CommandSearch_Click:
      Exit Sub

    Err_CommandSearch_Click:
      MsgBox Err.Description
      Resume Exit_CommandSearch_Click
    End Sub

Когда в этой форме поиска выбрана запись, открывается новая форма с этим кодом. Теперь это где это становится сложным. Я не оригинальный программист, как я сказал, я думаю, что он был написан в Access 97 кем-то после того, как он потратил час на чтение «Access for Dummies» :). Но всегда выглядит так, будто открыта только одна копия формы, так что, может быть, она открывает ее снова?

Public Sub CommandLoadCase_Click()
  Dim LoadUTUCaseNumber As String, lengthUTUCaseNumber As Integer


  lengthUTUCaseNumber = InStr(Forms![Reference Form]![Reference Query SubForm]![UTU Case Number], "-") - 1
  If (lengthUTUCaseNumber = 0) Then
    LoadUTUCaseNumber = ""
  Else
    LoadUTUCaseNumber = Left$(Forms![Reference Form]![Reference Query SubForm]![UTU Case Number], lengthUTUCaseNumber)
  End If
  On Error Resume Next
  Forms![Case Appeal_Add-On Form].UTUCaseKeyToFind = LoadUTUCaseNumber
  DoCmd.OpenForm "Case Appeal_Add-On Form", acNormal, , , , , LoadUTUCaseNumber
  'Case Appeal Add On Form referred to here is the data entry form I refer to above.
End Sub

Наконец, после выполнения этой строки возникает ошибка 3020 (обновление без добавления / редактирования). в форме ввода данных. (Я знаю, что код сложный, поэтому сначала я его не вводил).

Private Sub Form_BeforeUpdate(Cancel As Integer)
 [UTU Claim Sequence Key] = [UTU Claim Alpha Sequence] & CStr([UTU Claim Numeric Sequence])
End Sub
...