在Delphi中,如何对TDBF/TDataSet进行多字段排序?

4
我有一个使用tdbf的Delphi应用程序,tdbf基于tdataset,不需要BDE引擎。我需要对表进行排序,我通过添加索引定义并指定索引字段名称来对单个字段进行排序。
我现在想要对两个字段进行排序,即将男性分组排在一起,女性分组排在一起,并将每个组按工资排序,以便我们能够看到从最低收入者到最高收入者的女性,然后以同样的方式查看男性。
我已经阅读了所有说明文件,指出您只需将sortfield of the indexdef指定为“gender + salary”。但是当我尝试使用该索引时,我被告知“+”不是有效的字段名。我尝试了每个定界符,包括“。”、“,”、“&”和“;”。每个定界符都被识别为不存在的字段。如何正确地根据多个字段对表进行排序?
谢谢 Clinton Brits

3
Table.IndexFieldName:= 'Field1;Field2'; 这个语句不起作用吗? - bummi
2个回答

5

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 10000, F 200000, M 12000,其中 SALARY 被转换为默认宽度为10个字符(左侧填充空格)且没有小数位。这应该适用于您的情况。


1

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

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

您可以尝试使用他们的SubStr函数,在参数中包含整个字符串,并查看是否至少能够得到结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接