我正在使用SQL SERVER 2012开发VB6。我发现自己陷入困境。基本上我有一个工作正常的查询并在SQL SERVER中提取必要的数据,但是,我很难将其转换为vb6 SQL代码。这是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
);
因此,当我尝试在我的vb6应用程序中编写它时,我会执行类似
的操作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
);
然而,这并没有给我相同的结果。发生的事情发生在我的最后两个条款中
( InvoiceNo <> '11880' AND DtlNo<> 2) AND (InvoiceNo <> '11880' AND AdjNo <> 2)
当我最终在SQL SERVER中运行它们时,没有paranthesis,并且绝对不利于2个单独的子句处于paranthesis状态。谁知道我能做什么?我认为我的最后一招可能是创建一个商店程序,但我真的不想这样做。
编辑:
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)
答案 0 :(得分:2)
您将NOT(InvoiceNo =&#39; 11880&#39; AND DtlNo = 2)翻译为(InvoiceNo&lt;&gt;&#39; 11880&#39; AND DtlNo&lt;&gt; 2)不正确。
在形式逻辑中,!(A&amp; B)相当于(!A或!B),所以它应该是:
(InvoiceNo <> '11880' OR DtlNo <> 2)
这就是为什么你会得到不同的结果。但是,为什么不使用原始查询? 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 " & _
("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
"DtlNo <> " & (InvoiceDtlRS! InvoiceDtlNo, "")) & " AND " & _
("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
"AdjNo <> " & InvoiceDtlRS! InvoiceDtlNo)
你有两次在错误的地方。另外,最后一次直播会是我认为的语法错误。最后5行应该是:
"[CODE] IN (‘1919’) And " & _
("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
"DtlNo <> " & (InvoiceDtlRS!InvoiceDtlNo, "") & " AND " & _
("InvoiceNo <> " & InvoiceDtlRS!InvoiceHdrNo & " OR " & _
"AdjNo <> " & InvoiceDtlRS!InvoiceDtlNo & ")"
答案 1 :(得分:1)
这应该有效。我能够在VB6中使用NOT与ADODB一起使用SQL查询。
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 & ")"
答案 2 :(得分:1)
虽然Marc可能已经给你一个有效的查询,但Simon的问题仍然有效。原始查询不起作用的唯一原因是因为您使用了引号。您会注意到,引用InvoiceNo的括号不在引号内而是在它们内部(还有其他问题,通过更改原始查询,但我会让您自己解决这些问题)。这使得它们不是引用字符串的一部分,而是VB6表达式的一部分。坦率地说,Marc并没有通过提供一个恰好具有所有VB6语法正确的替代SQL查询来帮助你,而你的查询却没有。真正的问题是你还没有弄清楚如何仔细地将SQL查询放入带引号的字符串中。
如果你想擅长自己所做的事情,你就无法承受这种粗心大意。我不是说这是冒犯性的,而是要引起你的注意。通过采用Marc的解决方案作为正确的解决方案,你还没有真正解决你的问题,因为你的问题是一种心态,除了得到一些工作之外什么都不考虑。这种思维方式造就了最糟糕的程序员,那种编写可怕代码的程序(例如,数百行代码可以在10中完成),这对于那些必须在以后维护它的人来说是个噩梦。不要成为那些人之一。如果你不知道为什么某些东西不起作用,那就去找出原因。对于每个问题,你只需要做一次,而且随着你不断发展自己的技能,这种心态会对你有所帮助。
同样,没有任何不尊重的意图。我只是想让你明白如何避免将来像这样的“泡菜”。希望下次你在这里发一个问题时,你所处的“泡菜”会更复杂。 :)
编辑:我想我不是很清楚自己。简单的规则是,您需要在引用的字符串中包含工作SQL查询中的所有内容,并将文本搜索值替换为对文本框,字段或其他内容的引用。所以: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 & _
");"
其中myVariable是您要用文件字符串替换的任何变量引用。您给出的任何示例都会在放置双引号时出错,这就是您无法获得所需结果的原因,这可能是您正在运行的SQL查询的复制。 Marc的作品之所以不是因为他改变了你的原始查询(它看起来不像他有,除了把它放在更少的线上),而是因为他正确地放置了他的引号。你和西蒙的解决方案不起作用的原因是因为你们两个都没有。回到原始帖子,括号无法显示的原因是因为您没有将它们括在引号中。马克有。