Поиск дубликатов в Access

Есть таблица в Access 2016 с четырьмя столбцами и форма для ее заполнения. В таблице есть столбцы "Фамилия", "Имя", "Отчество", "Место работы".

Допустим у нас есть запись Иван Иванович Иванов Водитель.

Мы заполняем форму. Вводим Иван Иванович Иванов. Ставим каретку в поле "Место работы". Когда каретка поставлена у нас вылазит MsgBox или что-то похожее с сообщением "В таблице есть запись Иван Иванович Иванов Водитель" и варианты "Продолжить", "Очистить", "Перейти"

Если пользователь нажимает "Продолжить", то ему показывается следующая запись, которая содержит Иван Иванович Иванов или MsgBox исчезает, чтобы можно было ввести данные о работе.

Если у него тот самый Иван Иванович Иванов Водитель, то нажимает "Очистить" и вводит следующего работника.

Если нужно исправить запись. Например, Ивана Ивановича Иванова сделали курьером, то нажимает "Перейти"

Подскажите, как это сделать


Ответы (1 шт):

Автор решения: HMMWV

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

Private Sub PlaceOfWorkTextBox_GotFocus()
    ' Проверяем, является ли текущая запись новой
    If Me.NewRecord Then
        Dim strSQL As String
        Dim rs As Recordset

        ' Проверяем, что Фамилия, Имя и Отчество не пустые
        If IsNull(Me.SurnameTextBox) Or IsNull(Me.NameTextBox) Or IsNull(Me.PatronymicTextBox) Then
            Exit Sub
        End If

        ' Составляем SQL-запрос для проверки существования записи с аналогичными ФИО
        strSQL = "SELECT * FROM Награждаемый WHERE Фамилия='" & Me.SurnameTextBox & "' AND Имя='" & Me.NameTextBox & "' AND Отчество='" & Me.PatronymicTextBox & "'"

        ' Открываем запись и проверяем результат
        Set rs = CurrentDb.OpenRecordset(strSQL)
        If Not rs.EOF Then
            ' Запись с аналогичными ФИО уже существует
            Dim duplicateCount As Long
            duplicateCount = rs.RecordCount

            ' Отображаем количество дубликатов
            MsgBox "Найдено похожих записей: " & duplicateCount, vbExclamation

            ' Выводим каждое совпадение в отдельном сообщении
            Do While Not rs.EOF
                Dim duplicateMessage As String
                duplicateMessage = "Запись " & rs.AbsolutePosition & ":" & vbCrLf
                duplicateMessage = duplicateMessage & "Фамилия: " & rs.Fields("Фамилия").Value & vbCrLf
                duplicateMessage = duplicateMessage & "Имя: " & rs.Fields("Имя").Value & vbCrLf
                duplicateMessage = duplicateMessage & "Отчество: " & rs.Fields("Отчество").Value & vbCrLf
                duplicateMessage = duplicateMessage & "Место работы: " & rs.Fields("Место работы").Value & vbCrLf & vbCrLf

                ' Отображаем каждое совпадение в отдельном сообщении
                MsgBox duplicateMessage, vbExclamation

                ' Предоставляем пользователю возможность перейти к найденной записи
                ' DoCmd.GoToRecord , , acGoTo, rs.AbsolutePosition

                rs.MoveNext
            Loop

            ' Очищаем содержимое PlaceOfWorkTextBox или предоставляем пользователю выбор
            Me.PlaceOfWorkTextBox = ""
            ' Можно также добавить дополнительные действия по уведомлению пользователя
        End If

        ' Закрываем запись
        rs.Close
        Set rs = Nothing
    End If
End Sub

Вообще я хотел его додумать, чтобы в качестве предупреждения использовать не MsgBox, а всплывающее окно, с возможностью очистить содержимое формы, перейти к найденной записи, т.е. мы видим в сообщении, что нужная нам запись уже есть в таблице. Чтобы не тратить время на ее поиск нажимаем перейти и оказываемся на записи.

Буду рад если поможете с реализацией.

→ Ссылка