27. maj 2002 - 08:23Der er
51 kommentarer og 1 løsning
Compare af data
Jeg har en Access database hvor man kan søge efter bestemte numre for at kunne se forskellen mellem de to komponenter. Men nu vil brugerne gerne have at det gøres automatisk. Altså at man skriver de to tal man vil kigge på, og der kommer så en msgbox op på skærmen, hvor den fortæller hvad der er forskelligt mellem de to komponenter.
Hvordan gøres det? Har kigget forgæves over alt og prøvet et par sql-kommandoer, men kan ikke finde den rigtige kommando til at søge kun i en kolonne af gangen.
Denne funktion sammenligner 2 poster og udskriver en msgbox med de felter, som er forskellige:
Public Function CompareRecords(ID1 As Long, ID2 As Long) Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim Besked As String, n As Byte Set rs1 = CurrentDb.OpenRecordset("Select * From [DinTabel] Where ID = " & ID1, dbOpenSnapshot) Set rs2 = CurrentDb.OpenRecordset("Select * From [DinTabel] Where ID = " & ID2, dbOpenSnapshot) For n = 0 To rs1.Fields.Count - 1 If rs1(n) <> rs2(n) Then Besked = Besked & rs1(n).Name & " indeholder værdierne " & rs1(n) & " og " & rs2(n) & vbNewLine End If Next n MsgBox Besked rs1.Close rs2.Close Set rs1 = Nothing Set rs2 = Nothing End Function
ok, det er klart, at den skal tilpasses. På knappens Click-event, kan du f.eks. skrive:
Private Sub cmdFindForskelle_Click() Call CompareRecords(Me!ID1, Me!ID2) End sub
Endvidere bør man også udskrive en besked, hvis der slet ikke er nogle forskelle (hvis dette overhovedet kan forkomme?) Det kan løses ved at lave den sidste del af funktionen således: ... Next n If Len(Besked) = 0 then msgbox "Der er ingen forskelle!", vbinformation else MsgBox Besked endif rs1.Close rs2.Close Set rs1 = Nothing Set rs2 = Nothing End Function
Hvis du brugfer Access 97, skal du ikke spekulere på det. Hvir du bruger en senere version, skal du (fra VBA-editoren) aktivere menuen Tools->References og kontrollere at der er et kryds i "Microsoft DAO 3.x Object Library". Hvis der ikke er, skal du finde den på listen og sætte kryds i den.
Ahh.. okay :) Men den melder fejl når jeg trykker på knappen. Den siger Microsoft Access cant find the field 'ID1' referred to in your expression. Det er i Call'en. Altså:
Private Sub cmdFindForskelle_Click() Call CompareRecords(Me!ID1, Me!ID2) End sub
Public Function CompareRecords(ID1 As Long, ID2 As Long) Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim Besked As String, n As Byte Set rs1 = CurrentDb.OpenRecordset("Select * From OLS Where CODE = " & ID1, dbOpenSnapshot) Set rs2 = CurrentDb.OpenRecordset("Select * From OLS Where CODE = " & ID2, dbOpenSnapshot) For n = 0 To rs1.Fields.Count - 1 If rs1(n) <> rs2(n) Then Besked = Besked & rs1(n).Name & " indeholder værdierne " & rs1(n) & " og " & rs2(n) & vbNewLine End If Next n MsgBox Besked rs1.Close rs2.Close Set rs1 = Nothing Set rs2 = Nothing End Function
Private Sub Compare_Knap_Click() Call CompareRecords(Me!Soeg, Me!Compare) End Sub
har prøvet at omdøbe soeg og compare til id1 og id2 og så lade være med at rette i koden og der melder den om samme fejl. Altså Runtime Error 13. Type mismatch.
Hvad hvis du afprøver koden direkte fra VBA-editoeren? Prøv at trykke Ctrl+G Herefter skriver du: Call CompareRecords(123, 456) Ovenstående 2 numre skal selvfølgelig erstattes med nogle eksisterende numre.
Public Function CompareRecords(ID1 As String, ID2 As String) Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim Besked As String, n As Byte Set rs1 = CurrentDb.OpenRecordset("Select * From OLS Where CODE = '" & ID1 & "'", dbOpenSnapshot) Set rs2 = CurrentDb.OpenRecordset("Select * From OLS Where CODE = '" & ID2 & "'", dbOpenSnapshot) For n = 0 To rs1.Fields.Count - 1 If rs1(n) <> rs2(n) Then Besked = Besked & rs1(n).Name & " indeholder værdierne '" & rs1(n) & "' og '" & rs2(n) & "'" & vbNewLine End If Next n MsgBox Besked rs1.Close rs2.Close Set rs1 = Nothing Set rs2 = Nothing End Function
ja, men der skal lige lidt mere end String til...disse 2 linier skal også rettes: Set rs1 = CurrentDb.OpenRecordset("Select * From OLS Where CODE = '" & ID1 & "'", dbOpenSnapshot) Set rs2 = CurrentDb.OpenRecordset("Select * From OLS Where CODE = '" & ID2 & "'", dbOpenSnapshot)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.