LibreOffice 基本表单:未绑定到数据源的填充表或网格控件

问题描述

我有一个带有表单和表格控件的 LibreOffice Base DB。有一个宏可以将一些数据放入表中。该表未绑定到数据源,它有 1 列“id”。我尝试使用以下代码向空表中添加一行:

oFormTasks = oCurrentDocument.Forms.getByName("form_tasks")
oGridTasksNotDone = oFormTasks.getByName("grid_tasks_not_done")
oRowSetTasksNotDone = oGridTasksNotDone.getRowSet()
oRowSetTasksNotDone.insertRow()

并得到“函数序列错误”。 向表中添加行的正确方法是什么? 如果不可能,我可以使用某种网格控件吗?我需要它的形式,而不是对话框。

enter image description here

解决方法

来自https://wiki.documentfoundation.org/images/b/b0/BH5009-Macros.pdf

对于新记录有一种特殊的方法,相当于在表中更改新行 控制。这是按如下方式完成的:

  1. 准备新记录: oForm.moveToInsertRow()
  2. 输入所有想要/需要的值。这是使用 updateXxx 方法完成的,如上一节所示。
  3. 使用以下命令确认新数据: oForm.insertRow()
  4. 新条目不能轻易撤消。相反,您必须删除新记录。

编辑

让我们先了解一些背景信息,然后我将提供解决方案。

getRowSet() 方法具有误导性,因为表控件本身没有行集。相反,该方法获取包含表格控件的表单的行集。

与列表或组合框不同,未绑定的表格控件似乎不能有数据。可以执行 columnNames = oGridTasksNotDone.ElementNames,但仅此而已。

您可以使用 oGridModel.GridDataModel = oDataModel 等代码在对话框中创建 UNO 网格控件,但这在表单中不起作用。

通过转到Form -> Form Navigator,基本表单文档可以包含多个独立的表单。请注意,我不是在谈论子表单或不同的表单文档,而是例如导航器中的“Form1”、“Form2”。这允许在同一个文档中使用不一定相互关联的数据。

对我来说,显而易见的解决方案是创建一个仅用于表格控件的表格“Table2”。如上一段所述,创建一个单独的顶级窗体“Form2”来处理表控件,并将其记录集源设置为 Table2。然后一个宏可以填充表格控件:

  1. 从 Form2(即 Table2)的记录集中删除所有记录
  2. 从 Form1 收集数据(基于 Table1 或 Query1 或涉及的任何其他数据)
  3. 使用 Form2 的记录集插入行

或者,如果不需要使用绑定控件,您可以在表单上创建文本表格(表格 -> 插入表格)并编写宏以将值插入其中。

参考文献: