2

我想改变我们的搜索,因为它现在有点老套了。目前它的工作原理是这样的:

  1. 用户在文本框中输入文本,例如沃尔沃并开始搜索。
  2. 这个用 SQL 搜索所有包含沃尔沃的帖子。
  3. 结果是一个包含 2 列的列表,BoldID 和 DisplayValue。
  4. BoldID 只是用于识别数据库中对象的唯一编号。
  5. DisplayValue 是用户在结果列表中看到的内容。
  6. 结果集中的每一行都用用户列表中的行号标识。第一个是 1,第二个是 2,以此类推。
  7. 通过在代码中循环查询,也有一个限制,只能按意图显示最多 99 个命中。有一个返回许多命中的查询是不好的,因为在用户命中列表中有更多没有意义。在这种情况下,搜索应该更具体。

结果列表显示在名为 rightpane 的单独全局窗口中。骇人听闻的部分是,如果从模式对话框中搜索,则必须从主窗口中取消右窗格才能使用鼠标选择一个值。我们怀疑这可能是应用程序有时会在主窗口后面的模式对话框中锁定自身的原因。

更改后它应该像这样工作:

用户在 Combobox 中输入文本,然后像以前一样按需使用 SQL 进行搜索。但结果集显示在组合框中。所以我只想尽可能地更改显示,因为有很多旧的 SQL 查询正在使用并且现在可以正常工作。

我们使用 Delphi 2007、Interbase 2009 和 DevExpress 的组件。昨天我尝试将自定义数据源连接到组合框,但我意识到这还没有实现。请参阅如何在 TcxExtLookupComboBox 中使用 TcxCustomDataSource。我想使用自定义数据源来实现行号和最大命中数。上面列表中的 Se 6 和 7。

所以现在我看到了 2 个选项:

  • 使用 DB 感知组合框
  • 使用文本框并将网格附加到它以显示结果集。

组合框比较简单,因为它是一个完整的组件,但我不知道如何实现上面列表中的功能 6 和 7。文本框 + 网格提供更多自由,但需要更多工作。

我更喜欢第一个选项。目前的问题是:

  • 我认为 Interbase SQL 不能限制结果集中的命中数。必须用代码来完成。这是如何使用 DB 感知组合框完成的?
  • 如何在结果集中显示行号?

更新 1: 感谢 Marjan,要求 7 已解决,谢谢。至于6,我觉得更难。理想情况下,我希望在 SQL 中使用它,这样我就可以提取自己的列,例如添加行号。但是 Interbase 不支持这一点。

4

2 回答 2

3

要求 6:

假设db的id值是一个整数,你可以使用一个控件的tag或者combobox/listbox中字符串的Object来存储id值。

[伪代码]

while not eof do
  ComboBox.Items.AddObject(<DisplayText From Db>, TObject(<IntegerID from Db>));

并像这样使用它

id := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);

要求 7:

使用 db 感知组合框/列表框循环遍历查询 til 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/上的示例- 几乎是页面底部)

于 2010-08-04T06:56:51.903 回答
2

Interbase 有一个 ROWS 子句,显然用于您想要的。

于 2010-08-04T06:55:05.150 回答