缓冲区在使用 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 技术支持)。
我有一个数据集,我正在使用 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 技术支持)。