在 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 上填充并在客户端上处理,那么您的方案无论如何都会中断。