libreoffice base创建一个由另一个列表的值过滤的列表

时间:2017-12-15 16:29:56

标签: forms list libreoffice libreoffice-base

我有一张省份表和一张有ProvienceID的城市表。在表单中,我想创建一个按所选值列表筛选的城市列表。 我怎么能这样做?

我可以创建两个列表,但是城市列表显示了所有省份的所有城市,但我想只显示我在省份列表中选择的省份的城市。

我有另一张桌子"用户"使用" CityID"和#34;省份ID"我的表单编辑了它,我需要在其中保存省和城市列表的选定值,而不仅仅是在表单中显示。

1 个答案:

答案 0 :(得分:0)

创建两个名为"省份"的示例表。和"城市"。

ProvinceID  Name    
~~~~~~~~~~  ~~~~
0           South   
1           North   
2           Large Midwest   
3           Southeast   
4           West    

CityID  Name              ProvinceID
~~~~~~  ~~~~              ~~~~~~~~~~
0       Big City          2
1       Very Big City     2
2       Rural Village     1
3       Mountain Heights  0
4       Coastal Plains    4
5       Metropolis        2

创建一个名为" ProvinceNames":

的查询
SELECT "Name" AS "Province"
FROM "Provinces"
ORDER BY "Province" ASC

创建一个名为" City of City":

的查询
SELECT "Provinces"."Name" AS "Province", "Cities"."Name" AS "City"
FROM "Cities", "Provinces" WHERE "Cities"."ProvinceID" = "Provinces"."ProvinceID"
ORDER BY "Province" ASC, "City" ASC

在表单中,根据查询" ProvinceNames"创建一个表控件。

使用表单导航器(或表单向导),为查询"省市"创建子表单。

Form Navigator

右键单击子窗体并选择属性。在数据标签下:

  • 链接主字段"省"
  • 链接奴隶字段"省"

也为子窗体创建表控件。现在,子窗体控件中显示的城市取决于在主窗体控件中选择的省份。

Result

修改

以下是使用过滤器表存储列表框当前值的示例。再创建两个名为" User"和" FilterCriteria"。

UserID  Name     ProvinceID  CityID
~~~~~~  ~~~~~~~  ~~~~~~~~~~  ~~~~~~
0       Person1  1           2
1       Person2  2           0

RecordID  ProvinceID  CityID
~~~~~~~~  ~~~~~~~~~~  ~~~~~~
the only  0           0

我们还需要两个可以存储在文档或My Macros中的Basic宏。转到工具 - >宏 - >组织宏 - > LibreOffice Basic

Sub ReadProvince (oEvent as Object)
    forms = ThisComponent.getDrawPage().getForms()
    mainForm = forms.getByName("MainForm")
    cityForm = forms.getByName("CityForm")
    listboxProvince = mainForm.getByName("listboxProvince")
    listboxCity = cityForm.getByName("listboxCity")
    selectedItemID = listboxProvince.SelectedValue
    If IsEmpty(selectedItemID) Then
        selectedItemID = 0
    End If
    conn = mainForm.ActiveConnection
    stmt = conn.createStatement()
    strSQL = "UPDATE ""FilterCriteria"" SET ""ProvinceID"" = " & selectedItemID & _
             "WHERE ""RecordID"" = 'the only'"
    stmt.executeUpdate(strSQL)
    listboxCity.refresh()
    lCityCol = mainForm.findColumn("CityID")
    currentCityID = mainForm.getInt(lCityCol) 
    cityForm.updateInt(cityForm.findColumn("CityID"), currentCityID)
    listboxCity.refresh()
End Sub

Sub CityChanged (oEvent as Object)
    listboxCity = oEvent.Source.Model
    cityForm = listboxCity.getParent()
    mainForm = cityForm.getParent().getByName("MainForm")
    lCityCol = mainForm.findColumn("CityID")
    selectedItemID = listboxCity.SelectedValue
    If IsEmpty(selectedItemID) Then
        selectedItemID = 0
    End If
    mainForm.updateInt(lCityCol, selectedItemID)
End Sub

现在我们需要设置这样的表单。在这个例子中,我使用了两个顶级表单而不是子表单。省略号和城市ID文本框不是必需的,但如果出现问题可能会有所帮助。

form controls and hierarchy

要开始创建此表单,请使用表单向导创建新表单并添加Users表中的所有字段。

现在,在表单导航器中,创建一个名为" CityForm"的表单。内容类型是SQL命令,内容是:

SELECT "RecordID", "ProvinceID", "CityID" FROM "FilterCriteria"
WHERE "RecordID" = 'the only'

接下来,创建" listboxProvince" MainForm下的列表框。数据字段是" ProvinceID",List内容是以下Sql。

SELECT "Name", "ProvinceID" FROM "Provinces" ORDER BY "Name" ASC

最后,创建" listboxCity" CityForm下的列表框。数据字段是" CityID",List内容是以下Sql。

SELECT "Name", "CityID" FROM "Cities" WHERE "ProvinceID" = (
    SELECT "ProvinceID" FROM "FilterCriteria"
    WHERE "RecordID" = 'the only')

宏在每个控件的“事件”选项卡下链接。

  • 分配"记录更改后#34; ReadFvince()的MainForm。
  • 分配"已更改" listboxProvince到ReadProvince()。
  • 分配"已更改" listboxCity控件到CityChanged()。

结果允许我们选择省来过滤城市列表。选定的省和城市将保存在“用户”表中。

the result

还有另一种方法可能更好,我没有时间去探索。而不是" FilterCriteria"表,将过滤器应用于城市列表。 ReadProvince()中的相关代码看起来像这样。

cityForm.Filter = "ProvinceID=" & selectedItemID
cityForm.ApplyFilter = True
cityForm.reload()
cityForm.absolute(0)

无论采用何种方法,完整的解决方案都需要复杂的宏编程。为了使其更容易,您可以决定使用功能不那么强大的简单解决方案。有关详细信息,请参阅https://forum.openoffice.org/en/forum/viewtopic.php?t=46470上的教程。

编辑2

需要较少查询的解决方案位于https://ask.libreoffice.org/en/question/143186/how-to-use-user-selected-value-from-combobox1-in-combobox2-select-statement/?answer=143231#post-id-143231。第二个列表框基于值列表而不是SQL查询。