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:
- Prepare for a new record:
oForm.moveToInsertRow()
- Enter all wanted/required values. This is done using the updateXxx methods as shown in the previous section.
- Confirm the new data with the following command:
oForm.insertRow()
- 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 控件:
- 从 Form2 的记录集中删除所有记录(即 Table2)
- 从 Form1 收集数据(基于 Table1 或 Query1 或涉及的任何其他数据)
- 使用 Form2 的记录集插入行
或者,如果不需要使用绑定控件,您可以在表单上创建文本 Tables (Table -> Insert Table) 并编写宏以将值插入其中。
参考文献:
我有一个带有表单和 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:
- Prepare for a new record:
oForm.moveToInsertRow()
- Enter all wanted/required values. This is done using the updateXxx methods as shown in the previous section.
- Confirm the new data with the following command:
oForm.insertRow()
- 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 控件:
- 从 Form2 的记录集中删除所有记录(即 Table2)
- 从 Form1 收集数据(基于 Table1 或 Query1 或涉及的任何其他数据)
- 使用 Form2 的记录集插入行
或者,如果不需要使用绑定控件,您可以在表单上创建文本 Tables (Table -> Insert Table) 并编写宏以将值插入其中。
参考文献: