Во-первых, запросы не совпадают. Например, ваш открытый текст SQL содержит восемь столбцов в предложении SELECT
, где версия VBA имеет только три.
Во-вторых, вы используете одно и то же имя таблицы, tblEventLog
, дважды в том же объеме. Поэтому вам нужно будет использовать хотя бы одно имя корреляции таблицы. Я знаю, что префикс tbl является «точкой гордости» в мире доступа, но он делает ваши имена таблиц более длинными и трудными для чтения IMO (а префиксы специально запрещены ISO 11179 Standard для именования элементов данных:)) ... поэтому почему бы не использовать имена корреляции таблиц?
В-третьих, IIRC EXISTS
работает лучше, чем IN
для доступа (ACE/Jet/все) и ИМО легче понять (DISTINCT..INNER JOIN
может работать еще лучше, но опять-таки труднее читать, ИМО).
Вот предложил переписать:
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
);
UPDATE: Кажется, я был неправ о 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. Я все время получаю ошибку «Катастрофический сбой». Вот код, где я ошибаюсь ?:
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
Вы распечатали запрос sql, возвращенный вами, и ввели его в окно дизайна запроса? Вы можете сделать это с помощью 'Debug.Print strNewSql', это напечатает в ближайшее окно. – Fionnuala
Этот запрос отображает записи сейчас, но он отображает все партитуры из базы данных. когда я использую тот же запрос в форме. Он отображает правые частичные числа, связанные с номером отслеживания. Но если я использую тот же запрос в VBA. Это отображает все Partnumbers из БД. – user397316