Parameters
ihClass | input | handle | |
iiInstanceId | input | integer | |
ihInstanceData | input | handle | |
icClassName | input | character | |
oiDraftInstanceId | output | integer | |
oiReturnStatus | output | integer | Return status of the method. |
Internal usage
BLF
program code (program1/progress.p)
TRX: do transaction on error undo, throw:
if ihClass <> ?
then run GetPublicData in ihClass (input "vlRawTransferSupported", output vcRawTransferSupported, output viFcReturnSuper).
if not (valid-handle(vhDraftQuery) and
viDraftUID = vhDraftQuery:unique-id)
then do:
create buffer vhDraftBuffer for table "fcDraftInstance":U in widget-pool "persistent".
create query vhDraftQuery in widget-pool "persistent".
vhDraftQuery:forward-only = yes.
vhDraftQuery:set-buffers(vhDraftBuffer).
vhDraftQuery:private-data = "Persistent". /* do not ever delete this query */
viDraftUID = vhDraftQuery:unique-id.
create buffer vhDraftDataBuffer for table "fcDraftInstanceData":U in widget-pool "persistent".
create query vhDraftDataQuery in widget-pool "persistent".
vhDraftDataQuery:forward-only = yes.
vhDraftDataQuery:set-buffers(vhDraftDataBuffer).
vhDraftDataQuery:private-data = "Persistent". /* do not ever delete this query */
end.
vhDraftQuery:query-prepare ("for each fcDraftInstance where fcDraftInstance.DraftInstance_ID = ":U + string(iiInstanceId)).
vhDraftQuery:query-open().
vhDraftQuery:get-first(exclusive-lock, no-wait).
if vhDraftQuery:query-off-end
or vhDraftBuffer:locked
then do:
vhDraftQuery:query-close().
assign oiReturnStatus = -3
vcErrorMessage = if vhDraftBuffer:locked
then (#T-61'Instance is locked.':255(349881641)T-61# + ' (Draft)')
else #T-43'Instance not found.':255(91)T-43# +
' (icClassName= ' + icClassName + ' iiInstanceId= ' + string (iiInstanceId) + ')'.
<M-7 run ErrorMessage
(input vcErrorMessage (icMessage),
input '':U (icArguments),
input '':U (icFieldName),
input '':U (icFieldValue),
input '':U (icRowid),
input ? (ihClass)) in Progress>
return.
end.
if icClassName <> "transaction":U
and vhDraftBuffer::BusinessClass <> icClassName
then do:
assign oiReturnStatus = -3.
<M-2 run ErrorMessage
(input #T-11'Invalid instance number. Found data for business class '$2', but expected business class '$1'.':255(4394)T-11# (icMessage),
input icClassName + chr(2) + vhDraftBuffer::BusinessClass (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
vhDraftBuffer:buffer-release().
vhDraftQuery:query-close().
return.
end.
if vhDraftBuffer::IsInUse = true
then do:
assign oiReturnStatus = -3
vcErrorMessage = #T-37'Instance opened twice.':255(92)T-37# +
' (icClassName= ' + icClassName + ' iiInstanceId= ' + string (iiInstanceId) + ')'.
<M-8 run ErrorMessage
(input vcErrorMessage (icMessage),
input '' (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
vhDraftBuffer:buffer-release().
vhDraftQuery:query-close().
return.
end.
assign vhDraftBuffer::IsInUse = true.
vhDraftBuffer:buffer-release().
end.
if vcRawTransferSupported = "false"
then do:
vhDraftDataQuery:query-prepare ("for each fcDraftInstanceData where fcDraftInstanceData.DraftInstance_ID = ":U + string(iiInstanceId)).
vhDraftDataQuery:query-open().
vhDraftDataQuery:get-first(no-lock).
do while not vhDraftDataQuery:query-off-end:
vaContext = vhDraftDataBuffer::DraftInstanceData.
viTotalLength = viTotalLength + length(vaContext,"RAW").
vhDraftDataQuery:get-next(no-lock).
end.
vhDraftDataQuery:query-close().
set-size(vmContext) = viTotalLength.
viContextPos = 1.
vhDraftDataQuery:query-prepare ("for each fcDraftInstanceData where fcDraftInstanceData.DraftInstance_ID = ":U + string(iiInstanceId) + " by fcDraftInstanceData.DraftInstanceSeq").
vhDraftDataQuery:query-open().
vhDraftDataQuery:get-first(no-lock).
do while not vhDraftDataQuery:query-off-end:
vaContext = vhDraftDataBuffer::DraftInstanceData.
viRawLength = length(vaContext,"RAW").
put-bytes (vmcontext,viContextPos) = get-bytes (vaContext,1,viRawLength).
viContextPos = viContextPos + viRawLength.
vhDraftDataQuery:get-next(no-lock).
end.
ihInstanceData:read-xml ("memptr",vmContext,"APPEND","",no).
end.
else do:
CREATE tRaw. /* Just need one dummy row to store RAW field in by its handle. */
vhContext = BUFFER tRaw:BUFFER-FIELD("taContext":U):HANDLE.
vhDraftDataQuery:query-prepare ("for each fcDraftInstanceData where fcDraftInstanceData.DraftInstance_ID = ":U + string(iiInstanceId)).
vhDraftDataQuery:query-open().
vhDraftDataQuery:get-first(no-lock).
do while not vhDraftDataQuery:query-off-end:
viContextPos = 1.
vaContext = vhDraftDataBuffer::DraftInstanceData.
viBuffer = GET-SHORT(vaContext, viContextPos).
DO WHILE viBuffer <> 0:
viBuffer = GET-SHORT(vaContext, viContextPos).
IF viBuffer <> 0 THEN /* 0 signals end of data */
DO:
IF viBuffer <> viPrevBuffer
THEN do:
assign vhBuffer = ihInstanceData:GET-BUFFER-HANDLE(viBuffer).
end.
viPrevBuffer = viBuffer.
viContextPos = viContextPos + 2. /* Move past the table number. */
viRawLength = GET-LONG(vaContext, viContextPos).
viContextPos = viContextPos + 4.
tRaw.taContext = GET-BYTES(vaContext, viContextPos, viRawLength).
viContextPos = viContextPos + viRawLength.
vhBuffer:BUFFER-CREATE().
vhBuffer:RAW-TRANSFER(FALSE, vhContext).
END. /* IF iBuffer <> 0 */
END. /* WHILE iBuffer <> 0 */
vhDraftDataQuery:get-next(no-lock).
end.
end.
vhDraftDataQuery:query-close().
oiDraftInstanceId = <M-11 GetNextValue (input 'InstanceNumber':U (icSequence)) in Progress>.
finally:
set-size(vmContext) = 0.
if available tRaw
then delete tRaw.
end finally.