Note | 该命令在头文件中定义,将由 X# 预处理器预处理为函数调用。如果禁用标准头文件 (-nostddefs),该命令将不可用。如果告诉编译器使用不同的标准头文件(-stddef ),则此命令也可能不可用。 |
使用关键表达式、记录编号或数字表达式将父工作区链接到一个或多个子工作区。
SET RELATION TO [<uRecID> INTO <xcAlias>] [, [TO] <uRecId> INTO <xcAlias>...] [ADDITIVE] [SCOPED]
TO <uRecID> | 如果子工作区有控制命令,则执行 <xcAlias>->DBSeek(<uRecID>) 操作;否则,执行 <xcAlias>->DBGoTo(<uRecID>) 操作。 每次记录指针在父工作区移动时,该操作都会将子工作区定位到匹配的索引键值或记录编号。 |
INTO <xcAlias> | 子工作区的别名标识符。 如果指定的别名没有关联的开放数据库文件,则会出现运行时错误。 |
ADDITIVE | 指定将关系添加到工作区的现有关系中。 如果未指定,则在设置新关系之前会清除现有关系。 |
SCOPED | 使 SET RELATION 命令映射到 OrdSetRelation() 命令。 如果未指定,SET RELATION 会映射到 DBSetRelation()。 |
SET RELATION TO 不带参数,清除当前工作区中定义的所有关系。
每个父工作区最多可连接八个子工作区。
关联工作区可使子工作区与父工作区同步。 每当父工作区移动到一个新记录时,子工作区就会自动重新定位。
使用表达式和别名列表指定 SET RELATION TO 时,其功能等同于使用多个 DBSetRelation()(或 OrdSetRelation(),如果指定了 SCOPED)函数调用。 如果没有指定 ADDITIVE 子句,命令将首先调用 DBClearRelation()。
软查找: 作为关系定位的一部分进行的寻道操作绝不是软寻道(它们不遵守 SetSoftSeek() 标记)。 如果关系移动不成功,子工作区将定位到 LastRec() + 1,其 Found() 状态返回 FALSE,其 EoF() 状态返回 TRUE。
循环关系: 不要直接或间接将父工作区与自身相关联。
记录编号关系: 要根据匹配的记录编号关联两个工作区,请在 SET RELATION TO 表达式中使用 RecNo(),并确保子工作区没有活动索引。
此示例在多父子配置中关联了三个工作区,其中 CUSTOMER 同时与 INVOICES 和 ZIP 相关:
USE invoices INDEX invoices NEW
USE zip INDEX zipcode NEW
USE customer NEW
SET RELATION TO CustNum INTO Invoices, Zipcode INTO Zip
LIST Customer, Zip->City, Invoices->Number, Invoices->Amount
之后,您可以使用 ADDITIVE 子句添加一个新的子关系,就像这样:
USE backorder INDEX backorder NEW
SELECT customer
SET RELATION TO CustNum INTO Backorder ADDITIVE
XSharp.RT.DLL
DbGoTo(), DBRelation(), DBRSelect(),, DbSeek(), DbSetIndex(), DbSetOrder() , DBSetRelation(), Found(), OrdSetRelation(), RecNo(), SET INDEX, SET ORDER, SetSoftSeek()