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

libreoffice base create a list filtered by another list's value

我有 table 个省份和 table 个具有 ProvienceID 的城市。在一种形式中,我想创建一个按省份列表的选定值过滤的城市列表。 我该怎么做?

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

我有另一个 table "Users" 与 "CityID" 和 "ProvinceID" 我的表单编辑它,我需要在其中保存省和城市列表的选定值,不仅仅表现在形式上。

创建两个名为 "Provinces" 和 "Cities" 的示例 table。

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

创建名为 "Province 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".

创建一个 table 控件

使用表单导航器(或表单向导),为查询 "Province of City".

创建一个子表单

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

  • Link 主字段 "Province"
  • Link 奴隶领域 "Province"

也为子窗体创建一个 table 控件。现在,子表单控件中显示的城市取决于主表单控件中 selected 的省份。

编辑:

下面是一个使用过滤器 table 来存储列表框当前值的例子。再创建两个 table,分别命名为 "Users" 和 "FilterCriteria".

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

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

我们还需要两个基本宏,它们可以存储在文档或我的宏中。转到 工具 -> 宏 -> 组织宏 -> 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

现在我们需要像这样设置表单。在这个例子中,我使用了两个顶级表单而不是一个子表单。 ProvinceID 和 CityID 文本框不是必需的,但在出现问题时可能会有所帮助。

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

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

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

接下来,在 MainForm 下创建 "listboxProvince" 列表框。 Data Field为"ProvinceID",List内容如下Sql.

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

最后,在 CityForm 下创建 "listboxCity" 列表框。 Data Field为"CityID",List内容如下Sql.

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

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

  • 将 MainForm 的 "After record change" 分配给 ReadProvince()。
  • 将 listboxProvince 的 "Changed" 分配给 ReadProvince()。
  • 将 listboxCity 控件的 "Changed" 分配给 CityChanged()。

结果允许我们select省过滤城市列表。 selected 的省市保存在 Users table.

还有另一种方法可能更好,但我没有时间去探索。代替 "FilterCriteria" table,对城市列表应用过滤器。 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 查询。