MS Access - проверьте форму перед отправкой на наличие дубликатов - PullRequest
0 голосов
/ 24 октября 2010

У меня есть подчиненная форма (CustomersAnswersSub) внутри главной формы (CustomersAnswers). При входе в новую запись customerAnswersSub - я хотел, чтобы она сначала проверила наличие дубликатов.

Он должен проверять 4 разных поля, чтобы соответствовать первым.

Это то, что у меня так далеко.

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim rsGlobals As ADODB.Recordset
    Dim sql
    Set rsGlobals = New ADODB.Recordset
    sql = "Select * From CustomerAnswerD where subscriptionNo=" & _
        Me.subscriptionNo & " AND journal=" & Me.Journal & _
        " AND volume=" & Me.volume & " AND issue=" & Me.issue
    rsGlobals.Open sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdText
    If Not rsGlobals.BOF And Not rsGlobals.EOF Then
        MsgBox ("Already entered")
        Cancel = True
        Me.Undo
    End If
End Sub

он ничего не делает - просто сидит там. когда я закрываю форму, появляется всплывающее окно - идентификатор уже существует.

Любая идея, я довольно неопытен, когда дело доходит до Access VB.

спасибо

1 Ответ

1 голос
/ 24 октября 2010

ничего не делает - просто сидит там

Просто проверяю, так как вы сказали, что неопытны с Access ... событие обновления формы не запускается, пока не будет предпринята попытка сохранения записи. Это может не произойти автоматически, как только пользователь вводит данные во все поля. Однако вы можете запустить обновление, перейдя к другой записи в подчиненной форме или выбрав такой метод, как «Главное меню» - «Сохранить запись из доступа» (2003).

Я не вижу ничего плохого в вашей процедуре BeforeUpdate. Тем не менее, я бы преобразовал его, используя функцию DCount () вместо открытия набора записей ADO. (См. Раздел справки Access для DCount)

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim strCriteria As String
    strCriteria = "subscriptionNo=" & Me.subscriptionNo & " AND journal=" & Me.Journal & _
        " AND volume=" & Me.volume & " AND issue=" & Me.issue
    Debug.Print strCriteria
    If Dcount("subscriptionNo", "CustomerAnswerD", strCriteria) > 0 Then
        MsgBox ("Already entered")
        Cancel = True
        Me.Undo
    End If
End Sub

Предполагается, что поля подпискиNo, журнала, тома и выпуска таблицы являются числовыми типами данных. Если какой-либо из них имеет текстовый тип, вам необходимо заключить значения в кавычки в strCriteria.

Я добавил Debug.Print strCriteria , чтобы вы могли просмотреть законченное строковое выражение в окне «Немедленно». Вы также можете устранить неполадки этой завершенной строки, скопировав ее и вставив в представление SQL нового запроса в качестве предложения WHERE.

Кроме того, рассмотрите возможность добавления уникального индекса подписки Нет, журнала, тома и выпуска в дизайн таблицы CustomerAnswerD. Таким образом, вы можете обеспечить уникальность, не полагаясь исключительно на свою форму, чтобы сделать это. Индекс также даст вам более высокую производительность с помощью функции DCount или вашего исходного оператора SELECT набора записей.

Если вы сохраняете исходный подход к набору записей, закройте набор записей и установите переменную объекта = Nothing перед выходом из процедуры.

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