提问人:One_I_Willy 提问时间:11/7/2023 最后编辑:One_I_Willy 更新时间:11/8/2023 访问量:56
我的子表单有两个问题
I have two issues with a sub form
问:
首先是布局。所有表单都是未绑定的。 我有一个收集检查、客户和位置数据的主窗体。添加后,他们选择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
答:
如果表单是 UNBOUND,则没有要引用的表单 Recordset,也没有“行”。如果需要保存 UNBOUND 窗体和 UNBOUND 控件中的数据,则引用控件,而不是不存在的 Recordset。这意味着循环访问窗体上的控件。选项:
循环遍历所有带有条件的控件,以确定控件是否为带有数据的类型(Tag 属性对此很有用) - Web 上此方法的许多示例
按名称循环特定的控件 - 如果命名类似于: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
展开此代码以在创建记录之前测试控件是否具有数据。
评论