Sql server 我对SQL语句中的变量有问题
我是VBA的新手。我有一个有三个记录集的例程。前两个将获得零件号和日期,最后一个将给出该日期和零件号的OH库存。然后,我在追加查询中使用这三个变量来创建每天的库存表。我在打开第三个记录集时被卡住了,因为我没有记录,但我知道第一天第一个项目有OH库存。以下是包含变量的SQL字符串的定义:Sql server 我对SQL语句中的变量有问题,sql-server,ms-access,vba,Sql Server,Ms Access,Vba,我是VBA的新手。我有一个有三个记录集的例程。前两个将获得零件号和日期,最后一个将给出该日期和零件号的OH库存。然后,我在追加查询中使用这三个变量来创建每天的库存表。我在打开第三个记录集时被卡住了,因为我没有记录,但我知道第一天第一个项目有OH库存。以下是包含变量的SQL字符串的定义: StrSQL2 = " SELECT top 1 " StrSQL2 = StrSQL2 & " dbo_ViewQtStock.KIPRODMAG, " StrSQL2 = S
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
你从不给变量赋值。您需要这样做:
...
Dim KIPRODMAG As Integer
Dim QTSTOCK As Integer
DTTRANS = "20130501"
KIPRODMAG = 1
....
这是一条调试语句,将在调试窗口中打印:
Debug.Print DTTRANS = 20130501
Debug.Print KIPRODMAG = 1
它将告诉您该语句是重新解析为true还是false,而不是设置变量值。谢谢各位的回答。起初我有点困惑。在我喝了第一杯咖啡后,你的回答很有道理。我必须将这两条SQL语句从例程的开始移动到循环中使用它们的地方,以便在每次迭代开始时提取新变量值。现在效果很好:-非常感谢@伯纳德·福彻:很高兴你明白了!咖啡总是关键