我有一个定期运行的VBA脚本。根据时基,它运行不同的模块。我正在经历的一个问题是,我以前没有经历过这个问题,因为该模块似乎过早地退出了。它让我质疑我的方法。我的理解是module.sub不会结束或退出,直到它结束,退出,无论模块运行的条件如何。我错了吗?
Private Sub tmr1Sec_Change()
timeBase = seconds Mod 5 'Set a 4 second time base
Select Case timeBase
Case 1 To 2
errorPosition = "ThisDisplay.tmr1Sec_Change.machineState 2.1"
Call aofResults.orderPoll '
Case 2 To 3
errorPosition = "ThisDisplay.tmr1Sec_Change.machineState 2.2"
If orderExists = True Then 'Set by the orderPoll Module
Call aofResults.linePoll
End If
Case 3 To 4
Case Else
End Select
End Sub
aofResults.linePoll
Public Sub linePoll()
errorPosition = "aofResults.linePoll"
On Error GoTo errorTrap
Err.Clear
Dim rst As ADODB.Recordset
Dim rstA As ADODB.Recordset
Dim rstB As ADODB.Recordset
Dim rstC As ADODB.Recordset
Dim rstD As ADODB.Recordset
Dim rstE As ADODB.Recordset
Dim packQty As Integer
Dim m As Integer
Dim formFactor As Integer
m = 0
constr = "Provider=sqloledb;data source=xxxxxxxxxxxxxx;initial catalog=xxxxxxxxxxxxxxxx;user id=xxxxxxxxxxx;password=xxxxxxxxxxx"
'set the machine to recieve state
Set conn = New ADODB.connection
Set cmd = New ADODB.Command
conn.Open constr
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT SUM(lQ.[QUANTITY]) FROM [AOF_ORDER_LINE_QUEUE] AS lQ LEFT JOIN [AOF_ORDER_QUEUE] AS oQ ON lQ.[SALES_ORDER_NUMBER] = oQ.[SALES_ORDER_NUMBER]"
Set rst = cmd.Execute 'Get total order quantity, may change if inventory depletes.
Set eTag = ThisDisplay.eGroup.Item("AOF\soQuantity")
eTag.value = rst(0)
cmd.CommandText = "SELECT Count(rL.SERIAL_NUMBER) FROM [AOF_OPTIC_RESULTS] AS rL WHERE EXISTS (SELECT [SO_LINE_NUMBER] FROM [AOF_ORDER_LINE_QUEUE] AS lQ LEFT JOIN [AOF_ORDER_QUEUE] AS oQ ON lQ.[SALES_ORDER_NUMBER] = oQ.SALES_ORDER_NUMBER) AND [REJECT] = 0"
Set rst = cmd.Execute
Set eTag = ThisDisplay.eGroup.Item("AOF\soQuantityPacked")
eTag.value = rst(0)
Set eTag = ThisDisplay.eGroup.Item("Machine\itoSettings0") 'Evaluate packing quantity against machine settings (stored in DB, written to PLC at first startup)
If rst(0) < eTag.value Then
Set eTag = ThisDisplay.eGroup.Item("AOF\manualPack") 'Evaluate packing quantity
eTag.value = True
Else
eTag.value = False
End If
rst.Close
cmd.CommandText = "SELECT lQ.[SO_LINE_NUMBER],lQ.[QUANTITY],lQ.[SELECTED],lQ.[FORM_FACTOR_ID], lQ.[FINISHED_PART_NUMBER], lQ.[OEM_PART_NUMBER],lQ.[COMPATIBILITY], oQ.[INDIVIDUAL_PACKAGING], oQ.[SALES_ORDER_NUMBER] FROM [AOF_ORDER_QUEUE] AS oQ LEFT JOIN [AOF_ORDER_LINE_QUEUE] AS lQ ON oQ.[SALES_ORDER_NUMBER] = lQ.[SALES_ORDER_NUMBER] WHERE lQ.[SO_LINE_NUMBER] IS NOT NULL ORDER BY lQ.[SELECTED] DESC,lQ.[COMPLETED] ASC"
Set rstA = cmd.Execute() 'Returns the line orders associated to the sales order
If Not rstA.EOF = True Then
Set eTag = ThisDisplay.eGroup.Item("AOF\SOLineNumber")
eTag.value = rstA(0)
Set eTag = ThisDisplay.eGroup.Item("AOF\QuantityOrdered")
eTag.value = rstA(1)
Set eTag = ThisDisplay.eGroup.Item("AOF\FinishedPartNumber")
eTag.value = rstA(4)
Set eTag = ThisDisplay.eGroup.Item("AOF\OEMPartNumber")
eTag.value = rstA(5)
Set eTag = ThisDisplay.eGroup.Item("AOF\Compatibility")
eTag.value = rstA(6)
Set eTag = ThisDisplay.eGroup.Item("AOF\IndividualPack")
eTag.value = rstA(7)
cmd.CommandText = "SELECT COUNT(rL.SERIAL_NUMBER) FROM [AOF_OPTIC_RESULTS] AS rL LEFT JOIN [AOF_ORDER_OPTICS] AS oL ON oL.[SERIAL_NUMBER] = rL.[SERIAL_NUMBER] WHERE rL.REJECT = 0 AND oL.[SO_LINE_NUMBER] = " & rstA(0) & ""
Set rstB = cmd.Execute() 'Returns the count of the parts associated to the above line order that passed
If Not rstB.EOF = True Then
Set eTag = ThisDisplay.eGroup.Item("AOF\QuantityPassed")
eTag.value = rstB(0)
Select Case rstA(1) - rstB(0) 'Evaluate Qty left to process in active line order
Case Is = 0 'Qty Zero (Line order complete)
cmd.CommandText = "SELECT COUNT(lQ.[COMPLETED]) FROM [AOF_ORDER_LINE_QUEUE] AS lQ LEFT JOIN [AOF_ORDER_QUEUE] AS oQ ON oQ.[SALES_ORDER_NUMBER] = lQ.[SALES_ORDER_NUMBER] WHERE oQ.[SELECTED] = 'True'"
Set rstD = cmd.Execute() 'Check line queue quantity associated to the sales order, count the line orders associated to the current sales order in the queue
cmd.CommandText = "UPDATE [AOF_ORDER_LINE_QUEUE] SET [SELECTED] = 'False' WHERE [SO_LINE_NUMBER] = " & rstA(0) & ""
cmd.Execute 'Unselect the currently index line order
cmd.CommandText = "UPDATE [AOF_ORDER_LINE_QUEUE] SET [COMPLETED] = 'True' WHERE [SO_LINE_NUMBER] = " & rstA(0) & ""
cmd.Execute 'Set order as completed
'Set the currently indexed line order as selected
If rstD(0) <> 0 Then
cmd.CommandText = "SELECT COUNT(lQ.[COMPLETED]) FROM [AOF_ORDER_LINE_QUEUE] AS lQ LEFT JOIN [AOF_ORDER_QUEUE] AS oQ ON oQ.[SALES_ORDER_NUMBER] = lQ.[SALES_ORDER_NUMBER] WHERE oQ.[SELECTED] = 'True' AND [COMPLETED] = 'True'"
Set rstE = cmd.Execute() 'count the line orders marked completed
If rstD(0) = rstE(0) Then 'if the line queue count matches the line queue completed count complete the order
Set eTag = ThisDisplay.eGroup.Item("AOF\orderFulfillmentMode") 'Checks that order fulfillment mode is turned off
If eTag.value = True Then
boxNum = 0
cmd.CommandText = "UPDATE [AOF_ORDER_QUEUE] SET [SELECTED] = 'False' WHERE [SALES_ORDER_NUMBER] = '" & rstA(9) & "'"
cmd.Execute 'Set's the current sales order selected bit to off
cmd.CommandText = "UPDATE [MACHINE_STATE] SET [STATUS] = 'ERP' where [OPERATING_STATE] = 2"
cmd.Execute 'sets the status back to ERP
cmd.CommandText = "DELETE FROM [AOF_OPTIC_RESULTS]"
cmd.Execute
Set eTag = ThisDisplay.eGroup.Item("AOF\soFinished")
eTag.value = True
End If
End If
rstE.Close
Else
rstA.MoveNext 'Index to the next line order in the record set
cmd.CommandText = "UPDATE [AOF_ORDER_LINE_QUEUE] SET [SELECTED] = 'True' WHERE [SO_LINE_NUMBER] = " & rstA(0) & ""
cmd.Execute
End If
rstD.Close
Case Is > 0 'Qty Remaining > Line Order Qty (Line Order Select)
cmd.CommandText = "SELECT fF.[FORM_FACTOR_DESCRIPTION] FROM [FORM_FACTOR] AS fF LEFT JOIN [AOF_ORDER_LINE_QUEUE] AS lQ ON lQ.[FORM_FACTOR_ID] = fF.[FORM_FACTOR_ID] WHERE lQ.[SELECTED] = 'True'"
Set rstC = cmd.Execute() 'Returns the form factor description that is currently selected in the order line queue
If Not rstC.EOF = True Then
Set eTag = ThisDisplay.eGroup.Item("AOF\FormFactor")
eTag.value = rstC(0)
Set eTag = ThisDisplay.eGroup.Item("AOF\NextOpticXFP")
Select Case rstC(0)
Case Is = "XFP"
eTag.value = True
Case Is <> "XFP"
eTag.value = False
End Select
End If
rstC.Close
cmd.CommandText = "UPDATE [AOF_ORDER_LINE_QUEUE] SET [SELECTED] = 'True' WHERE [SO_LINE_NUMBER] = " & rstA(0) & ""
cmd.Execute 'Set line as selected
cmd.CommandText = "SELECT oL.[SERIAL_NUMBER],ol.[RACK],ol.[TRAY],ol.[POSITION] FROM [AOF_ORDER_OPTICS] oL WHERE NOT EXISTS ( SELECT * FROM [AOF_OPTIC_RESULTS] rL WHERE oL.[SERIAL_NUMBER] = rL.[SERIAL_NUMBER] ) AND oL.[SO_LINE_NUMBER] = " & rstA(0) & ""
Set rstE = cmd.Execute 'Pull in the top level serial number and location for the next optic that doesn't exist in this line order
If Not rstE.EOF = True Then
Set eTag = ThisDisplay.eGroup.Item("AOF\NextOpticSerNo")
eTag.value = rstE(0)
Set eTag = ThisDisplay.eGroup.Item("AOF\NextOpticStk")
eTag.value = rstE(1)
Set eTag = ThisDisplay.eGroup.Item("AOF\NextOpticTry")
eTag.value = rstE(2)
Set eTag = ThisDisplay.eGroup.Item("AOF\NextOpticPsn")
eTag.value = rstE(3)
Set eTag = ThisDisplay.eGroup.Item("AOF\ITO_OpticsReady")
eTag.value = True
Else
MsgBox ("Error: No optics associated with line order " & rstA(0) & " exist in database")
End If
rstE.Close
Case Else
End Select
Else
MsgBox ("Error: No line orders exist for sales order " & rstA(4) & ".")
End If
ElseIf rstA.EOF = True Then
MsgBox ("Error: No sales order exists or no line orders associated to sales order: " & rstA(4) & " exists.")
End If
conn.Close
cleanExit:
' If Not rst Is Nothing Then rst.Close
' If Not rstA Is Nothing Then rstA.Close
' If Not rstB Is Nothing Then rstB.Close
' If Not rstC Is Nothing Then rstC.Close
' If Not rstD Is Nothing Then rstD.Close
' If Not rstE Is Nothing Then rstE.Close
' If Not conn Is Nothing Then conn.Close
Exit Sub
errorTrap:
LogDiagnosticsMessage "_Eventwatcher.gfx, Position: " & errorPosition & " , Error Code: [ " & Hex(Err.number) & "], Description: " & Err.Description & ""
' Set ThisDisplay.eGroup = Nothing
' Set eTag = Nothing
Resume cleanExit
End Sub
答案 0 :(得分:0)
这就是执行的方式: 1.为timeBase指定值1到4 (假设创建了timeBase并创建了秒并全局设置) 2. select语句将执行一次,具体取决于timeBase的值。 3.到达结束选择并退出选择语句。 4.到达End Sub并退出子。
如果你想让sub重复执行,你可以将它包围在for()循环或while()循环中。
答案 1 :(得分:0)
我发现了这个问题,虽然我担心它不会引发vb错误。问题是某些SQL单元“可以”为空,如果我尝试将空值分配给标签变量,它只是退出模块而没有任何信息。