2017-05-12 9 views
0

私は本当にここで苦労しています。私は、VBA内でOracle内のいくつかのテーブルとAccess内のテーブルにリンクするためのクエリを構築しています。私は、OracleにアップロードしたものがAccess DBにあるものと一致することを確認する必要があります。VBAの関数でNZを使用してクエリを構築する

私が持っている

  • SourceField1(常に人口)
  • SourceField2(時には人口)

ソースフィールド2が空白の場合、私はそれに参加し、それを無視しないようにしたいです。私がこれを行った最善の方法は、Nzで試してSourceField1で置き換えることです。

私にこれを与え
strSQL = "INSERT INTO ERROR_TABLE (ORACLE_FIELD, TRANSFORM_FIELD) SELECT " & MatchValues!ORACLE_TABLE_NAME & "." & MatchValues!FieldName & ", " & MatchValues!TRANSFORM_TABLE_NAME & "." & MatchValues!FieldName 
strSQL = strSQL & " FROM " & MatchValues!TRANSFORM_TABLE_NAME & " INNER JOIN " & MatchValues!xfTableName 
strSQL = strSQL & " ON " & MatchValues!TRANSFORM_TABLE_NAME & "." & MatchValues!SourceField1 & " = " & MatchValues!xfTableName & "." & MatchValues!ReferenceField1 & "" 
strSQL = strSQL & " AND " & MatchValues!TRANSFORM_TABLE_NAME & ".Nz(" & MatchValues!SourceField2 & "," & MatchValues!SourceField1 & ") = " & MatchValues!xfTableName & ".Nz(" & MatchValues!ReferenceField2 & "," & MatchValues!ReferenceField1 & ")" 
strSQL = strSQL & " INNER JOIN " & MatchValues!ORACLE_TABLE_NAME & " ON (" & MatchValues!xfTableName 
strSQL = strSQL & ".KEYVAL = " & MatchValues!ORACLE_TABLE_NAME & ".KEYVAL)" 
strSQL = strSQL & " WHERE (" & MatchValues!TRANSFORM_TABLE_NAME & "." & MatchValues!FieldName 
strSQL = strSQL & " <> " & MatchValues!ORACLE_TABLE_NAME & "." & MatchValues!FieldName & ")" 

INSERT INTO ERROR_TABLE(ORACLE_FIELD、TRANSFORM_FIELD)tbluniDCappl INNER FROM UNI73MART1_DCappl.DECSN、tbluniDCappl.DECSNを選択tbluniDCappl.REFVAL = XF_DC_ref.REFVALとtbluniDCappl ON XF_DC_refを登録しよう。 NZ(REFVAL)= XF_DC_ref.Nz(REFVAL)INNER UNI73MART1_DCappl ON(XF_DC_ref.KEYVAL = UNI73MART1_DCappl.KEYVAL)(tbluniDCappl.DECSN <> UNI73MART1_DCappl.DECSN)

+0

_ VBA行継続文字を使用してみてください。 'NVL(a、b)'は、 'a'が' null'ならば 'b'を返し、そうでなければ' a'を返します。 –

+0

私は選択した内部アクセス(リンクされたテーブル)を実行しているので、NZの機能でなければならないと思いますか?とにかくそのように使用されていないのはどういう意味ですか、クエリにエラーがありますか? – Rhiannesh

+0

あなたは "Nz(<< >>、REFVAL)"をチェックすることはありません。 SQLエラーだと思います。 'nz([tbluniDCappl]、" Nothing ")' –

答えて

0

試行をJOINこれはNz式を正しく連結したものです。

strSQL = "INSERT INTO ERROR_TABLE (ORACLE_FIELD, TRANSFORM_FIELD) SELECT " & MatchValues!ORACLE_TABLE_NAME & "." & MatchValues!FieldName & ", " & MatchValues!TRANSFORM_TABLE_NAME & "." & MatchValues!FieldName 
strSQL = strSQL & " FROM " & MatchValues!TRANSFORM_TABLE_NAME & " INNER JOIN " & MatchValues!xfTableName 
strSQL = strSQL & " ON " & MatchValues!TRANSFORM_TABLE_NAME & "." & MatchValues!SourceField1 & " = " & MatchValues!xfTableName & "." & MatchValues!ReferenceField1 & "" 
strSQL = strSQL & " AND " & MatchValues!TRANSFORM_TABLE_NAME & "." & Nz(MatchValues!SourceField2, MatchValues!SourceField1) & " = " & MatchValues!xfTableName & "." & Nz(MatchValues!ReferenceField2, MatchValues!ReferenceField1) & ")" 
strSQL = strSQL & " INNER JOIN " & MatchValues!ORACLE_TABLE_NAME & " ON (" & MatchValues!xfTableName 
strSQL = strSQL & ".KEYVAL = " & MatchValues!ORACLE_TABLE_NAME & ".KEYVAL)" 
strSQL = strSQL & " WHERE (" & MatchValues!TRANSFORM_TABLE_NAME & "." & MatchValues!FieldName 
strSQL = strSQL & " <> " & MatchValues!ORACLE_TABLE_NAME & "." & MatchValues!FieldName & ")" 
0

Nzの呼び出しをSQLから引き出します。問題の2つのフィールドはVBAコンテキストに存在するため、SQL文字列に埋め込まれていないVBAコード内でチェックする必要があります。

strSQL = strSQL & " AND " & MatchValues!TRANSFORM_TABLE_NAME & "." Nz(MatchValues!SourceField2 , MatchValues!SourceField1) & " = " & MatchValues!xfTableName & "." & Nz(MatchValues!ReferenceField2 , MatchValues!ReferenceField1) 

NULLがヌル&を使用して文字列と連結されているだけの空白文字列に変換されます。だから式".Nz(" & MatchValues!SourceField2 & "," & MatchValues!SourceField1 & ") = " & MatchValues!xfTableName & ".Nz(" & MatchValues!ReferenceField2 & "," & MatchValues!ReferenceField1 & ")"は単に文字列値".Nz(, SourceField1Name) = tablename.Nz(,ReferenceField1Name) ...を生成します。これは悪いSQL構文です。私はNathan_Savがこれを指摘しようとしていたと思いますが、それについてはあまり明確ではありません。

ヒント1:あなたは、常に実際のSQL文をプリントアウトすることで、コードに組み込まれたSQL文をデバッグする必要があります。あなたはあなたの質問にそれを含めるべきでした。

ヒント2:NZは()のみのアクセスで、とにかくそのように使用されていないかなり確信して

関連する問題