我想改变我们的搜索,因为它现在有点老套。 目前它的工作原理如下:
- 用户在文本框中输入文本(例如 Volvo)并开始搜索。
- 使用 SQL 搜索所有包含沃尔沃的帖子。
- 结果是一个包含 2 列的列表:BoldID 和 DisplayValue。
- BoldID 只是识别数据库中对象的唯一编号。
- DisplayValue 是用户在结果列表中看到的内容。
- 结果集中的每一行都用用户列表中的行号进行标识。第一个为 1,第二个为 2,依此类推。
- 还有一个限制,即通过在代码中循环查询,仅按意图显示最多 99 个命中。查询返回许多命中是不好的,因为在用户命中列表中包含更多命中没有任何意义。在这种情况下,搜索应该更加具体。
结果列表显示在名为右 Pane 的单独全局窗口中。棘手的部分是,如果从模式对话框中搜索,则右 Pane 必须从主窗口中脱离,以便能够使用鼠标选择一个值。我们怀疑这可能是应用程序有时通过主窗口后面的模式对话框锁定自身的原因。
更改后,它应该像这样工作:
用户在组合框中输入文本,然后像以前一样开始使用 SQL 进行搜索。但结果集显示在组合框中。所以我只想在可能的情况下更改显示,因为有很多旧的 SQL 查询正在使用中并且现在工作正常。
我们使用 Delphi 2007、Interbase 2009 和 DevExpress 的组件。昨天我尝试将自定义数据源连接到组合框,但我意识到这尚未实现。请参阅How to use a TcxCustomDataSource in a TcxExtLookupComboBox 。我想使用自定义数据源来实现行号和最大命中数。上面列表中的 Se 6 和 7。
所以现在我看到两个选项:
- 使用数据库感知组合框
- 使用文本框并附加网格以显示结果集。
组合框更简单,因为它是一个完整的组件,但我不知道如何实现上面列表中的功能 6 和 7。 文本框+网格提供了更多自由,但需要更多工作。
我更喜欢第一个选项。目前存在的问题是:
- 我认为 Interbase SQL 无法限制结果集中的命中数。必须用代码来完成。这是如何使用数据库感知组合框来完成的?
- 如何在结果集中显示行号?
更新 1: 感谢 Marjan,要求 7 已解决,谢谢。 至于6我觉得比较难。理想情况下,我希望它在 SQL 中,这样我就可以提取自己的列,如 Adding row no 。但 Interbase 不支持这一点。
最佳答案
要求6:
假设数据库的id值为整数,则可以使用控件的标签或组合框/列表框中的字符串的对象来存储id值。
[伪代码]
while not eof do
ComboBox.Items.AddObject(<DisplayText From Db>, TObject(<IntegerID from Db>));
像这样使用它
id := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);
要求7:
使用数据库感知组合框/列表框循环查询,直到 eof 或 99 行结束。所以你需要依赖 SQL。即使您不想更改任何当前的 SQL 语句,也可以使用 SQL 的“TOP”功能来限制行数。例如
SELECT TOP 99 FROM (<your original SQL>)
在 Interbase SQL 中,您可以使用短语:
ROWS 1 TO 99
就在 order 子句之后(参见 http://blogs.teamb.com/craigstuntz/dtpostname/ibsqlintro/ 中的示例 - 几乎在页面底部)
关于sql - 在组合框中列出搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3403001/