如何在LibreOffice Base列表/组合框源条件中引用其他字段
刚从Access转用LibreOffice Base?太懂这种切换的别扭了!我来帮你搞定这两个需求——用lstNameA的选中值过滤lstNameB,还有在列表/组合框的源条件里引用其他字段。
一、用lstNameA的选中值过滤lstNameB
Base没办法像Access那样直接在列表框的SQL源里写[Forms]![FormName]![lstNameA],得用参数查询+事件宏的组合来实现:
给lstNameB设置带参数的SQL源
假设你的数据来自Contacts表,lstNameA选的是DepartmentID,lstNameB要显示同部门的联系人,那lstNameB的SQL源可以这么写:SELECT ContactID, FullName FROM Contacts WHERE DepartmentID = ?这里的
?是占位符,代表我们后面要传入的lstNameA选中值。给lstNameA添加选中事件宏
我们需要在lstNameA选中项改变时,把值传给lstNameB的参数并刷新它:- 右键
lstNameA→ 选择「控件」→ 切换到「事件」标签 - 找到「当选中项改变」,点击右侧的三个点 → 选择「新建宏」,粘贴下面的LibreOffice Basic代码:
Sub FilterNameB(oEvent As Object) ' 获取表单和控件对象 Dim oForm As Object Dim oListA As Object Dim oListB As Object Dim selectedVal As Variant oForm = oEvent.Source.Model.Parent oListA = oForm.getByName("lstNameA") oListB = oForm.getByName("lstNameB") ' 获取lstNameA的选中值(如果是绑定了字段,用BoundField.Value更准确) If oListA.SelectedItems.Count > 0 Then selectedVal = oListA.SelectedItems(0) ' 传递参数到lstNameB的查询 oListB.getParameter(0).setValue(selectedVal) Else ' 如果没选中任何项,清空过滤条件 oListB.getParameter(0).setValue(Null) End If ' 刷新lstNameB的内容 oListB.reload() End Sub- 保存宏,回到事件设置,选择刚创建的宏,确定即可。
- 右键
二、在列表/组合框源条件中引用其他字段
这里分两种场景:
1. 引用表单绑定的字段
如果你的表单绑定了某张表(比如Orders表),想引用当前记录的字段(比如CustomerID)来过滤组合框,直接在SQL里用:字段名就行,Base会自动识别表单当前记录的字段值。
比如要显示当前客户的所有订单,组合框的SQL源可以写:
SELECT OrderID, OrderDate FROM Orders WHERE CustomerID = :CustomerID
这里的:CustomerID就是表单绑定的Orders表中的字段名。
2. 引用表单上的其他控件(非绑定字段)
这种情况和第一个需求逻辑一致:
- 先给列表/组合框设置带参数的SQL(用
?或命名参数) - 给触发控件(比如文本框、单选框)添加事件宏,把控件值传递给列表/组合框的参数,然后刷新控件。
注意:如果是数值型字段,记得把获取到的字符串转成数值,比如用CLng(selectedVal)避免类型不匹配
试试这些方法,有细节问题随时提!
内容的提问来源于stack exchange,提问作者aSystemOverload
相关产品推荐
相关产品推荐

