1
我是一位VBA新手。我有這個例程有三個記錄集。前兩個將得到零件號和日期,最後一個將給出該日期和零件編號的OH庫存。然後,我使用追加查詢中的三個變量來創建每天的庫存表。我在打開第三個記錄集時遇到了問題,因爲我沒有記錄,但是我知道第一個日期的第一個項目有OH記錄。下面是SQL字符串與所述變量的定義:我在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
我不能unerstand爲什麼它指派代替代替1 20130501和0零有任何人能幫助我想出解決辦法?
在情況下,它是必需的,下面是完整的程序:
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
謝謝VBlades的回覆。起初我有點困惑。在我第一杯咖啡後,你的迴應很有道理。我必須將這兩個SQL語句從例程的開頭移到它們在循環中使用的位置,以便在每次迭代開始時選取新的變量值。現在很好用:-)非常感謝! –
@BernardFaucher:很高興你知道了!咖啡始終是關鍵。 :) – VBlades