表单数据记录源中的此查询工作正常,返回我想要的确切值
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);"
查询有问题?有人可以帮帮我!
答案 0 :(得分:0)
我怀疑你的变量tempTrackingNumber是坏的
答案 1 :(得分:0)
如果RevRelTrackingNumber
是数字,则无需将其括在引号中。
答案 2 :(得分:0)
tempTrackingNumber的数据类型是什么?您的代码(前截断)显示了这个:
...tblRevRelLog_Detail.RevRelTrackingNumber = """ & tempTrackingNumber & """);"
这意味着它是一个字符串,它将被视为这样。
如果它实际上是数字,那么你会想要这个:
...tblRevRelLog_Detail.RevRelTrackingNumber = " & tempTrackingNumber & ");"
答案 3 :(得分:0)
首先,查询不一样。例如,您的纯文本SQL在SELECT
子句中有八列,其中VBA版本只有三列。
其次,您在同一范围内使用相同的表名tblEventLog
两次。因此,您需要使用至少一个表关联名称。我知道tbl-前缀是Access世界中的“自豪点”,但它确实会让你的表名更长,更难以阅读IMO(ISO 11179 Standard特别禁止前缀用于数据元素命名:)) ...为什么不在整个过程中使用表格相关名称?
第三,IIRC EXISTS
的性能优于IN
用于访问(ACE / Jet /无论如何),IMO更容易理解(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
答案 4 :(得分:0)
好像你错过了一个结束括号。在VBA中的查询末尾添加“)”并尝试。