Tdbf / tdataset在delphi中排序多个字段

时间:2013-01-15 20:18:04

标签: database delphi sorting field tdbf

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

我现在试着让它分为2个领域,即将男性聚集在一起,然后将女性聚集在一起,然后让每个小组按工资分类,这样我们就可以看到女性从最低收入者到最高收入者,然后以同样的方式跟随男性。

我已经读过每一条材料,说明你只需将indexdef的sortfield指定为'gender + salary'。当我尝试使用索引时,我被告知'+'不是有效的字段名。我试过'。'的每个分隔符。 ''。 '&安培;'和';'。每个分隔符都被选为不存在的字段。在多个字段上对表进行排序的正确方法是什么?

提前致谢 克林顿·布里茨

2 个答案:

答案 0 :(得分:4)

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个字符(左边用空格填充)并且没有小数位数。这应该适合你。

答案 1 :(得分:1)

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

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

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