2010-11-10 278 views
0

該查詢的形式,數據記錄源工作正常,返回精確值,我想SQL查詢在MS Access VBA

SELECT tblRevRelLog_Detail.RevRelTrackingNumber, tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.Version, tblRevRelLog_Detail.JobPnType, tblRevRelLog_Detail.EdsName, tblRevRelLog_Detail.DetailerNamePerPartNumber, tblRevRelLog_Detail.DetailerCompanyPerPartNumber 
FROM tblRevRelLog_Detail 
LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber 
WHERE (((tblEventLog.PartNumber) Not In 
    (SELECT tblEventLog.PartNumber 
    FROM tblEventLog 
    WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper' 
     AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber))) 
ORDER BY tblRevRelLog_Detail.PartNumber; 

但是,如果我寫的VBA相同的查詢。它不返回任何東西

strNewSql = "SELECT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber" 
strNewSql = strNewSql & " WHERE ((tblEventLog.PartNumber) Not In (SELECT tblEventLog.PartNumber FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper' AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber);" 

蹊蹺的查詢?有人能幫我嗎!

+3

你打印出你查詢返回的sql並將其粘貼到查詢設計窗口中嗎?你可以用'Debug.Print strNewSql'來做到這一點,這將打印到直接窗口。 – Fionnuala 2010-11-10 18:04:36

+0

此查詢現在正在顯示記錄,但它顯示了數據庫中的所有部分編號。當我在表單中使用相同的查詢時。它顯示與跟蹤編號有關的正確的部分編號。但是如果我在VBA中使用相同的查詢。這顯示了數據庫中的所有Partnumbers。 – user397316 2010-11-11 15:40:50

回答

0

我會懷疑你的變量tempTrackingNumber不好

+0

它不返回任何東西,如果我使用這個條件還tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber – user397316 2010-11-10 17:41:49

+0

例如,是RevRelTrackingNumber真的是一個文本字段? – Fionnuala 2010-11-10 17:41:59

+0

它是字母數字 – user397316 2010-11-10 17:57:24

0

如果RevRelTrackingNumber是數字,你不需要放在引號。

+0

這是字母數字 – user397316 2010-11-10 17:57:00

0

tempTrackingNumber的數據類型是什麼?您的代碼(前截)顯示:

...tblRevRelLog_Detail.RevRelTrackingNumber = """ & tempTrackingNumber & """);" 

這意味着它是一個字符串,它將被視爲這樣。

如果它實際上是數字,你會想,而不是這樣的:

...tblRevRelLog_Detail.RevRelTrackingNumber = " & tempTrackingNumber & ");" 
+0

tempTrackingNumber是字母數字 – user397316 2010-11-10 17:55:14

0

首先,查詢是不一樣的。例如,您的純文本SQL在SELECT子句中有八列,其中VBA版本只有三個。

其次,您在同一範圍內使用兩次相同的表名稱tblEventLog。所以您至少需要使用一個表關聯名稱。我知道tbl-前綴是Access世界中的一個'自豪感',但它確實會讓你的表名更長更難以讀取IMO(並且前綴被數據元素命名的ISO 11179 Standard特別取締))... so爲什麼不使用表格相關名稱?

三,IIRC EXISTS進行比對IN更好的訪問(ACE /噴氣/不管)和國際海事組織更容易理解(DISTINCT..INNER JOIN可以表現得更好,但是又是難讀,IMO)。

這裏有一個建議重寫:

SELECT D1.PartNumber, D1.ChangeLevel, 
     D1.ID 
    FROM tblRevRelLog_Detail AS D1 
     LEFT OUTER JOIN tblEventLog AS E1 
      ON D1.PartNumber = E1.PartNumber 
WHERE NOT EXISTS (
        SELECT * 
        FROM tblEventLog AS E2 
        WHERE E2.EventTypeSelected = 'pn REMOVED From Wrapper' 
          AND E2.TrackingNumber = D1.RevRelTrackingNumber 
          AND E2.PartNumber = E1.PartNumber 
       ); 

更新:看來我錯了EXIST捐贈是更好的,所以這裏的一對夫婦更改寫可供選擇:

SELECT D1.PartNumber, D1.ChangeLevel, 
     D1.ID 
    FROM tblRevRelLog_Detail AS D1 
     LEFT OUTER JOIN tblEventLog AS E1 
      ON D1.PartNumber = E1.PartNumber 
WHERE E1.PartNumber NOT IN 
     (
     SELECT E2.PartNumber 
      FROM tblEventLog AS E2 
     WHERE E2.EventTypeSelected = 'pn REMOVED From Wrapper' 
       AND E2.TrackingNumber = D1.RevRelTrackingNumber 
     ); 

其實,我很努力地使用Access的專有連接重新寫入。我不斷收到「災難性故障」錯誤。這裏是repro代碼,我在哪裏出錯?:

Sub grjieopgj() 

    On Error Resume Next 
    Kill Environ$("temp") & "\DropMe.mdb" 
    On Error GoTo 0 

    Dim cat 
    Set cat = CreateObject("ADOX.Catalog") 
    With cat 
    .Create _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & _ 
     Environ$("temp") & "\DropMe.mdb" 
    With .ActiveConnection 

     Dim Sql As String 
     Sql = _ 
     "CREATE TABLE tblRevRelLog_Detail " & vbCr & "(" & vbCr & _ 
     " PartNumber VARCHAR(20), " & vbCr & " EventTypeSelected VARCHAR(20), " & vbCr & _ 
     " TrackingNumber VARCHAR(20), " & vbCr & " RevRelTrackingNumber VARCHAR(20), " & vbCr & _ 
     " ChangeLevel VARCHAR(20), ID VARCHAR(20)" & vbCr & ");" 
     .Execute Sql 

     Sql = _ 
     "CREATE TABLE tblEventLog " & vbCr & "(" & vbCr & _ 
     " PartNumber VARCHAR(20), " & vbCr & " EventTypeSelected VARCHAR(20), " & vbCr & _ 
     " TrackingNumber VARCHAR(20), " & vbCr & " RevRelTrackingNumber VARCHAR(20), " & vbCr & _ 
     " ChangeLevel VARCHAR(20), ID VARCHAR(20)" & vbCr & ");" 

     Sql = _ 
     "SELECT DISTINCT D1.PartNumber, D1.ChangeLevel," & _ 
     " " & vbCr & "  D1.ID " & vbCr & " FROM (" & vbCr & "  tblRevRelLog_Detail" & _ 
     " AS D1" & vbCr & "  LEFT OUTER JOIN tblEventLog" & _ 
     " AS E1" & vbCr & "   ON D1.PartNumber = E1.PartNumber" & vbCr & "" & _ 
     "  )" & vbCr & "  LEFT OUTER JOIN tblEventLog" & _ 
     " AS E2" & vbCr & "   ON AND E2.TrackingNumber" & _ 
     " <> D1.RevRelTrackingNumber" & vbCr & "   " & _ 
     " AND E2.PartNumber <> E1.PartNumber" & vbCr & " WHERE" & _ 
     " E2.EventTypeSelected = 'pn REMOVED From" & _ 
     " Wrapper';" 

     Dim rs 
     Set rs = .Execute(Sql) 
     MsgBox rs.GetString 
    End With 
    Set .ActiveConnection = Nothing 
    End With 
End Sub 
+0

不存在關於雙方索引使用比NO IN更可靠。事實上,根據我的經驗,情況並非如此。 – 2010-11-11 20:55:07

+0

@ David-W-Fenton:我現在用'NOT IN'重寫了,但是我的JOIN重寫得到了一個「災難性故障」錯誤(參見答案中的VBA)。任何想法這意味着什麼? – onedaywhen 2010-11-12 08:45:19

+0

我從未在Jet/ACE/Access錯誤消息中看到過這些警告詞。 NOT IN在雙方都使用索引時也不可靠。不過,EXISTS和IN都使用雙方的索引。也許有某種方法可以在另一個層面上顛倒邏輯? – 2010-11-12 18:32:03

0

好像你缺少一個右括號。在VBA中查詢的末尾添加「)」並嘗試。