【问题标题】:Use RECID as primary key in OpenEdge TEMP-TABLE在 OpenEdge TEMP-TABLE 中使用 RECID 作为主键
【发布时间】:2018-04-13 12:06:38
【问题描述】:

我想创建一个数据集,其中包含几个由 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

有人可以告诉我如何完成这项工作吗?

【问题讨论】:

    标签: dataset temp-tables openedge progress-4gl


    【解决方案1】:

    只要临时表按值(而不是按引用)传递并在客户端和 AppServer 之间传递,临时表记录 RECID 就会更改。

    通常在其他表中使用 RECID 作为键是一种非常危险的情况。

    因此,如果 Orderline 表中具有 Order RECID 的数据集在 AppServer 上填充并在客户端上进行处理,那么无论如何您的方案都会中断。

    【讨论】:

    • 确实是一个很好的观点。 @MikeFechner。如果我在加载订单行时无法访问 orderid,您将如何解决这个问题?
    • 恕我直言,您必须在 Order 中有一个在 OrderLine 中引用的键域。如果您没有(访问)PUK 字段或订单,请使用 GUID。 ABL GUID 函数将在需要时提供一个 GUID 值。
    • @MikeFechner 可以在临时表和数据集中使用它吗?
    • 是的。虽然我不完全理解你的问题。数据集是临时表的集合。数据集本身没有字段。您可以将 GUID 字段(字符类型)用作临时表中的字段,并且该字段可用于 ProDataset 中的数据关系。
    • @MikeFechner 我想要实现的是将 XML 内容加载到数据集中。问题是子节点不包含父节点的外键。因此我首先使用了 RECID,因为这样我就可以使用PARENT-ID-RELATION。但这引发了一些问题,正如您已经指出的那样。但是现在我没有办法向“子”临时表添加外键,以便可以检索它们。因此,“子”临时表应使用“父”临时表主键的值填充字段。
    【解决方案2】:

    要使 OFsyntax 起作用,您需要将父 ID 存储在子表的唯一索引中。

    此语法不需要数据集,但如果您确实还需要使用 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.
    

    【讨论】:

    • 我建议在投票时发表评论。这个解决方案确实解决了手头的问题(如果 recids 和 temp-tables 是一个好主意,可能取决于具体情况)。
    • jensd 指出的一个关键但可能是微妙的事情是 OF 不需要 RECID。它只要求字段名称存在于两个表中并且是唯一索引的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2012-12-20
    相关资源
    最近更新 更多