2015-05-19 63 views
2

我需要一些幫助。我想通過SQL在Excel中提取具有連接查詢的數據,但通過下面的代碼運行時,我得到的調試錯誤..通過Excel VBA加入SQL表時出現錯誤

recset.Open strSQL, con, adOpenDynamic, adLockOptimistic 

錯誤 - 運行時錯誤-2147467259

下面是代碼.....請幫助:困惑:

Sub Show_data() 

    Dim con As ADODB.Connection 
    Dim recset As ADODB.Recordset 
    Dim ConnectionString As String 
    Dim strSQL As String 

    Set con = New ADODB.Connection 
    Set recset = New ADODB.Recordset 

''Check for the connectivity or connected to the xx network 
    On Error GoTo errHandler 

errHandler: 
    If Err.Number = -2147467259 Then 
     MsgBox "Please check for the xx connectivity ", vbExclamation + vbOKOnly 
     Exit Sub 
    End If 


    ConnectionString = "Provider=MSDASQL;User ID=myuser;password= mypass;Data Source=mys" 

    con.Open ConnectionString 

    'Set and Excecute SQL Command' 

     strSQL = "SELECT B.USER_NAME AS CREATED_BY, A.CREATION_DATE, C.USER_NAME, A.LAST_UPDATE_DATE, A.PFIZER_ITEMCODE, A.SYSTEM_ITEMCODE AS ORACLE_ITEM_CODE," & _ 
     "A.ITEM_DESCRIPTION, A.BATCH_NUMBER, A.MFR_CODE, A.MFR_DESC AS MFR_DESCRIPTION, TO_CHAR(A.MFR_DATE,'DD-MON-YYYY')As MFR_DATE, TO_CHAR(A.EXPIRY_DATE,'DD-MON-YYYY')As EXPIRY_DATE," & _ 
     "TO_CHAR(A.EFFECTIVE_FROM,'DD-MON-YYYY') AS EFFECTIVE_FROM," & _ 
     "A.EFFECTIVE_TO, A.EXCISE AS EXCISE_AMOUNT, A.EXCISE_RATE, A.P2S, A.P2R, A.MRP, A.STATE_CODE, A.STATE," & _ 
     "(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END)AS LEGAL_ENTITY" & _ 
     "FROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c" & _ 
     "WHERE 1=1" & _ 
     "AND A.CREATED_BY = B.USER_ID" & _ 
     "AND A.LAST_UPDATED_BY = C.USER_ID" 

     If (ActiveSheet.cmbLE.Text) <> "" Then 
     strSQL = strSQL & " LEGAL_ENTITY='" & ActiveSheet.cmbLE.Text & "'" 
     End If 

     If (ActiveSheet.cmbProduct.Text) <> "" Then 
      If (ActiveSheet.cmbLE.Text) <> "" Then 
       strSQL = strSQL & " AND [ORACLE_ITEM_CODE]='" & ActiveSheet.cmbProduct.Text & "'" 
      Else 
       strSQL = strSQL & " [ORACLE_ITEM_CODE]='" & ActiveSheet.cmbProduct.Text & "'" 
      End If 
     End If 

     If (ActiveSheet.txtBatch.Text) <> "" Then 
      If (ActiveSheet.cmbLE.Text) <> "" Or (ActiveSheet.cmbProduct.Text) <> "" Then 
       strSQL = strSQL & " AND [BATCH_NUMBER]='" & ActiveSheet.txtBatch.Text & "'" 
      Else 
       strSQL = strSQL & " [BATCH_NUMBER]='" & ActiveSheet.txtBatch.Text & "'" 
      End If 
     End If 



    'Open Recordset 

    Set recset.ActiveConnection = con 
    recset.Open strSQL, con, adOpenDynamic, adLockOptimistic 

    'Copy the data 
    If recset.RecordCount > 0 Then 
    Sheets("Sheet2").Range("A1").CopyFromRecordset recset 
' ActiveSheet.Range("A1").CopyFromRecordset recset 
    Else 
    MsgBox "No Data Available", vbExclamation + vbOKOnly 
    Exit Sub 
    End If 

recset.Close 
con.Close 

End Sub 

按你的要求,我不得不打印STRSQL

SELECT B.USER_NAME AS CREATED_BY, A.CREATION_DATE, C.USER_NAME, 
    A.LAST_UPDATE_DATE, 
    A.PFIZER_ITEMCODE, A.SYSTEM_ITEMCODE AS ORACLE_ITEM_CODE, 
    A.ITEM_DESCRIPTION, A.BATCH_NUMBER, 
     A.MFR_CODE, A.MFR_DESC AS MFR_DESCRIPTION, 
     TO_CHAR(A.MFR_DATE,'DD-MON-YYYY')As MFR_DATE, 
    TO_CHAR(A.EXPIRY_DATE,'DD-MON-YYYY')As EXPIRY_DATE, 
     TO_CHAR(A.EFFECTIVE_FROM,'DD-MON-YYYY') AS EFFECTIVE_FROM, 
A.EFFECTIVE_TO, A.EXCISE AS EXCISE_AMOUNT, 
     A.EXCISE_RATE, A.P2S, 
A.P2R, A.MRP, A.STATE_CODE, A.STATE, 
     (CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END)AS LEGAL_ENTITY 
      FROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c 
WHERE 1=1 AND A.CREATED_BY = B.USER_ID AND A.LAST_UPDATED_BY = C.USER_ID AND [A.LEGAL_ENTITY]='J0012' AND [A.SYSTEM_ITEMCODE]='1407_PI-J0012' 
+0

你可以在運行之前打印strSQL並附加到問題上嗎? –

+0

您使用的是ADO嗎? – Tarik

+0

是tarik ....... –

回答

0

最後,我已經解決了錯誤.....實際上在一個編碼中,我已經給出了參數,其中報價給出了問題......即,

以前我是運行查詢與下面的代碼,

strSQL & " AND [ORACLE_ITEM_CODE]='" 

只是東陽有報價

"["

... WS收到這個錯誤。

但是,消除其優良的工作後同樣....

我想感謝大家誰分享了他們解決錯誤知識...這也有助於我獲得我的知識...

謝謝全部

1

如果你有這樣的代碼

"WHERE 1=1" & _ 
"AND A.CREATED_BY = B.USER_ID" & _ 

將呈現

"WHERE 1=1AND A.CREATED_BY = B.USER_ID" 

即之間沒有空格1=1AND

嘗試把一個空間,每行收盤報價前:

"WHERE 1=1 " & _ 
"AND A.CREATED_BY = B.USER_ID " & _ 
+0

嗨,感謝您的快速解決方案,但即使更改上述相同的錯誤m面臨 –

+1

哪一行代碼會產生錯誤?你能打印strSQL變量嗎?如果使用諸如「SELECT * FROM Table」之類的東西,錯誤仍然會發生嗎? – ChipsLetten

+0

如果您可以在執行之前將strSQL的內容發佈到問題上,那最好。 –

1

使用「& _」擴展程序可添加到字符串變量的字符數有限制。

芯片對Debug.Print變量的建議會告訴你這個查詢在你嘗試執行之前是否可行。

當我創建我的SQL的查詢,我用這樣的過程中避免截斷:

strSQL = "SELECT " 
strSQL = strSQL & "Field1, Field2, Field3 " 
strSQL = strSQL & "FROM MyTable " 

在每行的結尾加上一個空格確保安迪上面指出的問題不會發生。

1

與安迪喬伊納的建議類似,你實際上在幾個地方的末尾錯過了一個空間。例如

"(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END)AS LEGAL_ENTITY" & _ 
"FROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c" & _ 

看起來像:

"(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN OPF' ELSE 'OWL' END)AS LEGAL_ENTITYFROM xxdhl_pf_batch_pricing A, fnd_user B, fnd_user c" & _ 

從而省去您的FROM子句。

+0

是的,我嘗試過空間,但仍然面臨相同的錯誤 –

+0

正如前面建議,我們需要看到完整的查詢,因爲它正在傳遞到SQL – Gene

+0

嗨,我已經把調試sql的打印查詢...請參閱和讓我知道如果有...請 –