Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我对SQL语句中的变量有问题_Sql Server_Ms Access_Vba - Fatal编程技术网

Sql server 我对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

我是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

你从不给变量赋值。您需要这样做:

...
Dim KIPRODMAG As Integer
Dim QTSTOCK As Integer

DTTRANS = "20130501"
KIPRODMAG = 1
....
这是一条调试语句,将在调试窗口中打印:

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

它将告诉您该语句是重新解析为true还是false,而不是设置变量值。

谢谢各位的回答。起初我有点困惑。在我喝了第一杯咖啡后,你的回答很有道理。我必须将这两条SQL语句从例程的开始移动到循环中使用它们的地方,以便在每次迭代开始时提取新变量值。现在效果很好:-非常感谢@伯纳德·福彻:很高兴你明白了!咖啡总是关键