[VBA] 2 Tabellen vergelijken in MS Access.

Pagina: 1
Acties:
  • 408 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Klinkt simpel maar dat is het dus blijkbaar niet ;)

Ik heb me al helemaal suf gezocht op het internet maar niet echt wat bruikbaars gevonden.

Ik wil het volgende voor elkaar krijgen:

Input: 2 tabellen
1 Tabel expected results en 1 tabel actual results. Deze 2 tabellen wil ik vergelijken. Er moet dus vergeleken worden op veld nivo. Een actual record is pas correct als alle velden matchen met een expected record.
Output: De records uit expected die niet in actual voorkomen.

Het lastige is dat alles generiek en dynamisch moet zijn. Elke willekeurige expected tabel kan dus als basis gebruikt worden. De veld-layout van de expected en actual tabel komen altijd overeen.

Ik heb de unmatched query wizzard geprobeerd maar die werkt maar met 1 veld waarop je kunt vergelijken. Niet echt handig dus.

Ik heb het volgende bedacht, voornamelijk pseudo-code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Do Until expected.EOF
    'Bepalen primary keys expected tabel.
    'Ga naar eerste record expected tabel.
    Do Until actual.EOF
      'Zoek naar record in actual met zelfde primary key.
      If (primaryKey.match) Then
        'Loop door alle expected velden en vergelijk ze met de actual velden.
        If (complete.match) Then
            'Bij een complete match (op alle velden) end do en
            'ga naar volgend expected record.
            'Zorg dat actual weer vooraan staat MoveFirst.
        Else
            'Bij geen complete match (op alle velden) doe voorloping een debug.print.
            'Ga naar het volgende expected record zorg dat actual weer vooraan staat.
        End If
        
      End If
    Loop
Loop

context:
Ik probeer de uitkomst van een test (actual) te vergelijken met een lokaal opgeslagen expected resultaat.

Waarschijnlijk ben ik weer veels te moeilijk aan het doen :P geef me dan even een schop in de goede richting ;)

alvast bedankt.

Acties:
  • 0 Henk 'm!

  • brokenp
  • Registratie: December 2001
  • Laatst online: 14:12
Probeer het eens met SQL, je maakt een join op je id's als ze gelijk moeten zijn.

Ik snap niet helemaal wat je wil, kan je evt een tabelstructuur geven of zo?

Acties:
  • 0 Henk 'm!

Anoniem: 26483

Volgens mij is de enige manier 2 recordsets maken
de ene origineel,
de andere de vergelijk

vervolgens loop je door de velden van de origineel en kijk of a deze in de vergelijk staat en of deze dezelfde inhoud heeft

For each field in rst.fields
'check if field exist
for each field2 in rst2.fields
if field2.name = field.name then
'check inhoud
if fiield2.value = field.value then
jiippiie gelijk

next
next

enigste nadeel, dit kost onnoemelijk veel tijd

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op zondag 28 juli 2002 20:23 schreef brokenp het volgende:
Probeer het eens met SQL, je maakt een join op je id's als ze gelijk moeten zijn.

Ik snap niet helemaal wat je wil, kan je evt een tabelstructuur geven of zo?
Het probleem is dat niet alleen de ID`s gelijk moeten zijn maar alles in het record, dus elk veld in het record moet gelijk zijn.
Op zondag 28 juli 2002 22:20 schreef watnou het volgende:
Volgens mij is de enige manier 2 recordsets maken
de ene origineel,
de andere de vergelijk

vervolgens loop je door de velden van de origineel en kijk of a deze in de vergelijk staat en of deze dezelfde inhoud heeft

For each field in rst.fields
'check if field exist
for each field2 in rst2.fields
if field2.name = field.name then
'check inhoud
if fiield2.value = field.value then
jiippiie gelijk

next
next

enigste nadeel, dit kost onnoemelijk veel tijd
performance is not an issue :P

Ok, nu bekijk je het dus op veld nivo. Maar is het dan nog wel per record....

dit zou opzich wel kunnen maar dan ga je dus eerst zoeken op record nivo naar een match op de primary keys. en daarna ga je bovenstaand stukje code uitvoeren.

Ik ga even een experimentje bouwen...

iig bedankt voor jullie reacties.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de oplossing gevonden zie onderstaande code

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Private Function compareData(tblExpected As String, tblActual As String) As Boolean

On Error GoTo out
compareData = False

Dim strSQL As String
Dim rs_expected As Recordset
Dim rs_actual As Recordset
Dim dbs As Database
Dim fld1 As Field
Dim fld2 As Field
Dim strFind As String
Dim tbl As TableDef
Dim idx As Index
Dim fld As Field

Set dbs = CurrentDb

strSQL = "SELECT * FROM " & tblExpected
Set rs_expected = dbs.OpenRecordset(strSQL)

strSQL = "SELECT * FROM " & tblActual
Set rs_actual = dbs.OpenRecordset(strSQL)
addLogItem "Getting data from expected and actual tables", "COMPARE", "FINOK"
rs_actual.MoveFirst
rs_actual.MoveLast

addLogItem "Starting compare Process", "COMPARE", "FINOK"
Do Until rs_expected.EOF
    
    Debug.Print "Processing record: " & rs_expected.AbsolutePosition

    'Determine primary key expected and compile find script
    strFind = ""
    For Each idx In dbs.TableDefs(tblExpected).Indexes
        If idx.Primary = True Then
            For Each fld In idx.Fields
                strFind = strFind & fld.Name & " = '" & rs_expected.Fields(fld.Name) & "' AND "
            Next
        End If
    Next
    strFind = Left$(strFind, Len(strFind) - 4)
    
    'Find primary key in rs_actual.
    rs_actual.FindFirst strFind
    If rs_actual.NoMatch Then
        Debug.Print "  -NoMatch! Cannot find match in actual for expected record: " & rs_expected.AbsolutePosition
    Else
        'Select field from expected
        For Each fld1 In rs_expected.Fields
            'Select field from actual
            For Each fld2 In rs_actual.Fields
                'Compare field names
                If (fld1.Name = fld2.Name) Then
                    'Compare field values
                    If (fld1.Value = fld2.Value) Then
                        'Match!
                        Debug.Print "  +Match!   " & " Local: " & fld1.Value & " Actual: " & fld2.Value
                    Else
                        'NoMatch!
                        Debug.Print "  -NoMatch! " & " Local: " & fld1.Value & " Actual: " & fld2.Value & " Error in record: " & rs_expected.AbsolutePosition
                    End If
                End If
            Next
        Next
    End If
    rs_expected.MoveNext
Loop

Set rs_expected = Nothing
Set rs_actual = Nothing
addLogItem "Finished compare Process", "COMPARE", "FINOK"
compareData = True
Exit Function

out:
    addLogItem "Error in compare Process", "COMPARE", "FINERR"
    Debug.Print Err.Description
    compareData = False
End Function