LibreBase v7.5.4中如何自动填充采购子表单的Title字段?
LibreBase v7.5.4 采购管理系统自动填充Title字段解决方案
报错原因分析
你遇到的SQL Status: S0022, Error code: -28错误,本质是带空格的字段名未正确转义:SQL解析器会把AcqEnt.Accession No拆成AcqEnt.Accession和No两个独立字段,自然找不到目标列。
修正ListBox实现方式
如果坚持用ListBox联动,需要在SQL语句中对带空格的字段名用双引号包裹,示例SQL如下:
SELECT "BooksDB"."Accession No", "BooksDB"."Title" FROM "BooksDB" WHERE "BooksDB"."Accession No" = "AcqEnt"."Accession No"
同时调整ListBox的属性:
- 设置
Bound field为1(因为SELECT结果中Title是第2个字段,索引从0开始) - 将子表单中
Accession No字段的「失去焦点」事件绑定到ListBox的refresh动作,确保输入后自动触发匹配。
更高效的实现:表单事件+宏
直接通过宏监听Accession No的输入动作,自动查询并填充Title,步骤如下:
- 打开子表单
AcqEnt的编辑模式,选中Accession No文本框。 - 在右侧属性面板的「事件」标签中,找到「失去焦点」事件,点击「...」选择「宏」→「编辑」。
- 粘贴以下LibreOffice Basic代码:
Sub FillTitle(oEvent As Object) Dim oForm As Object, oAccessionNo As Object, oTitle As Object Dim sAccessionNo As String, sSQL As String Dim oStatement As Object, oResultSet As Object ' 获取表单及控件对象 oForm = oEvent.Source.Model.Parent oAccessionNo = oForm.getByName("Accession No") oTitle = oForm.getByName("Title") sAccessionNo = oAccessionNo.Text If sAccessionNo = "" Then oTitle.Text = "" Exit Sub End If ' 构造查询语句,注意转义带空格的字段 sSQL = "SELECT ""Title"" FROM ""BooksDB"" WHERE ""Accession No"" = '" & sAccessionNo & "'" ' 执行查询并填充Title oStatement = oForm.ActiveConnection.createStatement() oResultSet = oStatement.executeQuery(sSQL) If oResultSet.Next() Then oTitle.Text = oResultSet.getString(1) Else oTitle.Text = "" End If ' 释放资源 oResultSet.close() oStatement.close() End Sub
- 保存宏后返回表单,测试输入
Accession No并切换焦点,Title字段会自动匹配填充。
补充注意事项
- 确保
BooksDB表的Accession No字段是唯一约束,避免多条匹配导致填充异常。 - 若不需要修改Title字段,可直接创建关联查询将
BooksDB.Title作为计算字段添加到子表单,实现只读联动,无需宏。
内容的提问来源于stack exchange,提问作者Keshav
相关产品推荐
相关产品推荐

