FatBoySlim7
FatBoySlim7

Reputation: 232

SQL query assistance needed with 'NOT'

I'm working out of VB6 with SQL SERVER 2012. I found myself in a pickle. Basically i have a query that works fine and pulls the necessary data in SQL SERVER, however, I'm having a difficult time translating it to vb6 SQL code. Here's a working query in SQL SERVER...

SELECT 'TotalSum' = SUM(Units)
FROM   tblDetail
WHERE  MemberID = '117'
      AND CAST(SStartD AS DATETIME) >= '4/1/2016'
      AND CAST(SStartD AS DATETIME) <= '4/7/2016'
      AND Service = 166
      AND [CODE] IN('1919')
      AND NOT(InvoiceNo = '11880'
            AND DtlNo = 2
            )
      AND NOT(InvoiceNo = '11880'
            AND AdjNo = 2
            );

So when I try to write it in my vb6 application i do something like

SELECT 'TotalSum' = SUM(Units)
FROM   tblDetail
WHERE  MemberID = '117'
      AND CAST(SStartD AS DATETIME) >= '4/1/2016'
      AND CAST(SStartD AS DATETIME) <= '4/7/2016'
      AND Service = 166
      AND [CODE] IN('1919')
      AND (InvoiceNo <> '11880'
          AND DtlNo <> 2
         )
      AND (InvoiceNo <> '11880'
          AND AdjNo <> 2
         );

However, this is not giving me the same results. Whats happening is in my last two clauses

( InvoiceNo <> '11880' AND DtlNo<> 2) AND (InvoiceNo <> '11880' AND AdjNo <> 2)

When I run them finally in SQL SERVER don't have paranthesis and its absolutely detrimental that the 2 seperate clauses are in paranthesis. Anyone know what I can do? I think my last resort might be to create a store procedure but i don't really want to do that.

EDIT:

g_SQL = "SELECT 'SUM' = SUM(Units) " & _
        "FROM tblDetail WHERE " & _
        "MemID = " & udtCDtl.Lines(udtCDtlIdx).MemID & " AND " & _
        "CAST(SStartD As DateTime) >= '" & StartDate & "' AND " & _
        "CAST(SStartD As DateTime) <= '" & DateAdd("d", -1, EndDate) & "' AND " & _
        "Service = 166 AND " & _
        "[CODE] IN (‘1919’)) And " & _
        ("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
        "DtlNo <> " & (InvoiceDtlRS! InvoiceDtlNo, "")) & " AND " & _
        ("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
        "AdjNo <> " & InvoiceDtlRS! InvoiceDtlNo)

Upvotes: 0

Views: 102

Answers (3)

BobRodes
BobRodes

Reputation: 6165

While Marc may have given you a query that works, Simon's question is still valid. The only reason your original query wouldn't work is because you munged the quotes. You'll notice that your parentheses by the reference to InvoiceNo are outside the quotes rather than inside them (there are other problems as well, from changing your original query, but I'll leave you to figure those out for yourself). That makes them not part of the quoted string, and instead part of the VB6 expression. Frankly, Marc isn't doing you any favors by providing an alternative SQL query that happens to have all the VB6 syntax correct, while yours does not. The real problem is that you haven't worked out how to put a SQL query into a quoted string carefully enough.

You can't afford that kind of carelessness if you want to be good at what you're doing. I don't say this to be offensive, but to get your attention. By adopting Marc's solution as the correct one, you haven't really solved your problem, because your problem is a mindset that doesn't think about anything except getting something to work. That mindset makes for the worst kind of programmer, the kind that writes terrible code (hundreds of lines of code where it could be done in 10, for example) that makes nightmares for people who have to maintain it later. Don't be one of those people. When you don't know why something isn't working, go to the trouble of figuring out why. You only have to do it once for each problem, and that mindset will stand you well as you continue to develop your skills.

Again, no disrespect intended. I'm just trying to get you to understand how to avoid getting in "pickles" like this one in future. Hopefully, the next time you post a question here, the "pickle" you're in will be more sophisticated. :)

EDIT: I guess I'm not making myself clear enough. The simple rule is that you need to enclose everything in the working SQL query in quoted strings, and replace the literal search values with references to text boxes, fields, or whatever. So:

sql = "SELECT 'TotalSum' = SUM(Units) " & _
"FROM   tblDetail " & _
"WHERE  MemberID = '" & myVariable & "' " & _
"AND CAST(SStartD AS DATETIME) >= '" & myVariable & "' " & _
"AND CAST(SStartD AS DATETIME) <= '" & myVariable & "' " & _
"AND Service = 166 " & _
"AND [CODE] IN('1919') " & _
"AND NOT(InvoiceNo = '" & myVariable & "' " & _
"AND DtlNo = " & myVariable & _
")" & _
"AND NOT(InvoiceNo = '" & myVariable & "' " & _
"AND AdjNo = " & myVariable & _
");"

Where myVariable is whatever variable reference you want to replace your literal string with. Any examples you've given have errors in placement of double quotes, which is why you aren't getting the result you want, which is presumably a replication of your working SQL query. The reason Marc's works is not because he altered your original query (it doesn't look like he has, except to put it on less lines) but because he placed his quotation marks correctly. The reason your and simon's solutions don't work is because neither of you have. Going back to your original post, the reason that the parentheses fail to show is because you haven't enclosed them in quotes. Marc has.

Upvotes: 1

Marc
Marc

Reputation: 993

This should work. I'm able to use SQL queries using NOT with ADODB in VB6.

g_SQL = "SELECT 'SUM' = SUM(Units) " & _
    "FROM tblDetail WHERE " & _
    "MemID = " & udtCDtl.Lines(udtCDtlIdx).MemID & " AND " & _
    "CAST(SStartD As DateTime) >= '" & StartDate & "' AND " & _
    "CAST(SStartD As DateTime) <= '" & DateAdd("d", -1, EndDate) & "' AND " & _
    "Service = 166 AND " & _
    "[CODE] IN ('1919')) And " & _
    "NOT (InvoiceNo = " & InvoiceDtlRS!InvoiceHdrNo & " AND DtlNo = " & InvoiceDtlRS!InvoiceDtlNo & ") AND " & _
    "NOT (InvoiceNo = " & InvoiceDtlRS!InvoiceHdrNo & " AND AdjNo = " & InvoiceDtlRS!InvoiceDtlNo & ")"

Upvotes: 1

simon at rcl
simon at rcl

Reputation: 7344

Your translation of NOT(InvoiceNo = '11880' AND DtlNo = 2) to (InvoiceNo <> '11880' AND DtlNo <> 2) is incorrect.

In formal logic, !(A & B) is equivalent to (!A or !B), so it should be:

(InvoiceNo <> '11880' OR DtlNo <> 2)

This is why you're getting different results. However, why not use the original query? There's nothing in VB6 which would prevent it.

EDIT

g_SQL = "SELECT 'SUM' = SUM(Units) " & _
        "FROM tblDetail WHERE " & _
        "MemID = " & udtCDtl.Lines(udtCDtlIdx).MemID & " AND " & _
        "CAST(SStartD As DateTime) >= '" & StartDate & "' AND " & _
        "CAST(SStartD As DateTime) <= '" & DateAdd("d", -1, EndDate) & "' AND " & _
        "Service = 166 AND " & _
        "[CODE] IN (‘1919’)) And " & _
        ("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
        "DtlNo <> " & (InvoiceDtlRS! InvoiceDtlNo, "")) & " AND " & _
        ("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
        "AdjNo <> " & InvoiceDtlRS! InvoiceDtlNo)

You've got a ) in the wrong place twice. Also, the ) on the final live would be a syntax error I think. The last 5 lines should be:

        "[CODE] IN (‘1919’) And " & _
        ("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
        "DtlNo <> " & (InvoiceDtlRS!InvoiceDtlNo, "") & " AND " & _
        ("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
        "AdjNo <> " & InvoiceDtlRS!InvoiceDtlNo & ")"

Upvotes: 2

Related Questions