2015-10-09 3 views
1

Я создаю довольно сложную базу данных для моих ограниченных (но медленно растущих) знаний о базе данных и программировании. Итак, я очень ценю вашу помощь.Как удалить дубликаты из источника записей формы в 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; 

форму поиска выглядит следующим образом:

Search Form

код 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

ответ

0

Я продвигаюсь вперед.

Я смог успешно подсчитать количество записей.

код я использую здесь:

If DCount("*", "qryRecordSet", "BuildingFK = " & Me.txtBuildingID & " And  RoomsPK = " & Me.txtRoomsID > 1) Then 
       MsgBox "There are duplicates!" & vbCrLf & vbCrLf 
       'Code to remove duplicate records here 
       End If 

MsgBox только для устранения неполадок. Но я протестировал его и подтвердил, что он работает. Теперь мне нужно применить это к фильтру формы. Это будет Me.Filter. В настоящее время это Me.Filter = strWhere.

В принципе, мне нужно дополнительно отфильтровать strWhere, чтобы больше дубликатов не было. Как мне это сделать?

Смежные вопросы