| icAction | input | character | SAVE SAVEDRAFT DRAFT VALIDATE |
| ilReturnDataset | input | logical | Indication whether the logic should return the official dataset of the object that has just been created/modified. |
| ilPartialUpdate | input | logical | Indication whether the input dataset is a full object or only a partial one. |
| icPartialUpdateExceptionList | input | character | Comma separated list with fields that need to be skipped in the test logic for partial update. Fields in the list are specified as t<table>.<field>. |
| opPrimaryKey | output | longchar | |
| opRowid | output | longchar | |
| oiDraftInstance | output | integer | |
| ocPrimaryKeyName | output | character | The name of the field(s) in the primary key of the object. Normally this is the name of the object ID of the main table. (like creditor_ID) |
| ozObjectRepresentation | output | dataset-handle | The dataset containing the official representation of the object dataset. It should always be passed by-reference, meaning, the dataset handle should be created before the call. |
| oiReturnStatus | output | integer | Return status of the method. |
BLF
if icAction = "" or icAction = ?
then assign icAction = {&DAEMONACTION-SAVE}.
if icAction <> {&DAEMONACTION-SAVE}
and icAction <> {&DAEMONACTION-SAVESTORE}
and icAction <> {&DAEMONACTION-STORE}
and icAction <> {&DAEMONACTION-VALIDATE}
then do:
<M-17 run SetMessage
(input 'Invalid action ($1).':U (icMessage),
input icAction (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input 'S':U (icType),
input 3 (iiSeverity),
input '' (icRowid),
input 'BLF-215':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in database>
assign oiReturnStatus = -3.
return.
end.
<M-18 run DataDescription
(input '' (icRowids),
input '' (icPkey),
input '' (icObjectIds),
input no (ilAllTables),
output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
/* =================================================================== */
/* Saving drafts requires that input tables contain exactly one object */
/* =================================================================== */
if icAction = {&DAEMONACTION-SAVESTORE}
or icAction = {&DAEMONACTION-STORE}
then do:
find first tFcDynRel where tFcDynRel.tcFcFrom = "" no-error.
if available tFcDynRel
then do:
tFcDynRel.thFcSBuffer:find-unique ("where true") no-error.
if not tFcDynRel.thFcSBuffer:available
then do:
<M-20 run SetMessage
(input (if tFcDynRel.thFcSBuffer:ambiguous then 'Input dataset has more than one object.':U else 'Input dataset is empty.':U) (icMessage),
input '' (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input 'S':U (icType),
input 3 (iiSeverity),
input '' (icRowid),
input 'BLF-217':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in database>
assign oiReturnStatus = -3.
return.
end.
end.
end.
<M-90 run ClearData (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
/* ================================================================= */
/* Load database records (for update) */
/* ================================================================= */
vlInitializeTranslations = no.
<M-13 run DataLoadByInput
(output opPrimaryKey (opPrimeKey),
output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
/* ================ */
/* Allow defaulting */
/* ================ */
<M-91 run MaintainByDatasetDefaulting (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
<I-27 {bFcRun
&PROCEDURE = "gipr_CompleteSTables"}>
if vcActivityCode = "Delete":U
then do:
/* ================================================================= */
/* On delete activity ignore input data and set loaded records to */
/* delete. */
/* ================================================================= */
<M-22 run DataDelete (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
/* Before data is deleted, we can lookup rowid */
find first tFcDynRel where tFcDynRel.tcFcFrom = "" no-error.
if available tFcDynRel
then do:
create query vhRowidQuery in widget-pool "non-persistent".
vhRowidQuery:forward-only = yes.
vhRowidQuery:set-buffers(tFcDynRel.thFcBuffer).
vhRowidQuery:query-prepare("for each t_o":U + tFcDynRel.tcFcTo).
vhRowidQuery:query-open().
vhRowidQuery:get-first().
do while not vhRowidQuery:query-off-end:
if opRowid <> ""
then assign opRowid = opRowid + ",".
assign opRowid = opRowid + tFcDynRel.thFcBuffer::tc_Rowid.
vhRowidQuery:get-next().
end.
vhRowidQuery:query-close().
delete object vhRowidQuery.
end.
end.
else do:
/* ================================================================= */
/* When in partial update mode, make sure the S buffers are updated */
/* correctly. */
/* ================================================================= */
if ilPartialUpdate
then do:
<M-26 run CorrectionForPartialUpdate
(input icPartialUpdateExceptionList (icPartialUpdateExceptionList),
output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
end.
/* ================================================================= */
/* On all other activities, validate contents (and copy to t_o***) */
/* ================================================================= */
if icAction <> {&DAEMONACTION-STORE}
then do:
<M-14 run ValidateUI (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
end.
if icAction = {&DAEMONACTION-STORE}
or (icAction = {&DAEMONACTION-SAVESTORE} and oiReturnStatus < 0)
then do:
/* copy input tables without validation so a draft instance can be made */
<I-23 {bFcRun
&PARAMETERS = "output viFcReturnSuper"
&PROCEDURE = "gipr_SetTables"}>
end.
if oiReturnStatus >= 0
and (icAction = {&DAEMONACTION-SAVE} or
icAction = {&DAEMONACTION-SAVESTORE})
then do:
<M-15 run AdditionalUpdates (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
end.
end.
/* ================================================================= */
/* Database update */
/* ================================================================= */
if oiReturnStatus >= 0
and (icAction = {&DAEMONACTION-SAVE} or
icAction = {&DAEMONACTION-SAVESTORE})
then do:
if ilReturnDataset
then do:
create dataset vhTempDS in widget-pool "non-persistent".
<M-24 run GetXmlRepresentationDataset
(input '' (icObjectRowId),
input false (ilHeaderOnly),
input 0 (iiPriority),
output vhTempDS by-reference (ozXMLDataset),
output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper >= 0
then do:
/* Make a deep-copy of the dataset to prevent any further updates in the class tables from being reflected
into the published dataset.
*/
ozObjectRepresentation:copy-dataset (vhTempDS,true,false,false,"",false,"").
assign vcTableName = "".
<M-25 run GetKeyFields
(input-output vcTableName (bcTableName),
output ocPrimaryKeyName (ocPrimaryKey),
output vcDummy (ocAlternateKey),
output vcDummy (ocObjectID),
output vcDummy (ocObjectStatus),
output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
end.
delete object vhTempDS.
end.
if oiReturnStatus >= 0
then do:
<M-16 run DataSave (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
end.
if vcActivityCode <> "Delete":U
and oiReturnStatus >= 0
then do:
/* After data has been saved, we can lookup rowid */
find first tFcDynRel where tFcDynRel.tcFcFrom = "" no-error.
if available tFcDynRel
then do:
create query vhRowidQuery in widget-pool "non-persistent".
vhRowidQuery:forward-only = yes.
vhRowidQuery:set-buffers(tFcDynRel.thFcBuffer).
vhRowidQuery:query-prepare("for each t_o":U + tFcDynRel.tcFcTo).
vhRowidQuery:query-open().
vhRowidQuery:get-first().
do while not vhRowidQuery:query-off-end:
if opRowid <> ""
then assign opRowid = opRowid + ",".
assign opRowid = opRowid + tFcDynRel.thFcBuffer::tc_Rowid.
vhRowidQuery:get-next().
end.
vhRowidQuery:query-close().
delete object vhRowidQuery.
end.
end.
end.
/* ================================================================= */
/* Create draft instance */
/* ================================================================= */
if icAction = {&DAEMONACTION-STORE}
or (icAction = {&DAEMONACTION-SAVESTORE} and oiReturnStatus < 0)
then do:
assign oiDraftInstance = viFcCurrentInstanceId
vcDummy = substring(ocPrimaryKeyName,1,255,"CHARACTER").
<M-21 run StoreState
(input vcFcComponentName + ' (':U + vcDummy + ')':U (icDescription),
input '' (icUIClass),
output oiReturnStatus (oiReturnStatus)) in database>
end.