【问题标题】:I am having problems with variables in SQL statements我在 SQL 语句中遇到变量问题
【发布时间】:2014-07-21 21:45:18
【问题描述】:

我是 VBA 的新手。我有这个具有三个记录集的例程。前两个将获得零件号和日期,最后一个将提供该日期和零件号的 OH 库存。然后,我在附加查询中使用这三个变量来每天创建一个库存表。我在打开第三个记录集时卡住了,因为我没有记录,但我知道第一个日期的第一个项目有 OH 库存。这是带有变量的 SQL 字符串的定义:

StrSQL2 = "            SELECT  top 1 "
StrSQL2 = StrSQL2 & "  dbo_ViewQtStock.KIPRODMAG, "
StrSQL2 = StrSQL2 & "  dbo_ViewQtStock.DTTRANS, "
StrSQL2 = StrSQL2 & "  dbo_ViewQtStock.QTSTOCK  "
StrSQL2 = StrSQL2 & "  FROM dbo_ViewQtStock     "
StrSQL2 = StrSQL2 & "  WHERE (((dbo_ViewQtStock.KIPRODMAG)=" & KIPRODMAG & ") "
StrSQL2 = StrSQL2 & "  AND ((dbo_ViewQtStock.DTTRANS)<='" & DTTRANS & "')) "
StrSQL2 = StrSQL2 & "  ORDER BY dbo_ViewQtStock.DTTRANS DESC "

部件号 KIPRODMAG 定义为整数,日期 DTTRANS 定义为字符串(服务器上的 varchar 类型)。我用 Debug.Print 来帮我弄清楚一些事情:

Debug.Print DTTRANS = 20130501
Debug.Print KIPRODMAG = 1 

Debug.Print StrSQL2 = 
SELECT  top 1            
dbo_ViewQtStock.KIPRODMAG,            
dbo_ViewQtStock.DTTRANS,            
dbo_ViewQtStock.QTSTOCK             
FROM dbo_ViewQtStock                
WHERE (((dbo_ViewQtStock.KIPRODMAG)=0)            
AND ((dbo_ViewQtStock.DTTRANS)<=''))            
ORDER BY dbo_ViewQtStock.DTTRANS DESC  

我不明白为什么它用 null 代替 20130501,用 0 代替 1。有人可以帮我解决这个问题吗?

如果需要,这里是完整的例程:

Option Compare Database

Public Sub Stock1()
Dim cnn1 As ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
Set cnn1 = CurrentProject.Connection
Set cnn2 = CurrentProject.Connection
Set cnn3 = CurrentProject.Connection
Dim RS_IPRODMAG As New ADODB.Recordset
Dim RS_Date As New ADODB.Recordset
Dim RS_Stock As New ADODB.Recordset
RS_IPRODMAG.ActiveConnection = cnn1
RS_Date.ActiveConnection = cnn2
RS_Stock.ActiveConnection = cnn3
Dim StrSQL0 As String
Dim StrSQL1 As String
Dim StrSQL2 As String
Dim StrSQL3 As String
Dim DTTRANS As String
Dim KIPRODMAG As Integer
Dim QTSTOCK As Integer

'_____________________________________________________________________________
'RS_IPRODMAG
StrSQL0 = "            SELECT "
StrSQL0 = StrSQL0 & "  dbo_IPRODMAG.KIPRODMAG "
StrSQL0 = StrSQL0 & "  FROM dbo_IPRODMAG "
StrSQL0 = StrSQL0 & "  INNER JOIN dbo_VIProduit "
StrSQL0 = StrSQL0 & "  ON dbo_IPRODMAG.KIPRODUIT = dbo_VIProduit.KIPRODUIT "
StrSQL0 = StrSQL0 & "  WHERE (((dbo_VIProduit.flstock)=1) "
StrSQL0 = StrSQL0 & "  AND ((dbo_VIProduit.fllocation)=1)) "
StrSQL0 = StrSQL0 & "  ORDER BY dbo_IPRODMAG.KIPRODUIT "

'_____________________________________________________________________________
'RS_Date
StrSQL1 = "            SELECT dbo_View_ITrans_Periodes.DTTRANS "
StrSQL1 = StrSQL1 & "  FROM dbo_View_ITrans_Periodes "
StrSQL1 = StrSQL1 & "  WHERE (((dbo_View_ITrans_Periodes.noannee)=2014)) "

'_____________________________________________________________________________
'RS_Stock
StrSQL2 = "            SELECT  top 1 "
StrSQL2 = StrSQL2 & "  dboViewQtStock.KIPRODMAG, "
StrSQL2 = StrSQL2 & "  dboViewQtStock.DTTRANS, "
StrSQL2 = StrSQL2 & "  dboViewQtStock.QTSTOCK  "
StrSQL2 = StrSQL2 & "  FROM dboViewQtStock     "
StrSQL2 = StrSQL2 & "  WHERE (((dboViewQtStock.KIPRODMAG)=" & KIPRODMAG & ") "
StrSQL2 = StrSQL2 & "  AND ((dboViewQtStock.DTTRANS)<='" & DTTRANS & "')) "
StrSQL2 = StrSQL2 & "  ORDER BY dboViewQtStock.DTTRANS DESC "

'______________________________________________________________________________
'Append to STOCK
StrSQL3 = "            INSERT INTO STOCK ( KIPRODMAG, DTTRANS, QTSTOCK ) "
StrSQL3 = StrSQL3 & "  SELECT "
StrSQL3 = StrSQL3 & "  & KIPRODMAG  & ", "
StrSQL3 = StrSQL3 & "  '" & DTTRANS & "'" & ", "
StrSQL3 = StrSQL3 & "  '" & QTSTOCK & "'" & " "

'_____________________________________________________________________________
'Open recordset RS_IPRODMAG
RS_IPRODMAG.Open StrSQL0
RS_IPRODMAG.MoveFirst

'_____________________________________________________________________________
'Start of loop #1
Do While Not RS_IPRODMAG.EOF
KIPRODMAG = RS_IPRODMAG.Fields(0).Value
'_____________________________________________________________________________
'Open recordset RS_Date
 RS_Date.Open StrSQL1
 RS_Date.MoveFirst

 '____________________________________________________________________________
 'Start of loop #2
 Do While Not RS_Date.EOF
 DTTRANS = RS_Date.Fields(0).Value
 '_________________________________________________________________________________
 'Open recordset RS_STOCK
 Debug.Print DTTRANS
 Debug.Print KIPRODMAG
 Debug.Print StrSQL2
 DoCmd.RunCommand acCmdDebugWindow
 RS_Stock.Open StrSQL2
 QTSTOCK = RS_Stock.Fields(2).Value

    '_____________________________________________________________________________________
'Append table STOCK
DoCmd.RunSQL StrSQL3
RS_Stock.Close
RS_Date.MoveNext
Loop
end of loop #2
    '_____________________________________________________________________________________

RS_Date.Close
RS_IPRODMAG.MoveNext
Loop
'END of loop #1
'______________________________________________________________________________________

RS_IPRODMAG.Close
cnn1.Close

End Sub

【问题讨论】:

    标签: sql-server ms-access vba


    【解决方案1】:

    你永远不会给你的变量赋值。你需要这样做:

    ...
    Dim KIPRODMAG As Integer
    Dim QTSTOCK As Integer
    
    DTTRANS = "20130501"
    KIPRODMAG = 1
    ....
    

    这是一个调试语句,将打印在您的调试窗口中:

    Debug.Print DTTRANS = 20130501
    Debug.Print KIPRODMAG = 1
    

    它会告诉你语句解析为真还是假,而不是设置你的变量值。

    【讨论】:

    • 感谢 VBlades 的回复。一开始我有点纳闷。在我喝完第一杯咖啡后,你的回答很有道理。我必须将两个 SQL 语句从例程的开头移到它们在循环中使用的位置,以便在每次迭代开始时获取新的变量值。现在效果很好 :-) 非常感谢!
    • @BernardFaucher:很高兴你知道了!咖啡永远是关键。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多