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

LibreOffice Base form: filling table or grid control not bound to data source

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

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

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

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

For a new record there is a special method, comparable with changing to a new row in a table control. This is done as follows:

  1. Prepare for a new record: oForm.moveToInsertRow()
  2. Enter all wanted/required values. This is done using the updateXxx methods as shown in the previous section.
  3. Confirm the new data with the following command: oForm.insertRow()
  4. The new entry cannot be easily reversed. Instead you will have to delete the new record.

编辑:

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

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

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

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

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

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

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

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

参考文献: