【发布时间】:2018-08-18 05:11:47
【问题描述】:
所以这次我的问题是我的 do 循环似乎没有通过记录集进行,而是对循环中的每个 SQL 事件使用相同的标准。我希望它循环遍历表单的 rs,使用每条记录中的条件来确定单独表上的匹配项并相应地调整那里的值。
在测试数据上运行循环时的立即窗口如下所示...
UPDATE [Caliper Master] SET [Bid] = [Bid] - 281, [Sold] = [Sold] + 281 WHERE [A1CardoneItemNo] = '16-4021A';
UPDATE [Caliper Master] SET [Bid] = [Bid] - 281, [Sold] = [Sold] + 281 WHERE [A1CardoneItemNo] = '16-4021A';
UPDATE [Caliper Master] SET [Bid] = [Bid] - 281, [Sold] = [Sold] + 281 WHERE [A1CardoneItemNo] = '16-4021A';
UPDATE [Caliper Master] SET [Bid] = [Bid] - 281, [Sold] = [Sold] + 281 WHERE [A1CardoneItemNo] = '16-4021A';
UPDATE [Caliper Master] SET [Bid] = [Bid] - 281, [Sold] = [Sold] + 281 WHERE [A1CardoneItemNo] = '16-4021A';
数字值和末尾的“16-4021A”都应该在每条记录中发生变化。
这是我的代码。
Private Sub btnConfirm_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
On Error GoTo EH
If Me.Dirty Then Me.Dirty = False
If MsgBox("All records have been saved. Do you wish to exit?/ Todos los registros han sido guardados. ¿Deseas salir?", vbYesNo) = vbYes Then
Set db = CurrentDb
Set rs = Me.RecordsetClone
DoCmd.DeleteObject acTable, "tblCalOrderShorts"
rs.MoveFirst
Do Until rs.EOF
If Me.QuantityHv <> 0 Then
If Me.WithBracket = -1 Then
strSQL = "UPDATE [Caliper Master] SET [Bid] = [Bid] - " & Me.QuantityHv & ", [Sold] = [Sold] + " & Me.QuantityHv & " WHERE [A1CardoneItemNo] = '" & Me.Cardone & "';"
Debug.Print strSQL
db.Execute strSQL, dbFailOnError
ElseIf Me.WithBracket = 0 Then
strSQL = "UPDATE [Caliper Master] SET [WOBracketBid] = [WOBracketBid] - " & Me.QuantityHv & ", [WOBracketSold] = [WOBracketSold] + " & Me.QuantityHv & " WHERE [A1CardoneItemNo] = '" & Me.Cardone & "';"
Debug.Print strSQL
db.Execute strSQL, dbFailOnError
ElseIf Me.WithBracket = Null Then
strSQL = "UPDATE [Caliper Master] SET [BracketBid] = [BracketBid] - " & Me.QuantityHv & ", [BracketSold] = [BracketSold] + " & Me.QuantityHv & " WHERE [A1CardoneItemNo] = '" & Me.Cardone & "';"
Debug.Print strSQL
db.Execute strSQL, dbFailOnError
ElseIf Me.WithBracket <> -1 Or 0 Or Null Then
MsgBox "Invalid value for bracket status./ No esta correcto el estado por bracket."
Exit Sub
End If
ElseIf Me.QuantityHv = 0 Then
End If
If Me.QuantityHv < Me.QuantityNd Then
If Not IsNull(DLookup("tblCalOrderShorts", "MSysObjects", "Name = 'tblCalOrderShorts'")) Then
db.Execute "CREATE TABLE tblCalOrderShorts(Cardone CHAR, QuantityNd INTEGER, QuantityHv INTEGER, Short INTEGER) "
End If
strSQL = "INSERT INTO tblCalOrderShorts(Cardone, QuantityNd, QuantityHv, Short) VALUES('" & Me.Cardone & "', " & Me.QuantityNd & ", " & Me.QuantityHv & ", " & Me.QuantityNd - Me.QuantityHv & ");"
Debug.Print strSQL
db.Execute strSQL, dbFailOnError
End If
rs.MoveNext
Loop
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "subCaliperOrderDetails", , , "[Cardone] =" & Me!subCaliperOrderDetails.Form!Cardone, , acDialog
Forms!subCaliperOrderDetails.Form.Requery
DoCmd.Close acForm, "frmCaliperPack"
Else
Exit Sub
End If
EH:
Select Case Err
Case 3376
Resume Next
Case 7874
Resume Next
Case 2465
Resume Next
Case Else
MsgBox "Run Time Error " & Err.Number & ", " & Err.DESCRIPTION
End Select
End Sub
【问题讨论】:
-
是否有理由循环遍历记录而不是只执行三个
UPDATE查询,最终一个 DDL 或一个生成表查询和一个INSERT查询? -
.WithBracket字段的状态决定了[Caliper Master]表中哪些字段需要更新。虽然我确信可以将其用于 SQL,但在接手这个项目之前,我的一般熟练程度是“自定义 minecraft 和 Skyrim mod .ini 文件”,我有点被“这是 MS Access,建立库存公司系统和自动化我们的办公流程。”我通过在线研究和书籍来解决这个问题。
-
听起来像是一个美好职业生涯的良好开端! :) 我想知道循环遍历表单的记录而不是直接使用表单记录源是否很重要(表/查询名称和 coumn 名称是什么?)。表单可以被用户过滤吗?另一个问题:
ElseIf Me.WithBracket <> -1 Or 0 Or Null的意图是什么?这个表达式肯定不是你想要的。 -
.WithBracket 是一个字段,它带有三态复选框的变体,以确定单个部件是否有另一个部件,没有另一个部件,或者只是订购额外的部分。这些数量分别存储在 [Caliper Master] 表中,并根据需要通过代码进行拆分/组合。那条线基本上是为了确保没有其他值通过。虽然我认为一个简单的“Else”会起作用,不是吗?
-
如果WithBracket是三态ComboBox,只能有三种情况……完全去掉第四种,把第三种换成简单的
Else,因为比较Null不能与 equal 比较运算符一起使用。关于使用表单 RecordSource 表/查询而不是 RecordsetClone 的问题呢?