【问题标题】:Tdbf/tdataset sorting multiple fields in delphiTdbf / tdataset在delphi中对多个字段进行排序
【发布时间】:2012-12-30 01:06:24
【问题描述】:

我有一个使用基于 tdataset 的 tdbf 的 delphi 应用程序,其优点是不需要 bde 引擎。我需要对表进行排序,我通过添加一个 indexdef 然后指定 indexfieldnames 来对单个字段进行排序。

我现在试图让它在 2 个字段上进行排序,即将男性分组,然后将女性分组,然后将每个组按薪水排序,这样我们就可以看到女性从最低收入到最高收入,然后以同样的方式排在男性之后。

我已经阅读了所有说明您只需将 indexdef 的排序字段指定为“性别+薪水”的材料。当我尝试使用索引时,我被告知“+”不是有效的字段名。我已经尝试了'.'的每个分隔符。 ','。 '&' 和 ';'。每个分隔符都被视为一个不存在的字段。在多个字段上对表格进行排序的正确方法是什么?

提前致谢 克林顿英国人

【问题讨论】:

  • Table.IndexFieldName:= 'Field1;Field2';不工作?

标签: database delphi sorting field tdbf


【解决方案1】:

xBASE(dBASE 及其衍生产品)要求索引中的字段全部转换为相同的数据类型,通常是字符串。为此,通常需要一些常用函数:

  • DTOS() - 将 xBASE 日期转换为 CCYYMMDD 格式的字符串
  • STR() - 将数字转换为字符串,带有可选的宽度说明符(默认为 10)和小数点右侧的位数。具体来说,语法指定为STR(<numeric> [, <width> [, <decimaldigits>] ])
  • SUBSTR() - 从另一个字符串中提取一部分,指定起始位置和字符数
  • IIF() - 立即 IF,用于转换逻辑(例如,IIF(Married = .T., 'Y', 'N')

索引表达式确实与+ 运算符结合使用。您收到的错误可能是因为您尚未转换为通用数据类型。

由于您已指定 Gender 列(可能定义为 CHAR 1)和 Salary 列(可能是某种大小的 NUMERIC),您可以使用类似

Dbf1.AddIndex('GENDER_SAL', 'GENDER + STR(SALARY, 10, 0)', []);

这会在 F 10000F 200000M 12000 等表达式上创建索引,其中 SALARY 转换为 10 个字符的默认宽度(左侧用空格填充)并且没有十进制数字。这应该适合你。

【讨论】:

    【解决方案2】:

    我没有使用过该组件,但看起来他们想使用类似于我们在 dBase III 中使用的索引表达式。在文档的 PDF 版本的第 7 页,他们在表达式主题下提供了一个示例:

    Dbf1. AddIndex('INDEX1 ', 'DTOS( DATEFIELD)+ SUBSTR ( LONGFIELD ,1 ,10)+ SUBSTR
    ( LONGFIELD2 ,1 ,20)', []);
    

    您可以在您的字段上尝试使用包含整个字符串的参数的 SubStr 函数,看看是否至少可以为您提供结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-23
      • 2012-01-06
      • 2011-09-14
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多