2017-05-12 6 views
0

저는 여기서 정말 고심하고 있습니다. 오라클 내부 및 Access 내부의 여러 테이블에 연결하기 위해 VBA 내부에 쿼리를 작성합니다. 내가 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.REFVAL = XF_DC_ref.REFVAL 및 tbluniDCappl ON XF_DC_ref 가입 tbluniDCappl INNER로부터 UNI73MART1_DCappl.DECSN, tbluniDCappl.DECSN을 선택

. NZ (REFVAL) = XF_DC_ref.Nz (REFVAL) INNER UNI73MART1_DCappl ON (= XF_DC_ref.KEYVAL UNI73MART1_DCappl.KEYVAL) (tbluniDCappl.DECSN <> UNI73MART1_DCappl.DECSN)

+0

확신 NZ()를 사용하여 시도하는 액세스 만 어쨌든 그런 식으로 사용하지 않는 것입니다. 'NVL (a, b)'는'a'가'null'이라면'b'를 반환하고 그렇지 않으면'a'를 반환합니다. –

+0

내가 선택한 내부 액세스 (링크 된 테이블)를 실행 중이므로 NZ 기능이 있어야한다고 생각하십니까? 어쨌든 그렇게 사용하지 않는다는 것은 무엇을 의미합니까, 내 쿼리에 오류가 있습니까? – Rhiannesh

+0

"Nz (<< >>, REFVAL)"을 확인할 필요가 없습니다. SQL 오류 내 생각에,'nz ([tbluniDCappl], "Nothing")' –

답변

0

가입 시도 이것은 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 밖으로 당깁니다. 문제의 두 필드는 VBA 컨텍스트에 존재하므로 SQL 문자열에 포함되지 않고 VBA 코드 내에서 검사해야합니다. NULL이 &를 사용하여 문자열와 연결하면

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 : VBA 줄 연속 문자 _를