2009-09-09 12 views
2

J'essaie de comparer deux jeux d'enregistrements. le premier rs1 a des enregistrements aléatoires. Le deuxième rs2 a les valeurs standard pour ces enregistrements. Au départ, je cherche à prendre chacun des enregistrements et voir s'ils correspondent à l'ensemble de valeurs standard dans le deuxième jeu d'enregistrements. Il y a quatre champs dans chaque ensemble d'enregistrements à comparer et tous les quatre doivent correspondre.Ms Access Comparaison de deux jeux d'enregistrements

J'ai juste besoin d'aide dans la boucle. J'essaie d'écrire les enregistrements non correspondants dans un fichier Excel. Voici ce que j'ai jusqu'à présent

While Not rs1.EOF          
    With rs1 
     .MoveFirst 
     With rs2 
      .MoveFirst 
      While Not rs2.EOF 
       counter = counter + 1 
       a = 0 
       If rs1!Kk = rs2!Kk Then a = a + 1 
       If rs1!CC = rs2!CC Then a = a + 1 
       If rs1!HN = rs2!HN Then a = a + 1 
       If rs3!TN = rs2!TN Then a = a + 1 

       If a > 3 Then GoTo correct 
       .MoveNext 

       If rs2.EOF Then 
        If rs!Table_Name <> "table1" Then 
         i = i + 1 
         j = 1 
         counter = counter + 1 
         objSht.Cells(i, j).Value = "casenum" & rs1.Fields(1) 
         j = j + 1 
         stat_counter = stat_counter + 1 
        End If 

        If i = 65500 Then 
         Set wbexcel = objexcel.ActiveWorkbook 
         ''//Set objSht = wbexcel.Worksheets("Sheet2") 
         Set objSht = wbexcel.Worksheets.Add 
         i = 2 
        End If 
       End If           
correct: 
       rs1.MoveNext 
      Wend 
     End With 
    End With 

également des idées sur la façon dont je peux séparer sur la base 2 de champs correspondant à la norme et 3 des champs correspondant aux valeurs standard

+0

Alors, quels problèmes/problèmes avez-vous? –

Répondre

2

Les jeux d'enregistrements sont-ils déjà triés? Je suppose que c'est le cas puisque vous passez à la suivante rs2 sur un non-match. Personnellement, je spécifierais un tri pour être sûr à 100%.

En outre, je testerais cela assez minutieusement avec un petit jeu de données de test avec quelques cas de bord pour vous assurer que vous obtenez ce que vous attendez.

Avec ce qui précède, votre code semble fonctionner mais j'ai quelques petites recommandations pour le rendre plus facile à lire.

D'abord, je recommande d'abandonner les With rs1 imbriqués et With rs2. Reportez-vous simplement à chaque jeu d'enregistrements de façon explicite afin de pouvoir voir clairement ce qui se passe à chaque RS. par exemple:

If a > 3 Then GoTo correct 
       .MoveNext 

devient

If a > 3 Then GoTo correct 
       rs2.MoveNext 

Suivant votre instruction if avec a = a + 1 pourraient faire avec rangement. par exemple:

If rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN and rs3!TN = rs2!TN then 
    ''// Do Nothing or maybe increase a count or whatever :) 
else 
    WriteToExcel(objSht , rs1.fields) 
end if 

Vous devez écrire une fonction appelée WriteToExcel(), mais cela rendra plus facile la prochaine étape. Je pense que vous voulez écrire à différentes feuilles en fonction des matchs?

If rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN and rs3!TN = rs2!TN then 
    ''// Do Nothing 
else if rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN then 
    WriteToExcel(objSht2 , rs1.fields) 
else 
    WriteToExcel(objSht , rs1.fields) 
end if 

Vous pouvez également regarder des commutateurs dans le cas où vous avez besoin de deux matches, plutôt que des concordances spécifiques comme ci-dessus ... oh et variable j semble un peu superflu.

0

Mon instinct vous dit que vous êtes faire quelque chose de manière sous-optimale; cependant, dans l'instruction if If rs2.EOF Then, pourquoi ne pas ajouter une comparaison à a puis rediriger vers un fichier Excel différent pour 0, 1, 2 et 3

Force et Ignorance de Bruit, mais définitivement séparées.