Перебирает столбец Access и находит дубликаты

#sql #loops #ms-access #vba

#sql #циклы #ms-access #vba

Вопрос:

У меня есть форма в MS Access для добавления новых записей, и я пытаюсь создать код VBA, который будет запущен после обновления формы. Что я пытаюсь сделать, так это перебрать столбец в таблице, связанной с формой, и проверить, есть ли добавленное значение в столбце уже, если да, обновите другой столбец с именем «дубликат» для всех повторяющихся записей на «да».

Например, если пользователь добавил «Mike Down» и в таблице уже есть запись с этим именем, столбец «дублировать» для всех записей с этим именем будет обновлен до «да». Я совершенно новичок в доступе к VBA, и пока я только нашел, как выполнить цикл:

 Dim dbsMyDB As DAO.Database
Dim rstMyTable As DAO.Recordset
Dim frmForm As Form
intI = 1
With rstMyDB
    Do Until .EOF
    Loop
        If rstMyTable.Name = frmForm.Name Then
        .Edit
        --update column duplicate to "yes" for all duplicates
        .Update
        .MoveNext
        intI = intI   1
End With
  

Комментарии:

1. Зачем вам нужен столбец «дубликат»? Достаточно просто запросить дубликаты, и для этого не требуется вручную обеспечивать целостность данных.

2. Вы пытаетесь избежать дублирования или просто помечаете их как дубликаты? Будет ли первая запись считаться дубликатом после добавления второй записи?

3. Все записи имеют уникальный первичный ключ типа int, и дублирование записи невозможно. Я пытаюсь пометить только все повторяющиеся имена, не пытаясь их избежать, и да, первая запись также будет считаться дубликатом. Эта проверка может быть выполнена также для номера телефона или адреса электронной почты, но сначала я хочу посмотреть, возможно ли это вообще. Мы пытаемся узнать, подал ли человек заявку во второй раз.

Ответ №1:

Используйте RecordsetClone:

 Dim rst As DAO.Recordset

Set rst = Me.RecordsetClone

With rst
    Do Until .EOF
        If !Name.Value = Me!Name.Value Then
            If !ID.Value <> Me!ID.Value Then
                .Edit
                    !Duplicate.Value = True
                .Update
            End If
        End If
        .MoveNext
    Loop
End With

Set rst = Nothing
  

Комментарии:

1. Это работает, но возможно ли, чтобы только что добавленная запись также была помечена как дубликат? Сейчас это работает так: когда добавляется запись с тем же именем, только первая будет помечена как повторяющаяся, а не вторая.

2. Работает нормально, но знаете ли вы, почему он срабатывает только при закрытии формы? Если 10 имен вводятся одно за другим и среди них есть дубликаты, код не запускается.

3. Вызовите код в событии AfterUpdate формы.