Note | 该命令在头文件中定义,将由 X# 预处理器预处理为函数调用。如果禁用标准头文件 (-nostddefs),该命令将不可用。如果告诉编译器使用不同的标准头文件(-stddef ),则此命令也可能不可用。 |
创建索引文件并添加 order。
INDEX ON <uKeyValue> [TAG <xcOrder>] [TO <xcIndexFile>]
[<Scope>] [WHILE <lCondition>] [FOR <lCondition>]
[EVAL <cbEval> [EVERY <nInterval>]
[UNIQUE] [ASCENDING | DESCENDING]
[USECURRENT] [ADDITIVE] [CUSTOM] [NOOPTIMIZE]
注意:虽然 TAG 和 TO 子句都是可选的,但必须至少指定其中一个。
<uKeyValue> | 顺序键表达式。 键表达式的数据类型和所有其他限制,包括键和键表达式的长度,都由 RDD 决定。 |
TAG <xcOrder> | 要创建的 order 名称。对于单 order 索引文件,不带扩展名或路径的文件名是默认 order 名称。对于多 order 索引文件,需要 order 名称。 |
TO <xcIndexFile> | 目标索引文件的名称,包括可选的驱动器、目录和扩展名。有关文件搜索和创建规则,请参阅 SetDefault() 和 SetPath()。默认扩展名由 RDD 确定,并可使用 DBOrderInfo(DBOI_INDEXEXT) 获取。 |
在支持生成索引的 RDD 中,如果未指定 <xcIndexFile>,则假定为生成索引文件。 |
如果 <xcIndexFile> 不存在,则会创建它。 |
如果 <xcIndexFile> 存在,则 INDEX 命令必须首先独占该文件。如果尝试失败,例如文件被另一个进程打开,则 NetErr() 设置为 TRUE。 |
如果尝试成功,并且 RDD 指定索引文件只能包含单个顺序,则在添加新顺序之前会擦除文件的当前内容。如果 RDD 指定索引文件可以包含多个顺序,则如果 <xcOrder> 不存在,则将其添加到 <xcIndexFile>;否则将其替换。 |
<Scope> | 要处理的当前数据库文件的部分。 默认范围是所有记录。 INDEX 会忽略 DbSetFilter() 和 SetDeleted() 设置,以及当前控制命令施加的任何过滤器。 |
范围不会存储在索引文件中,也不会用于重新索引或更新目的。 |
WHILE <lCondition> | 范围内的每条记录都必须满足的条件,从当前记录开始。 一旦 while 条件失败,进程就会终止。 如果没有指定 <Scope>,while 条件会将默认范围改为文件中的其他记录。 |
while 条件不会存储在索引文件中,也不会用于重新索引或更新目的。 |
FOR <lCondition> | 范围内的每条记录都必须满足的处理条件。 如果某条记录不符合指定条件,该记录将被忽略,然后处理下一条记录。 使用 for 条件时,重复的键值不会添加到索引文件中。 |
与 while 条件和范围不同,for 条件作为索引文件的一部分存储,并在使用 DbReindex() 或 REINDEX 更新或重建顺序时使用。 for 条件的限制由 RDD 决定。 |
注意:如果未指定 <Scope>、while 条件或 for 条件,索引将使用 DBSetOrderCondition() 指定的条件(如果有)。 |
EVAL <cbEval> | 以 EVERY <nInterval> 指定的时间间隔评估的代码块。 默认时间间隔为 1,这在制作状态栏或进度条以监控排序进度时非常有用。 <cbEval> 的返回值必须是逻辑值。 如果 <cbEval> 返回 FALSE,索引将停止。 |
EVERY <nInterval> | 数值表达式,用于确定 <cbEval> 的评估次数。 该选项通过间隔评估条件来提高性能,而不是每处理一条记录就评估一次。 如果不指定 EVAL 子句,EVERY 关键字将被忽略。 |
UNIQUE | 创建以唯一性为属性的 order,这意味着只有那些具有唯一键值的记录才会包含在 order 中。 如果未指定 UNIQUE,则使用 SetUnique() 来确定 order 的唯一性属性(有关如何维护唯一 order 的更多信息,请参阅 SetUnique())。 |
请注意,已删除记录的键也会包含在索引中,并可能隐藏未删除记录的键。 |
ASCENDING | 指定按递增顺序对键排序。 如果既未指定 ASCENDING 也未指定 DESCENDING,则假定为 ASCENDING。 |
DESCENDING | 指定按递减顺序对键排序。 使用该关键字与在 <uKeyValue> 中指定 Descend() 函数相同,但在更新顺序时不会影响性能。 如果创建的是 DESCENDING 索引,则在 SEEK 时无需使用 Descend() 函数。 |
order 是升序还是降序是存储在索引文件中的属性,用于重新索引和更新。 |
USECURRENT | 指定只有控制顺序中的记录--且在 OrdSetScope() 指定的当前范围内--才会包含在此 order 中。 当您已经创建了条件,并希望对符合条件的记录重新排序,和/或进一步限制符合条件的记录时,此功能非常有用。 如果未指定,数据库文件中的所有记录都将包含在 order 中。 |
ADDITIVE | 指定任何打开的 order 应保持其打开的状态。 如果未指定,则在创建新 order 前关闭所有打开的 order 。 但请注意,索引文件永远不会关闭。 |
CUSTOM | 对于支持自定义 order 的 RDD,CUSTOM 可指定创建自定义 order 。 自定义生成的 order 最初是空的,因此您可以完全控制 order 的维护。 系统不会自动从自定义生成的 order 中添加和删除键。 相反,您可以使用 OrdKeyAdd() 和 OrdKeyDel() 明确添加和删除键。 这种功能非常适合生成特定记录的选取列表和其他自定义应用程序。 |
NOOPTIMIZE | 指定对 FOR 条件进行优化。 如果未指定 NOOPTIMIZE,则如果 RDD 支持优化,FOR 条件将被优化。 |
创建(或替换)后,新 order 将添加到工作区的 order 列表中。 已与工作区关联的其他 order(包括控制 order)不受影响。
如果工作区不存在 order 列表,则 RDD 类型决定如何设置控制 order 。 对于仅支持单序索引文件(如 DBFNTX)的 RDD,控制顺序将设置为指定索引文件中的顺序。 对于支持多顺序索引文件(如 DBFMDX)的 RDD,控制顺序通常设置为索引文件中的第一个顺序。
RDD 支持: 并非所有 RDD 都支持 INDEX 命令的所有参数。
下面的示例根据 Acct 字段创建了一个单序索引:
USE customer NEW
INDEX ON Customer->Acct TO CuAcct
此示例根据 for 条件创建了一个条件 order。 该索引只包含 TransDate 大于或等于 1999 年 1 月 1 日的记录:
USE invoice NEW
INDEX ON Invoice->TransDate TO InDate ;
FOR Invoice->TransDate >= CTOD("01/01/2020")
下一个示例将在多 order 索引文件中创建 order:
USE customer NEW VIA "DBFMDX"
INDEX ON Customer->Acct TAG CuAcct TO customer
此示例创建了一个 order,在创建过程中调用了例程 MyMeter():
DEFINE Mtr_Increment := 10
FUNCTION Start()
USE customer NEW
INDEX ON Customer->Acct TO CuAcct EVAL ;
{|| MyMeter() } EVERY Mtr_Increment
FUNCTION MyMeter()
STATIC nRecsDone := 0
nRecsDone += Mtr_Increment
? (nRecsDone/LastRec()) * 100
RETURN TRUE
XSharp.RT.DLL
CLOSE, DToS(), DBCreateIndex(), DbCreateOrder() DbOrderInfo(), DbSeek(), DbSetIndex(), DbSetOrder(), DbSetOrderCondition(), DbReindex(), OrdCondSet(), OrdKeyAdd() OrdKeyDel(), OrdScope(), REINDEX, SEEK, SET INDEX, SET ORDER,SetDefault(), SetPath() SORT, Soundex() USE