SQL-запрос в MS Access VBA - PullRequest
       9

SQL-запрос в MS Access VBA

0 голосов
/ 10 ноября 2010

Этот запрос в форме источника данных-данных работает нормально, возвращая точные значения, которые я хочу

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);"

Что-то не так с запросом ?? кто-нибудь может мне помочь!

Ответы [ 5 ]

0 голосов
/ 17 ноября 2010

Похоже, вам не хватает закрывающей скобки. Добавьте ")" в конце запроса в VBA и попробуйте.

0 голосов
/ 11 ноября 2010

Во-первых, запросы не совпадают.Например, ваш текст SQL содержит восемь столбцов в предложении SELECT, где версия VBA имеет только три.

Во-вторых, вы используете одно и то же имя таблицы, tblEventLog, дважды в одной и той же области.Таким образом, вам нужно будет использовать хотя бы одно имя корреляции таблицы.Я знаю, что префикс tbl - это «предмет гордости» в мире доступа, но он делает имена таблиц длиннее и сложнее для чтения IMO (а префиксы специально запрещены стандартом ISO 11179 для элемента данныхnaming:)) ... так почему бы не использовать имена корреляций таблиц повсюду?

В-третьих, IIRC EXISTS работает лучше, чем IN для доступа (ACE / Jet / любой другой), и IMO легче понять (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
                  ); 

ОБНОВЛЕНИЕ: Кажется, я ошибся в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
0 голосов
/ 10 ноября 2010

Если RevRelTrackingNumber - это число, вам не нужно заключать его в кавычки.

0 голосов
/ 10 ноября 2010

Что такое тип данных tempTrackingNumber?Ваш код (передний усеченный) показывает это:

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

Это означает, что это строка, и она будет рассматриваться как таковая.

Если это на самом деле число, вы захотитевместо:

...tblRevRelLog_Detail.RevRelTrackingNumber = " & tempTrackingNumber & ");"
0 голосов
/ 10 ноября 2010

Я подозреваю, что ваша переменная tempTrackingNumber неверна

...