我有一个数据集,我正在使用
BIND
。在该过程中,我需要在第一个数据集的临时表的子集上定义第二个数据集;然而,Progress不允许我在两个数据集中放置相同的缓冲区,因此我必须在旧temp表的新命名缓冲区上定义第二个数据集。然而,当我访问新命名缓冲区的句柄时,Progress告诉我缓冲区不是数据集的成员。(The
DATASET
缓冲区句柄的属性
?
.)
以下是我的程序:
过程1.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.
过程2.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。