Avatar billede cc2000 Nybegynder
27. maj 2002 - 08:23 Der 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.

How do I do that? :)
27. maj 2002 - 08:25 #1
du vil altså kunne sammenligne 2 poster og vise de kolonner, somer forskellige? Er det korrekt forstået?
Avatar billede cc2000 Nybegynder
27. maj 2002 - 08:29 #2
Ja er det.
27. maj 2002 - 08:36 #3
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
27. maj 2002 - 08:37 #4
Funktionen skal selvfølgelig tilpasses din tabel og dine nøglefelter.
Edvidere forudsætter den at ID er primærnøglen (eller i hvert fald unik)

ID erstattes med dit nøglefelt
[DinTabel] erstattes med tabelnavnet
27. maj 2002 - 08:43 #5
Er du med på hvordan du bruger funktionen?
Avatar billede terry Ekspert
27. maj 2002 - 08:47 #6
Msgbox("Diff = " & Dlookup("komponenter", "tblkomponenter", "ID = " & InputBox("Indast start",,"")) - Dlookup("komponenter", "tblkomponenter", "ID = " & InputBox("Indast slut",,""))  )

You can place this in the on click event for a buton on a form
Avatar billede cc2000 Nybegynder
27. maj 2002 - 08:48 #7
Via Visual Basic right?

Men funktionen skal køres via en knap man trykker på og den skal hente de 2 id´er fra to felter.

Så er i gang med at prøve at lave den om så den virker.
Avatar billede terry Ekspert
27. maj 2002 - 08:51 #8
You will need to alter some of the names

Dlookup("komponenter", "tblkomponenter", "ID =

komponenter = name of field you want to compare
tblkomponenter = name of table
ID = the field containing number you want to compare
27. maj 2002 - 08:53 #9
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
27. maj 2002 - 08:56 #10
Og du er selvfølgelig med på, at du skal have en reference til DAO!?
Avatar billede cc2000 Nybegynder
27. maj 2002 - 08:58 #11
Næææ... faktisk ikke :)
27. maj 2002 - 09:01 #12
hvilken version af Access bruger du?

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.
27. maj 2002 - 09:02 #13
Well, jeg er lige på vej til en kunde, men vil checke om ½-1 times tid igen, hvis du skulle have nogle spørgsmål....
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:03 #14
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
Avatar billede terry Ekspert
27. maj 2002 - 09:05 #15
cc2000>have you tried my soultion?
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:07 #16
Terry no. But i can try. :)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:11 #17
Terry...
name of field you want to compare <--- its not a static value so i cant use your solution, if i read it right what you have written.
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:15 #18
Thomas... jeg har prøvet at ændre ID1 og ID2 til henholdsvis Soeg og Compare som mine felter hedder. Så siger den Type mismatch.
Avatar billede terry Ekspert
27. maj 2002 - 09:20 #19
Are yousaying that there is more than one field you want to compare ?
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:21 #20
Terry... yeah... there is about 20-30 fields.
Avatar billede terry Ekspert
27. maj 2002 - 09:23 #21
OK! Hard to see from your question!
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:25 #22
Yeah... sorry :)
27. maj 2002 - 09:25 #23
Har du prøvet:
Call CompareRecords(Me!Soeg, Me!Compare)
27. maj 2002 - 09:28 #24
Hi Terry->
Hvis du læser mit første indlæg (27/05-2002 08:25:56) så fremgår det heraf og af cc2000's efterfølgende svar :o)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:29 #25
Jups... type mismatch
27. maj 2002 - 09:32 #26
kan du prøve at indsætte funktioenen som den ser ud hos dig?
27. maj 2002 - 09:34 #27
og hvor stiller Access sig, når den kommer med den fejl? Hvilken linie/ord er markeret?
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:34 #28
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
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:35 #29
Call CompareRecords(Me!Soeg, Me!Compare)
den linje
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:38 #30
undskyld det er uden Call ordet egentlig :)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:40 #31
hmm.. underligt... mente det var uden call ordet... det er faktisk hele sætningen endda. Mig og min hukommelse ;)
27. maj 2002 - 09:43 #32
øhh, hvad mener du? Markere Access hele sætningen?

Hvor har du funktionen liggende? I et modul? Eller i formularen?
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:45 #33
Access markerer Call CompareRecords(Me!Soeg, Me!Compare)
Altså gennem Microsoft Visual Basic.
Det ligger i formularen.
27. maj 2002 - 09:50 #34
Prøv at vælge menuen Debug->Compile&#8230;. Og se om den kommer med en fejl?
27. maj 2002 - 09:52 #35
Debug->Compile...
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:52 #36
ingen fejl
27. maj 2002 - 09:55 #37
Prøv at omdøbe feltet Compare til f.eks. txtCompare.
Og derefter koden:
Call CompareRecords(Me!Soeg, Me!txtCompare)

Compare er måske et reserveret ord!
Avatar billede cc2000 Nybegynder
27. maj 2002 - 09:57 #38
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.
27. maj 2002 - 10:02 #39
Men du har rettet
Call CompareRecords(Me!Soeg, Me!txtCompare)
til
Call CompareRecords(Me!ID1, Me!ID2)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:04 #40
Ja
27. maj 2002 - 10:09 #41
hmmm....går lige i tænkeboks ;o)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:10 #42
Tror nok jeg har fundet fejlen. Glemte at fortælle at det ID der bruges indeholder bogstaver. Har det ikke noget med det at gøre? *fløjt*
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:13 #43
Næste fejl
Syntax Error (missing operator) in query expression 'Code = 152b0001'.
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:14 #44
Runtime Error: 3075
27. maj 2002 - 10:14 #45
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.
27. maj 2002 - 10:14 #46
Bogstaver...ja i høj grad...vent...
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:15 #47
Jeg har prøvet at ændre den til String istedet for Long :)
27. maj 2002 - 10:16 #48
Prøv denne så:

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
27. maj 2002 - 10:17 #49
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)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:17 #50
Jups det virker :))
Takker :)
Avatar billede cc2000 Nybegynder
27. maj 2002 - 10:17 #51
Ja det så jeg :)
27. maj 2002 - 10:22 #52
pyh :o)

tak for point !! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester