简体   繁体   中英

SQL Query in MS Access VBA

This query in the form-Data-Record Source is working fine, returning exact values that i want

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;

But if i write the same query in the VBA. It is not returning anything

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

Something wrong with the query?? can someone help me!

我怀疑您的变量tempTrackingNumber不好

如果RevRelTrackingNumber为数字,则无需将其用引号引起来。

What's the data type of tempTrackingNumber? Your code (front-truncated) shows this:

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

This implies that it's a String, and it will be treated as such.

If it's actually numeric, you'll want this instead:

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

First, the queries are not the same. For example, your plaintext SQL has eight columns in the SELECT clause where the VBA version has just three.

Second, you are using the same table name, tblEventLog , twice in the same scope. So you will need to use at least one table correlation name. I know the tbl- prefix is a 'point of pride' in the Access world but it does make you table names longer and harder to read IMO (and prefixes are specifically outlawed by the ISO 11179 Standard for data element naming :))... so why not use table correlation names throughout?

Third, IIRC EXISTS performs better than IN for Access (ACE/Jet/whatever) and IMO is easier to understand ( DISTINCT..INNER JOIN may perform even better but is again harder to read, IMO).

Here's a suggested re-write:

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: Seems I was wrong about the EXIST giving being better, so here's a couple more rewrite to choose from:

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

Actually, I'm struggling to get this re-writes using Access's proprietary joins. I keep getting a "Catastrophic failure" error. Here's the repro code, where am I going wrong?:

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

Seems like you missing a closing bracket. Add ")" at the end of the query in VBA and try.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM