使用特定的过滤器/查询在Libreoffice / Openoffice Base中打开一个表单

时间:2015-01-14 01:42:12

标签: openoffice.org libreoffice openoffice-base libreoffice-base libreoffice-basic

我正在创建一个包含多种形式的Libreoffice Base。 Form1链接到" Projects" table和每个Project都有多个任务,我可以在同一个Form1中将任务显示为子表单,但是,每个项目都有很多任务,每个任务也有子任务所以我想让任务以他们自己的形式,让我们调用Form2。

我在Form1中创建了一个按钮,它将打开Form2,但是,我不知道如何打开它,只显示与按下推送时显示的项目相关的任务按钮。

到目前为止,我能够做到这一点:

读取我要显示任务的projectID(它位于Form1中名为txtProjectID的文本框中):

Doc = StarDesktop.CurrentComponent
Form = Doc.DrawPage.Forms.GetByIndex(0)
ProjID = Form.getByName("txtProjectID").Text

要从Form2打开任务,我找到了两种方法:

Dim Args(1) As New com.sun.star.beans.PropertyValue
Args(0).Name = "ActiveConnection"
Args(0).Value = Form.ActiveConnection
Args(1).Name = "OpenMode"
Args(1).Value = "open"
oForm = thisComponent.Parent.getFormDocuments
oForm.loadComponentFromURL("Form2","_blank",0, Args())

oForm = ThisDatabaseDocument.FormDocuments.getByName("Form2")
oForm.Open

两者都可以打开任务表单,但我找不到传递projectID的方法,只能加载与该项目相关的记录。我也找不到Args()的好文档。

问题是,如何打开Form2并仅显示与Form1中的projectID相关的记录?我也希望能够在同一个projectID(而不仅仅是视图)下向Form2添加新记录。


更新

我能够使用以下代码应用过滤器:

odoc2 = thiscomponent
FormModel = odoc2.drawpage.forms.getbyindex(0) 
FormModel.Filter =("Tasks.projectID = " & ProjID)
FormModel.ApplyFilter = True
FormModel.reload()

但是,由于我从打开Form2的同一个Sub运行它,因此它将应用于Form1(称为Sub)。我怎样才能让它在Form2上工作呢?

1 个答案:

答案 0 :(得分:1)

您的问题提供了大部分答案,只需要对dbg_methods进行一些探索。以下示例中的对象变量FormModel2就是您要查找的内容:

frm_container = ThisDatabaseDocument.FormDocuments.getByName("Form2")
frm_container.open
FormModel2 = frm_container.component.getDrawPage.getforms.getbyindex(0)
FormModel2.Filter [....]

从“Form1”运行时可以使用。

或者,您可以将应该作为过滤器主题的值永久存储在单独的表/行中。