缓冲区在使用 BIND 输入后表示它不是数据集的一部分

Buffer says that it is not part of dataset after being input with BIND

我有一个数据集,我正在使用 BIND 将其传递给另一个过程。在该过程中,我需要在第一个数据集临时表的子集上定义第二个数据集;但是,Progress 不允许我在两个数据集中放置相同的缓冲区,因此我必须在旧临时表的新命名缓冲区上定义第二个数据集。但是,当我访问新命名缓冲区的句柄时,Progress 告诉我该缓冲区不是数据集的成员。 (缓冲区句柄的 DATASET 属性给出 ?。)

这是我的程序:

Proc1.p:

DEFINE TEMP-TABLE ttShifts NO-UNDO 
    FIELD shiftid AS INT
    FIELD emp AS CHAR.

DEFINE TEMP-TABLE ttTasks NO-UNDO 
    FIELD taskid AS INT
    FIELD shiftid AS INT.

DEFINE DATASET dsShifts
    FOR ttShifts, ttTasks
    DATA-RELATION relTask FOR ttShifts, ttTasks
        RELATION-FIELDS(ttShifts.shiftid, ttTasks.shiftid) NESTED.

DEFINE VARIABLE lcJson AS LONGCHAR NO-UNDO.
DEFINE VARIABLE hProc2 AS HANDLE NO-UNDO.

ASSIGN lcJson = '~{"dsShifts":~{"ttShifts":[~{"shiftid":101,"emp":"Stewart","ttTasks":[~{"taskid":333,"shiftid":101}]}]}}'.

DATASET dsShifts:READ-JSON("LONGCHAR", lcJson).

RUN proc2.p PERSISTENT SET hProc2.
RUN bindDsShifts IN hProc2 (INPUT DATASET dsShifts BIND).
RUN runProc IN hProc2.
DELETE PROCEDURE hProc2.

Proc2.p:

DEFINE TEMP-TABLE ttShifts NO-UNDO REFERENCE-ONLY
    FIELD shiftid AS INT
    FIELD emp AS CHAR.

DEFINE TEMP-TABLE ttTasks NO-UNDO REFERENCE-ONLY 
    FIELD taskid AS INT
    FIELD shiftid AS INT.

DEFINE DATASET dsShiftsExt
    REFERENCE-ONLY
    FOR ttShifts, ttTasks
    DATA-RELATION relTask FOR ttShifts, ttTasks
        RELATION-FIELDS(ttShifts.shiftid, ttTasks.shiftid) NESTED.

DEFINE BUFFER bfShifts FOR ttShifts.
DEFINE DATASET dsShifts FOR bfShifts.

PROCEDURE bindDsShifts:
    DEFINE INPUT PARAMETER DATASET FOR dsShiftsExt BIND.
END.

PROCEDURE runProc:
    DEFINE VARIABLE hDsShifts AS HANDLE NO-UNDO.
    DEFINE VARIABLE hBuf AS HANDLE NO-UNDO.
    ASSIGN 
        hDsShifts = DATASET dsShifts:HANDLE
        hBuf = hDsShifts:GET-BUFFER-HANDLE (1).
    MESSAGE VALID-HANDLE(hBuf:DATASET) VIEW-AS ALERT-BOX.
    /* here I expect YES but I see NO */
END.

有人可以向我解释为什么最后 hBuf:DATASET 不是有效句柄吗?

(在我的实际代码中,我试图做 ATTACH-DATA-SOURCE 但失败了,因为缓冲区应该不是数据集的一部分。)

我是 运行 OpenEdge 11.4.

我已经在 OpenEdge 11.3 和 OpenEdge 11.7(64 位)上试过你的代码。

OpenEdge 11.3 returns 假和 OpenEdge 11.7 returns 真。所以这可能看起来像是同时修复的错误。如果您需要详细信息(如果无法升级,则可能需要修补程序,您应该联系 Progress Software 技术支持)。