2016-10-24 136 views
0

アクセスVBAの2つのレコードセットを比較して、2つのテーブル内の値が同じかどうか、または異なるかどうかを確認しようとしています。両方のレコードセットは同じ構造体(フィールド見出し)とレコードIDを持ち、レコードのフィールド値が2番目のレコードセットの対応するフィールド値と一致するかどうかを確認しようとしています。レコードIDフィールド名はMATNRです。Access VBAのレコードセット値の比較

私は第1レコードセットのレコードとフィールドをループすることができたと思いますが、これらのレコードをループして比較する方法は不明です。また、他のレコードセットを比較するスマートな方法がありますIf rs1.Fields(fld.Name) = rs2.Fields(fld.Name)

ご協力いただければ幸いです。以下は

Public Sub VerifyRecords() 

     Dim rs As DAO.Recordset 
     Dim rs1 As DAO.Recordset 
     Dim rs2 As DAO.Recordset 
     Dim rs3 As DAO.Recordset 
     Dim fld As DAO.Field 
     Dim sSQL As String 
     Dim sSQL1 As String 
     Dim sSQL2 As String 

    Set rs = CurrentDb.OpenRecordset("R2_Tables_to_Compare1") 'This table lists the upload tables to query and their corresponding target tables 
    Set rs3 = CurrentDb.OpenRecordset("RecordValueComparisonResults") 'Write the results of the record vlaue comparison to here 

    '************************************************************************************** 
    'This SQL statement selects all records from the upload table 

     sSQL = "SELECT * " 
     sSQL = sSQL & " FROM " & rs(0) 

    Set rs1 = CurrentDb.OpenRecordset(sSQL) 

    '************************************************************************************** 
    'This SQL statement selects only those records that are applicable in the target table 

     sSQL1 = "SELECT " & rs(1) & ".* FROM " & rs(1) & " INNER JOIN " & rs(0) & " ON " & rs(1) & ".MATNR = " & rs(0) & ".MATNR" 

    Set rs2 = CurrentDb.OpenRecordset(sSQL1) 
    '************************************************************************************** 
    Do While Not rs1.EOF 
       For Each fld In rs1.Fields 
         If rs1.Fields(fld.Name) = rs2.Fields(fld.Name) Then 
          Debug.Print rs1.Fields("MATNR"), rs2.Fields("MATNR"), fld.Name, rs1.Fields(fld.Name), rs2.Fields(fld.Name) 
        End If 
       Next fld 
      rs1.MoveNext 
    Loop 


rs.Close 
rs1.Close 
rs2.Close 
rs3.Close 

Set rs = Nothing 
Set rs1 = Nothing  
Set rs2 = Nothing  
Set rs3 = Nothing 

    End Sub 
+1

あなたはRDBMS内のレコードを扱っている、あなたは、ループの面で考え始める場合、あなたはそれが間違ってやっています。これが何をしているのかは、明白なSQLクエリとして表現できます。 –

答えて

0

アクセスし、任意のリレーショナルDBでの作業中にQUERYオプションはより速く、より良い練習ですが、二つの選択肢です:

  1. queryオプション:このクエリは、レコードセットに渡すことができ、レコードセットには、2つのテーブルのフィールド間に一致する値のみが含まれます。その後、その新しいレコードセットをループし、必要に応じて単一のループを使用して印刷または処理することができます。

    SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
  2. loopオプション:あなたは両方のレコードセットをループに意図されている場合は、このコードを使用します。おそらく、これを行うより効率的な方法があります。特に、この方法では、no-noである4つのネストされたループが使用されるためです。私はQUERY OPTIONを強く推奨します。

    While Not rs1.EOF 
        While Not rs2.EOF 
        For Each fld1 in rs1.Fields 
         For Each fld2 in rs2.Fields 
         If rs1.Fields(fld1.Name) = rs2.Fields(fld2.Name) Then 
          Debug.Print rs1.Fields("MATNR"), rs2.Fields("MATNR"), fld1.Name, 
             rs1.Fields(fld1.Name), rs2.Fields(fld2.Name) 
         End If 
         Next fld2 
        Next fld1 
         rs2.MoveNext 
        Wend 
        rs2.MoveFirst 
        rs1.MoveNext 
    Wend
関連する問題