Note | 该命令在头文件中定义,将由 X# 预处理器预处理为函数调用。如果禁用标准头文件 (-nostddefs),该命令将不可用。如果告诉编译器使用不同的标准头文件(-stddef ),则此命令也可能不可用。 |
搜索当前工作区中符合指定条件和范围的第一条记录。
LOCATE [<Scope>] FOR <lCondition> [WHILE <lCondition>]
<Scope> | 当前数据库文件中要处理的部分。 默认为所有可见记录。范围可以是以下一个或多个子句: [NEXT <NEXT>] 可选择指定从源文件第一条记录开始处理的记录数。这将从源文件的第一条记录开始。 [RECORD <rec>] 可选的记录 ID 如果指定,处理将从源文件中的该数据记录开始。 [<rest:REST>] 选项 REST 可指定是否从当前记录到最后一条记录按顺序搜索。如果指定了条件,则选项 ALL 为默认值。 [ALL] 选项 ALL 指定导入源文件中的所有记录。这是默认设置。 |
WHILE <lCondition> | 范围内每条可见记录都必须满足的条件,从当前记录开始。 一旦 while 条件失败,进程就会终止。 如果没有指定 <Scope>,while 条件会将默认范围改为文件中的其他可见记录。 |
FOR <lCondition> | 处理范围内每条可见记录必须满足的条件。 如果某条记录不符合指定条件,则会被忽略,并处理下一条可见记录。 如果没有指定 <Scope> 或 WHILE 子句,则 for 条件会将默认范围改为所有可见记录。 |
LOCATE 使用 for 条件评估范围内的每条可见记录。 一旦有记录符合条件,进程就会终止,并将记录指针留在匹配记录上,同时将 Found() 标志设置为 "true"。 如果对于作用域中的所有记录,for 条件都是 FALSE,那么 Found() 标志将设置为 FALSE,记录指针的位置取决于作用域。
每个工作区都有自己的定位条件,在执行另一个定位操作(如使用 LOCATE 或 DBLocate())、重置定位条件(如使用 VODBSetLocate())或终止应用程序之前,该条件一直处于激活状态。
CONTINUE:一旦找到记录并对其进行了处理,就可以使用 CONTINUE(或 DBContinue())从当前记录指针位置继续搜索。 不过,<Scope> 和 while 条件都只适用于初始定位操作,后续的继续操作并不知晓。 要继续进行带有范围或 while 条件的待定位操作,请使用 SKIP 然后 LOCATE REST WHILE <lCondition> 代替 CONTINUE,如下例所示。
这些示例展示了典型的 LOCATE 结构:
USE sales INDEX salesman
LOCATE FOR Branch = "200"
? Found(), EOF(), RECNO() // Result: TRUE FALSE 5
LOCATE FOR Branch = "5000"
? Found(), EOF(), RECNO() // Result: FALSE TRUE 85
下一个示例显示了一个带有 WHILE 条件的 LOCATE,该条件通过使用 LOCATE REST 得到延续:
SEEK "Bill"
LOCATE FOR Branch = "200" WHILE Salesman = "Bill"
DO WHILE Found()
? Branch, Salesman
SKIP
LOCATE REST FOR Branch = "200" WHILE ;
Salesman = "Bill"
ENDDO
XSharp.RT.DLL
CONTINUE, DbContinue(), DbLocate(), EoF(), Found(), RecNo(), SEEK, DbSetFilter()