Я создаю довольно сложную базу данных для моих ограниченных (но медленно растущих) знаний о базе данных и программировании. Итак, я очень ценю вашу помощь.Как удалить дубликаты из источника записей формы в Access
В базе данных отслеживаются клиенты, здания, комнаты и оборудование, которые находятся в комнатах.
У меня есть форма поиска, которая фильтрует запрос объединения, который я сделал, что запрашивает почти всю базу данных. SQL ниже:
SELECT tblcustomer.organizationfk,
tblcustomer.shopnamefk,
tblcustomer.officesymfk,
tblcustomer.lastname,
tblcustomer.firstname,
tblfacilitymgr.buildingfk,
tblrooms.roomspk,
tblbuilding.buildingname,
tblrooms.roomname,
tblcabinet.cabinetname,
tblequipment.cabinetfk,
tblequipment.equipmentnamefk,
tblequipment.equipmentbrandfk,
tblequipment.equipmentnetworktypefk
FROM ((tblbuilding
INNER JOIN tblrooms
ON tblbuilding.buildingpk = tblrooms.buildingfk)
INNER JOIN (tblcustomer
INNER JOIN tblfacilitymgr
ON tblcustomer.customerpk =
tblfacilitymgr.customerfk)
ON tblbuilding.buildingpk = tblfacilitymgr.buildingfk)
LEFT JOIN (tblcabinet
LEFT JOIN tblequipment
ON tblcabinet.cabinetpk = tblequipment.cabinetfk)
ON tblrooms.roomspk = tblcabinet.roomsfk
UNION
SELECT tblcustomer.organizationfk,
tblcustomer.shopnamefk,
tblcustomer.officesymfk,
tblcustomer.lastname,
tblcustomer.firstname,
tblrooms.buildingfk,
tblrooms.roomspk,
tblbuilding.buildingname,
tblrooms.roomname,
tblcabinet.cabinetname,
tblequipment.cabinetfk,
tblequipment.equipmentnamefk,
tblequipment.equipmentbrandfk,
tblequipment.equipmentnetworktypefk
FROM ((tblbuilding
INNER JOIN tblrooms
ON tblbuilding.buildingpk = tblrooms.buildingfk)
LEFT JOIN (tblcabinet
LEFT JOIN tblequipment
ON tblcabinet.cabinetpk = tblequipment.cabinetfk)
ON tblrooms.roomspk = tblcabinet.roomsfk)
INNER JOIN (tblcustomer
INNER JOIN tblroomspoc
ON tblcustomer.customerpk = tblroomspoc.customerfk)
ON tblrooms.roomspk = tblroomspoc.roomsfk;
форму поиска выглядит следующим образом:
код cmdsearch здесь:
Option Compare Database
Option Explicit 'always set this It will point out errors with field/vaiable names
Private Sub cboSearchLastName_AfterUpdate()
Me.cboSearchFirstName.Requery
End Sub
Private Sub cboSearchOrganization_AfterUpdate()
Me.cboSearchShopName.Requery
End Sub
Private Sub cboSearchShopName_AfterUpdate()
Me.cboSearchOfficeSym.Requery
End Sub
Private Sub cmdReset_Click()
Me.cboSearchBuildingName = ""
Me.cboSearchRoomName = ""
Me.cboSearchOrganization = ""
Me.cboSearchShopName = ""
Me.cboSearchOfficeSym = ""
Me.cboSearchLastName = ""
Me.cboSearchFirstName = ""
Me.FilterOn = False
End Sub
Private Sub txtBuildingID_AfterUpdate()
Me.lstFacilityMgr.Requery
End Sub
Private Sub txtRoomsID_AfterUpdate()
Me.lstRoomsPOC.Requery
End Sub
Private Sub cmdSearch_Click()
Dim strWhere As String
Dim lngLen As Long
Dim startStr As String
If Not IsNullOrEmpty(Me.cboSearchLastName) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[LastName] ='" & Me.cboSearchLastName & "'"
End If
If Not IsNullOrEmpty(Me.cboSearchFirstName) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[FirstName] ='" & Me.cboSearchFirstName & "'"
End If
If Not IsNullOrEmpty(Me.cboSearchOrganization) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[OrganizationFK] =" & Me.cboSearchOrganization
End If
If Not IsNullOrEmpty(Me.cboSearchShopName) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[ShopNameFK] =" & Me.cboSearchShopName
End If
If Not IsNullOrEmpty(Me.cboSearchOfficeSym) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[OfficeSymFK] =" & Me.cboSearchOfficeSym
End If
If Not IsNullOrEmpty(Me.cboSearchBuildingName) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[BuildingFK] =" & Me.cboSearchBuildingName
End If
If Not IsNullOrEmpty(Me.cboSearchRoomName) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[RoomsPK] =" & Me.cboSearchRoomName
End If
If Not IsNullOrEmpty(Me.cboSearchEquipmentName) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[EquipmentNameFK] =" & Me.cboSearchEquipmentName
End If
If Not IsNullOrEmpty(Me.cboSearchEquipmentSerialNo) Then
startStr = IIf(strWhere = "", "", " AND ")
strWhere = strWhere & startStr & "[SerialNoFK] =" & Me.cboSearchEquipmentSerialNo
End If
Call MsgBox(strWhere, vbOKOnly, "Debug")
lngLen = Len(strWhere) - 5
If lngLen <= 0 Then
MsgBox "No criteria", vbInformation, "Nothing to do."
Else
'strWhere = Left$(strWhere, lngLen)
MsgBox strWhere
If DCount("*", "qryRecordSet", strWhere) = 0 Then
MsgBox "No corresponding records to your search criteria." & vbCrLf & vbCrLf
Me.FilterOn = False
Me.cboSearchBuildingName = ""
Me.cboSearchRoomName = ""
Me.cboSearchOrganization = ""
Me.cboSearchShopName = ""
Me.cboSearchOfficeSym = ""
Me.cboSearchLastName = ""
Me.cboSearchFirstName = ""
Else
Me.Filter = strWhere
Me.FilterOn = True
End If
End If
End Sub
Function IsNullOrEmpty(val As Variant) As Boolean
'First conditional validates for Nothing
'Second condition validates for an Empty String situation "" or " "
Dim ret As Boolean: ret = False
If IsMissing(val) Then
ret = True
ElseIf (val Is Nothing) Then
ret = True
ElseIf (val & vbNullString = vbNullString) Then
ret = True
ElseIf (Len(Trim(val)) <= 0) Then
ret = True
End If
IsNullOrEmpty = ret
End Function
Моя форма поиска работает отлично. Проблема, с которой я сталкиваюсь, заключается в том, что некоторые поисковые запросы возвращают повторяющиеся результаты. Это связано с тем, что запрос объединения содержит повторяющиеся результаты. Я не знаю, как создать запрос, содержащий всю необходимую мне информацию, и не создавать повторяющиеся результаты. Потому что один клиент может быть менеджером объекта для нескольких зданий, одно здание может иметь несколько менеджеров объектов. Один клиент может быть точкой контакта для нескольких комнат, в одной комнате может быть несколько POC. Оборудование может находиться только в одной комнате.
Чтобы уточнить, если в здании «А» в комнате «1100» есть три КОС, то, если я ищу здание А, комната 1100, я вижу три результата. Мне нужно только увидеть один результат.
У меня есть два текстовых поля на моей форме (скрыто, поэтому пользователь их не видит). txtBuildingID и txtRoomsID. Все остальное в запросах формы на основе этих двух текстовых полей. Мне нужно, чтобы комбинация этих двух текстовых полей была уникальной. Это потому, что, если я ищу только здание «А», а здание А имеет три комнаты, я должен увидеть ID здания 1/номер ID 1 ... ИД здания 1/Номер ID 2 и т. Д.
Причина для это потому, что я хочу фильтровать с использованием нескольких критериев, но отображать только уникальный идентификатор id/комнаты здания. Это потому, что, если я ищу «Смит», и он является POC для строительства A, Room 1100, я хочу видеть это здание/комнату и всю информацию об этой комнате. Потому что, если кузнец не отвечает на свой телефон, я могу позвонить «Джонс».
Мне все равно, какая запись удаляется, если у меня есть уникальные записи между двумя текстовыми полями. Я не знаю достаточно о SQL, но из того, что мало знаю, я не думаю, что это можно сделать с SQL. Я думаю, мне нужно использовать, возможно, DCount для подсчета записей, а затем удалить дубликаты. Я не знаю, как это сделать. Я провел дни в Google, я даже не приблизился к решению. В лучшем случае, если я когда-либо получу синтаксис, я могу подсчитать количество дубликатов (более 1 уникальной записи между buildingfk и roomspk), но тогда я не уверен, как удалить дубликаты. Или если мне нужно указать, какой дубликат удалить. Лично, пока они удаляются, мне все равно.
Я спросил у своего знакомого, который очень хорошо справляется с программированием, и он его бросил. Он посоветовал мне спросить здесь. Поэтому я очень ценю вашу помощь здесь. Query