Поиск дубликатов в Access
Есть таблица в Access 2016 с четырьмя столбцами и форма для ее заполнения. В таблице есть столбцы "Фамилия", "Имя", "Отчество", "Место работы".
Допустим у нас есть запись Иван Иванович Иванов Водитель.
Мы заполняем форму. Вводим Иван Иванович Иванов. Ставим каретку в поле "Место работы". Когда каретка поставлена у нас вылазит MsgBox или что-то похожее с сообщением "В таблице есть запись Иван Иванович Иванов Водитель" и варианты "Продолжить", "Очистить", "Перейти"
Если пользователь нажимает "Продолжить", то ему показывается следующая запись, которая содержит Иван Иванович Иванов или MsgBox исчезает, чтобы можно было ввести данные о работе.
Если у него тот самый Иван Иванович Иванов Водитель, то нажимает "Очистить" и вводит следующего работника.
Если нужно исправить запись. Например, Ивана Ивановича Иванова сделали курьером, то нажимает "Перейти"
Подскажите, как это сделать
Ответы (1 шт):
Спасибо ребятам, что уточнили об отсутствии других способов поиска дублирующихся данных, кроме как использование кода 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, а всплывающее окно, с возможностью очистить содержимое формы, перейти к найденной записи, т.е. мы видим в сообщении, что нужная нам запись уже есть в таблице. Чтобы не тратить время на ее поиск нажимаем перейти и оказываемся на записи.
Буду рад если поможете с реализацией.