【问题标题】:VBA Do loop repeats same recordVBA Do循环重复相同的记录
【发布时间】: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 &lt;&gt; -1 Or 0 Or Null的意图是什么?这个表达式肯定不是你想要的。
  • .WithBracket 是一个字段,它带有三态复选框的变体,以确定单个部件是否有另一个部件,没有另一个部件,或者只是订购额外的部分。这些数量分别存储在 [Caliper Master] 表中,并根据需要通过代码进行拆分/组合。那条线基本上是为了确保没有其他值通过。虽然我认为一个简单的“Else”会起作用,不是吗?
  • 如果WithBracket是三态ComboBox,只能有三种情况……完全去掉第四种,把第三种换成简单的Else,因为比较Null 不能与 equal 比较运算符一起使用。关于使用表单 RecordSource 表/查询而不是 RecordsetClone 的问题呢?

标签: sql ms-access vba


【解决方案1】:

您循环记录集rs,但在创建sql 字符串时使用Me.QuantityHv 之类的表单数据。

这将始终使用表单上当前记录中的数据,即每次循环迭代都使用相同的值。

改用来自rs 的值,例如rs!QuantityHv.

【讨论】:

  • 这会导致在 rs.QuantityHv 上找不到编译错误、方法或数据成员。我有 DAO 方法的正确引用,并且 rs 包含该字段。
  • 知道了。不得不用!而不是 。在 rs!QuantityHv 中。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2020-12-30
  • 2011-02-04
相关资源
最近更新 更多