LibreOffice Base子表单克隆宏无法复制指定记录的技术求助
解决LibreOffice Base子表单表格控件克隆宏的活动记录问题
问题根源
原宏直接从子表单对象提取当前行数据,但表格控件网格中,表单的默认当前行和用户选中的记录往往不同步,导致始终复制第一条或最后一条记录,而非用户指定的目标记录。
修改后的宏代码
Sub Clone_To_New_Record (oEvent As Object) ' 获取触发按钮所属的表格控件 oButton = oEvent.Source.Model oTableControl = oButton.Parent oForm = oTableControl.Model.BoundForm ' 校验是否选中记录 oSelection = oTableControl.getSelectedRows() If oSelection.getCount() = 0 Then MsgBox "请先选中一条记录!", MB_OK, "提示" Exit Sub End If ' 获取选中行索引并定位到对应记录 iSelectedRow = oSelection.getByIndex(0) oRowSet = oForm.RowSet oRowSet.Absolute(iSelectedRow + 1) ' 控件行索引从0开始,RowSet从1开始计数 If oRowSet.isNew Then Exit Sub oRowSet.updateRow() ' 获取选中记录的EX字段值 iID = oRowSet.Columns.GetByName("EX").Value ' 执行克隆插入SQL oStatement = oForm.ActiveConnection.createStatement() sColumns = """EX"", ""ID2"", ""DESCRIBE"", ""AMOUNT""" sSQL = "INSERT INTO ""CLONE2"" (" & sColumns & ") SELECT " & sColumns & " FROM ""EXPLAIN"" WHERE ""EX"" = " & iID oStatement.executeUpdate(sSQL) ' 刷新表单并定位到最后一条记录 oForm.reload() oForm.last() End Sub
核心修改说明
- 直接关联表格控件:从触发按钮向上获取表格控件对象,而非仅依赖子表单
- 获取用户选中行:通过
getSelectedRows()精准捕获用户选中的记录索引 - 同步定位记录:用
RowSet.Absolute()强制将表单定位到选中的记录,解决行不同步问题 - 增加校验逻辑:避免未选中记录时执行宏导致的错误
部署步骤
- 打开LibreOffice Base表单编辑模式
- 右键克隆按钮 → 选择「控制」→「事件」
- 在「执行」事件中选择修改后的宏
Clone_To_New_Record - 保存表单后测试,选中任意记录点击按钮即可完成克隆
内容的提问来源于stack exchange,提问作者Walt
相关产品推荐
相关产品推荐

