在 OpenEdge TEMP-TABLE 中使用 RECID 作为主键
Use RECID as primary key in OpenEdge TEMP-TABLE
我想创建一个包含几个由 xml 文件填充的临时表的数据集。
DEF TEMP-TABLE ttOrder NO-UNDO
FIELD iOrderNo AS INT
FIELD iOrderDate AS DATE
INDEX ix RECID. // This also won't work, but this is needed to use the `OF` statement when retrieving records.
DEF TEMP-TABLE ttOrderLine NO-UNDO
FIELD iParent AS RECID
FIELD iArticleNo AS INT
FIELD dPrice AS DECIMAL.
DEF DATASET dsOrder FOR ttOrder, ttOrderLine
DATA-RELATION Order_OrderLine FOR ttOrder, ttOrderLine
RELATION-FIELDS ttOrder.RECID, ttOrderLine.iParent. // This is what won't work, but what I would like to do.
通常我会在 ttOrderLine
中创建一个 iOrderNo
字段并匹配数据集 RELATION-FIELDS
属性中的字段。由于数据是从 XML 文件加载的,因此这很困难。
最终目标是,而不是这个:
FIND FIRST ttOrder.
FOR EACH ttOrderLine WHERE ttOrderLine.iParent = RECID(ttOrder):
// Do something
END.
我想这样做:
FIND FIRST ttOrder.
FOR EACH ttOrderLine of ttOrder:
// Do something
END.
我现在使用最后一种方法时得到的错误是Index field of table1 must be fields in table2
。
有人可以告诉我如何完成这项工作吗?
要使 OF
语法起作用,您需要将父 ID 存储在子 table 的唯一索引中。
此语法不需要数据集,但如果您确实还需要使用 recid 的数据集,则应查看 PARENT-ID-RELATION
而不是 RELATIONS-FIELDS
。
先看看这个:
DEFINE TEMP-TABLE ttOrder NO-UNDO
FIELD iOrderNo AS INTEGER
FIELD iOrderDate AS DATE
FIELD iParent AS RECID.
DEFINE TEMP-TABLE ttOrderLine NO-UNDO
FIELD iParent AS RECID
FIELD iArticleNo AS INTEGER
FIELD dPrice AS DECIMAL
INDEX ix IS UNIQUE iParent.
DEFINE DATASET dsOrder FOR ttOrder, ttOrderLine
PARENT-ID-RELATION Order_OrderLine FOR ttOrder, ttOrderLine PARENT-ID-FIELD iParent.
FOR EACH ttOrder, EACH ttOrderLine OF ttOrder:
DISPLAY ttOrder.
DISPLAY ttOrderLine.
END.
Temp-Table 记录 RECID 将在 temp-table 按值(而不是按引用)传递并在客户端和 AppServer 之间传递时发生变化。
通常在其他 table 中使用 RECID 作为键是一种非常危险的情况。
因此,如果订单行中带有订单 RECID 的数据集 table 在 AppServer 上填充并在客户端上处理,那么您的方案无论如何都会中断。
我想创建一个包含几个由 xml 文件填充的临时表的数据集。
DEF TEMP-TABLE ttOrder NO-UNDO
FIELD iOrderNo AS INT
FIELD iOrderDate AS DATE
INDEX ix RECID. // This also won't work, but this is needed to use the `OF` statement when retrieving records.
DEF TEMP-TABLE ttOrderLine NO-UNDO
FIELD iParent AS RECID
FIELD iArticleNo AS INT
FIELD dPrice AS DECIMAL.
DEF DATASET dsOrder FOR ttOrder, ttOrderLine
DATA-RELATION Order_OrderLine FOR ttOrder, ttOrderLine
RELATION-FIELDS ttOrder.RECID, ttOrderLine.iParent. // This is what won't work, but what I would like to do.
通常我会在 ttOrderLine
中创建一个 iOrderNo
字段并匹配数据集 RELATION-FIELDS
属性中的字段。由于数据是从 XML 文件加载的,因此这很困难。
最终目标是,而不是这个:
FIND FIRST ttOrder.
FOR EACH ttOrderLine WHERE ttOrderLine.iParent = RECID(ttOrder):
// Do something
END.
我想这样做:
FIND FIRST ttOrder.
FOR EACH ttOrderLine of ttOrder:
// Do something
END.
我现在使用最后一种方法时得到的错误是Index field of table1 must be fields in table2
。
有人可以告诉我如何完成这项工作吗?
要使 OF
语法起作用,您需要将父 ID 存储在子 table 的唯一索引中。
此语法不需要数据集,但如果您确实还需要使用 recid 的数据集,则应查看 PARENT-ID-RELATION
而不是 RELATIONS-FIELDS
。
先看看这个:
DEFINE TEMP-TABLE ttOrder NO-UNDO
FIELD iOrderNo AS INTEGER
FIELD iOrderDate AS DATE
FIELD iParent AS RECID.
DEFINE TEMP-TABLE ttOrderLine NO-UNDO
FIELD iParent AS RECID
FIELD iArticleNo AS INTEGER
FIELD dPrice AS DECIMAL
INDEX ix IS UNIQUE iParent.
DEFINE DATASET dsOrder FOR ttOrder, ttOrderLine
PARENT-ID-RELATION Order_OrderLine FOR ttOrder, ttOrderLine PARENT-ID-FIELD iParent.
FOR EACH ttOrder, EACH ttOrderLine OF ttOrder:
DISPLAY ttOrder.
DISPLAY ttOrderLine.
END.
Temp-Table 记录 RECID 将在 temp-table 按值(而不是按引用)传递并在客户端和 AppServer 之间传递时发生变化。
通常在其他 table 中使用 RECID 作为键是一种非常危险的情况。
因此,如果订单行中带有订单 RECID 的数据集 table 在 AppServer 上填充并在客户端上处理,那么您的方案无论如何都会中断。