我的子表单有两个问题

I have two issues with a sub form

提问人:One_I_Willy 提问时间:11/7/2023 最后编辑:One_I_Willy 更新时间:11/8/2023 访问量:56

问:

首先是布局。所有表单都是未绑定的。 我有一个收集检查、客户和位置数据的主窗体。添加后,他们选择cmd按钮以打开用于添加焊缝信息的子表单。在这个子窗体中,我有一个组合框,当他们选择某种处置时,它会使第三个子窗体可见。此子窗体位于数据表视图中,用于向weld_id添加缺陷。 表。tbl_1用于检查表(主表单)。TBL-2 是焊缝数据。它们有一个联接表。tbl_3是一个缺陷表,其中包含用于tbl_2和tbl_3的连接表。此联接表具有 autoID、weld_id、defect_id 和 defect_qty (txtbox)。 表单工作正常,除了sfrm_2(数据表视图)不允许我输入多行数据。

我最大的问题来自sfrm_1焊数据上的刀片。当我执行 cmd 按钮时,它会将所有内容正确插入tbl_2并将tbl_2 @@identity插入 tbl_2/tbl_3 连接表中。它不会将 defect_id 和 txtbox 值 (defect_qty) 插入联接表中。我尝试了很多不同的方法,我不知所措。我已经运行了调试器,无论我做什么,我都会收到一个需要对象的错误。一切都正确命名并存在。

我认为它必须与cbobox有关。尽管代码正在查看框中的defect_id,但它只是拒绝插入。

Access 版本是 Office 360 中的最新版本。我知道有些编码可能因不同版本而异。

我什至在 ChatGPT 中删除了代码,看看它是否能找到丢失的代码,它回来说“它看起来像你”,并准确地描述了我想要的东西,并说它应该工作正常。也许你们都能看到这里出了什么问题,或者它可能在表单属性的某个地方?

我想知道的另一件事是我是否应该为sfrm_2构建查询。如果这会让事情变得更好?但这会将表单绑定到查询,不是吗?也许出于这个目的,这不会导致数据库扩展的未来问题。

编辑我又看了看,我想知道。我是否需要添加一个“dim defectID as long” 那么 “defectID = Nz(me.cbo_defect_id, 0)”?

这是 VBA。希望有人能看到我在这方面缺少的东西。

Private Sub Form_Load()
   Me.defects.Visible = False

End Sub


Private Sub cbo_disposition_Change()
   If cbo_disposition <> "Accept" Then
      Me.defects.Visible = True
   Else
      Me.defects.Visible = False
   End If
End Sub

Private Sub cmd_insert_weld_Click()


    Dim db As DAO.Database
    Dim rsWeld As DAO.Recordset
    Dim rsWeldDefectJoin As DAO.Recordset
    Dim strSQL As String
    Dim weldID As Long
  
    Dim dispositionID As Long
      dispositionID = Nz(Me.cbo_disposition, 0)
      'if dispo id is not found, exit function
      If dispositionID = 0 Then
         MsgBox "disposition not selected. Please enter disposition.", vbExclamation, "Error"
         Exit Sub
      End If
  
    ' Insert weld table data and retrieve the auto-generated weld_id
    Set db = CurrentDb
    strSQL = "INSERT INTO tbl_welds (weld_no, disposition_id, comments) " & _
         "VALUES ('" & Me.txt_weld_no & "', '" & dispositionID & "', '" & Me.txt_comments &      "');"
    db.Execute strSQL
    strSQL = "SELECT @@Identity AS LastWeldID;"
    Set rsWeld = db.OpenRecordset(strSQL)
    weldID = rsWeld!LastWeldID
    rsWeld.Close
    Set rsWeld = Nothing

    ' Insert records into WeldDefectJoin for selected defects
    If disposition_id <> 1 Then
        Set rsWeldDefectJoin = db.OpenRecordset("tbl_weld_defect_join")
        *****For Each row In Me.defects.Form.Recordset  <----this is what the debug highlights as missing object*****
            If row("defect_id") = True Then
                ' Add a record to WeldDefectJoin for each selected defect
                rsWeldDefectJoin.AddNew
                rsWeldDefectJoin!weld_id = weldID
                rsWeldDefectJoin!defect_id = row("defect_id")
                rsWeldDefectJoin!defect_qty = row("defect_qty")
                rsWeldDefectJoin.Update
            End If
        Next
        rsWeldDefectJoin.Close
        Set rsWeldDefectJoin = Nothing
    End If

    ' Reset form elements
    Set db = Nothing
    Me.txt_weld_no = ""
    Me.cbo_disposition = Null
    Me.txt_comments = ""
    Me.defects.Form.Requery
End Sub
VBA MS-访问

评论

0赞 June7 11/8/2023
什么是?它既未声明,也未设置。如果表单是 UNBOUND,则没有要引用的表单 Recordset,也没有“行”。如果需要保存 UNBOUND 窗体和 UNBOUND 控件中的数据,则引用控件,而不是 Recordset。
0赞 June7 11/8/2023
数据表视图中的 UNBOUND 表单不允许多行输入也就不足为奇了。没有与此窗体关联的记录集。输入无处可去。没有记录导航。为什么你要使用 UNBOUND 表单并为自己创建所有这些工作,而不是让 Access 完成繁重的工作?
0赞 One_I_Willy 11/9/2023
row 是 chatGPT 提供的尝试和绑定控件的内容。我提供的代码类似于迭代编号 12。

答:

1赞 June7 11/8/2023 #1

如果表单是 UNBOUND,则没有要引用的表单 Recordset,也没有“行”。如果需要保存 UNBOUND 窗体和 UNBOUND 控件中的数据,则引用控件,而不是不存在的 Recordset。这意味着循环访问窗体上的控件。选项:

  1. 循环遍历所有带有条件的控件,以确定控件是否为带有数据的类型(Tag 属性对此很有用) - Web 上此方法的许多示例

  2. 按名称循环特定的控件 - 如果命名类似于:cbxDID1、tbxQty1、cbxDID2、tbxQty2 等,则代码可以使用迭代变量在循环中动态构建控件名称

选项 2 的示例 - 假设您有 10 个“行”控件,请考虑:

For x = 1 to 10
    rsWeldDefectJoin.AddNew
    rsWeldDefectJoin!weld_id = weldID
    rsWeldDefectJoin!defect_id = Me("cbxDID" & x)
    rsWeldDefectJoin!defect_qty = Me("tbxQty" & x)
    rsWeldDefectJoin.Update
Next

展开此代码以在创建记录之前测试控件是否具有数据。