我有一张省份表和一张有ProvienceID的城市表。在表单中,我想创建一个按所选值列表筛选的城市列表。 我怎么能这样做?
我可以创建两个列表,但是城市列表显示了所有省份的所有城市,但我想只显示我在省份列表中选择的省份的城市。
我有另一张桌子"用户"使用" CityID"和#34;省份ID"我的表单编辑了它,我需要在其中保存省和城市列表的选定值,而不仅仅是在表单中显示。
答案 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"创建一个表控件。
使用表单导航器(或表单向导),为查询"省市"创建子表单。
右键单击子窗体并选择属性。在数据标签下:
也为子窗体创建表控件。现在,子窗体控件中显示的城市取决于在主窗体控件中选择的省份。
修改强>:
以下是使用过滤器表存储列表框当前值的示例。再创建两个名为" 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文本框不是必需的,但如果出现问题可能会有所帮助。
要开始创建此表单,请使用表单向导创建新表单并添加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')
宏在每个控件的“事件”选项卡下链接。
结果允许我们选择省来过滤城市列表。选定的省和城市将保存在“用户”表中。
还有另一种方法可能更好,我没有时间去探索。而不是" 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查询。