Note | 该命令在头文件中定义,将由 X# 预处理器预处理为函数调用。如果禁用标准头文件 (-nostddefs),该命令将不可用。如果告诉编译器使用不同的标准头文件(-stddef ),则此命令也可能不可用。 |
按键值将当前工作区的记录汇总到数据库文件中。
TOTAL TO <xcTargetFile> ON <uKeyValue> FIELDS <idFieldList> [<Scope>] [WHILE <lCondition>] [FOR <lCondition>]
TO <xcTargetFile> | 要写入累计记录的目标数据库文件名,包括可选的驱动器、目录和扩展名。 有关文件搜索和创建规则,请参阅 SetDefault() 和 SetPath()。 数据库文件的默认扩展名由 RDD 决定。 |
如果 <xcTargetFile> 不存在,将创建该文件。 如果存在,该命令将尝试以独占模式打开文件,如果成功,文件将被覆盖,不会发出警告或出错。 如果由于其他进程正在使用该文件等原因而拒绝访问,NetErr() 将被设置为 TRUE。 |
ON <uKeyValue> | 用于汇总记录的键值。 为使汇总操作准确无误,应根据此表达式对当前数据库文件进行索引或排序。 |
FIELDS <idFieldList> | 要累加的数字字段列表。 如果未指定 FIELDS 子句,则不会对数字字段进行累加。 相反,目标文件中的每个数字字段都包含源文件中与键值匹配的第一条记录的值。 |
<Scope> | 当前数据库文件中要处理的部分。 默认为所有可见记录。范围可以是以下一个或多个子句: [NEXT <NEXT>] 可选择指定从源文件第一条记录开始处理的记录数。这将从源文件的第一条记录开始。 [RECORD <rec>] 可选的记录 ID 如果指定,处理将从源文件中的该数据记录开始。 [<rest:REST>] 选项 REST 可指定是否从当前记录到最后一条记录按顺序搜索。如果指定了条件,则选项 ALL 为默认值。 [ALL] 选项 ALL 指定导入源文件中的所有记录。这是默认设置。 |
WHILE <lCondition> | 范围内每条可见记录都必须满足的条件,从当前记录开始。 一旦 while 条件失败,进程就会终止。 如果没有指定 <Scope>,while 条件会将默认范围改为文件中的其他可见记录。 |
FOR <lCondition> | 处理范围内每条可见记录必须满足的条件。 如果某条记录不符合指定条件,则会被忽略,并处理下一条可见记录。 如果没有指定 <Scope> 或 WHILE 子句,则 for 条件会将默认范围改为所有可见记录。 |
TOTAL 的工作原理是,首先将当前数据库文件的结构复制到指定的目标文件中,备注字段除外。 然后,在指定的记录范围内顺序扫描当前数据库文件。
每遇到一条具有唯一键值的记录,就将该记录复制到目标数据库文件。 FIELDS 列表中指定的数字字段的值从具有相同键值的连续记录中添加到目标文件中具有相同名称的字段中。 汇总工作一直进行到遇到具有新键值的记录时为止,此时将重复上述过程。
重要! 要成功合计数值字段,当前数据库文件结构中的数值字段必须足够大,以容纳该数值字段的最大合计数。 如果数值字段溢出,运行时将出现错误。
TOTAL 在功能上等同于 DBTotal()。
已删除记录: 如果 SetDeleted() 为 FALSE,则会处理源文件中已删除的记录。 目标文件中的记录将继承源文件中第一个匹配记录的删除状态。
可见性: 但如果 SetDeleted() 为 TRUE,则删除的记录不可见,因此不会被处理。 同样,过滤记录(使用 DbSetFilter() 或条件控制命令)也不会被处理。
在本例中,使用宏表达式根据控制命令的关键表达式对数据库文件进行合计。 遇到宏表达式时,将对表达式进行求值,并将求值得到的字符串替换为 TOTAL <uKeyValue> 参数:
USE sales INDEX branch NEW
TOTAL ON &(IndexKey(0)) FIELDS Amount TO Summary
XSharp.RT.DLL
AVERAGE, DBTotal(), INDEX, SetDefault(), SetPath(), SORT, SUM, UPDATE