2014-07-21 41 views
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 

回答

0

你永遠不給你值的變量。你需要這樣做:

... 
Dim KIPRODMAG As Integer 
Dim QTSTOCK As Integer 

DTTRANS = "20130501" 
KIPRODMAG = 1 
.... 

這是一個調試語句將在您的調試窗口打印:

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

它會告訴你該語句reseolves爲真或假,是否不設置您的變量值。

+0

謝謝VBlades的回覆。起初我有點困惑。在我第一杯咖啡後,你的迴應很有道理。我必須將這兩個SQL語句從例程的開頭移到它們在循環中使用的位置,以便在每次迭代開始時選取新的變量值。現在很好用:-)非常感謝! –

+0

@BernardFaucher:很高興你知道了!咖啡始終是關鍵。 :) – VBlades