project BLF > class Transaction > method CommitTransaction
Description
Commit the transaction.
On subtransactions, only decrease transaction level by one, without making database updates.
On global transaction, write all component instances to the database. Any error occurring during update will result in a rollback of the entire transaction. (Do not run AbortTransaction when CommitTransaction fails.)
Parameters
ilStop | input | logical | Set to true if the instances will be stopped after the save. |
ihParentInstance | input | handle | In case commit is run from a business class, the instance that initiates commit cannot be stopped. |
ocInstances | output | character | Comma separated list of instanceId's of the instances within the transaction. |
oiReturnStatus | output | integer | |
Internal usage
BLF
QadFinancials
program code (program1/transaction.p)
if viTransactionLevel <= 0
or vlTransactionActive
then do:
<M-29 run SetMessage
(input 'No transaction active.':U (icMessage),
input '' (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input 'S':U (icType),
input 3 (iiSeverity),
input '' (icRowid),
input 'BLF-417':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in Transaction>
assign oiReturnStatus = -3.
return.
end.
/* Only commit on highest transaction level. */
if viTransactionLevel > 1
then do:
if ilStop
then assign viTransactionLevel = viTransactionLevel - 1.
return.
end.
<M-3 run StartPersistence
(output vhPL (ohPersistence),
output viFcReturnSuper (oiReturnStatus)) in Transaction>
if viFcReturnSuper <> 0
then assign viLocalReturn = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
/* set context for auditing */
if vcActivityCode <> ""
then do:
vhFcComponent = vhPL.
<M-36 run SetAuditContext
(input vcActivityCode (icAppContext),
input viSessionID (iiSessionId)) in persistence>
end.
assign oiReturnStatus = -98
viLocalReturn = -98
vlTransactionActive = yes.
if ihParentInstance <> ?
then run GetInstanceIdInPool (input ihParentInstance, output viParent).
/* set session ID of transaction to zero,
to avoid that it overwrites session ID of business classes in the transaction */
assign viTrxSessionId = viSessionID
viSessionID = 0.
/* Open instance communication must be done outside a transaction */
for each bInstances by bInstances.tiPriority on error undo, throw:
if bInstances.tiInstanceNr = viParent
then assign bInstances.thInsHandle = ihParentInstance.
else do:
assign vhDatabaseInst = ?
viDatabaseId = bInstances.tiInstanceNr
vcClassShortName = entry(1, bInstances.tcInsName).
if num-entries(vcClassShortName, "[") = 1
then assign vcUserDefinedContext = "".
else assign vcUserDefinedContext = entry(1, entry(2, vcClassShortName, "["), "]")
vcClassShortName = entry(1, vcClassShortName, "[").
<M-25 run BusinessClassActions
(input vcClassShortName (icClassShortname),
input 'OPEN':U (icAction),
input no (ilSubtransaction),
input-output bInstances.tiOpenCount (biClassOpenCount),
input-output vhDatabaseInst (bhClassInstanceHandle),
input-output viDatabaseId (biClassInstanceId),
input '' (icDraftReference),
input vcUserDefinedContext (icUserDefinedContext),
output viFcReturnSuper (oiReturnStatus)) in Transaction>
if viFcReturnSuper <> 0
then do:
vhFcComponent = vhPL.
<M-15 run ClearAuditContext () in persistence>
assign oiReturnStatus = viFcReturnSuper
vlTransactionActive = no
viSessionID = viTrxSessionId.
return.
end.
assign bInstances.thInsHandle = vhDatabaseInst.
end.
end.
assign viSessionID = viTrxSessionId.
TRX_block: do transaction on stop undo, leave on error undo, leave:
/* Start a transaction for non-progress databases */
vhFcComponent = vhPL.
<M-17 run InitTransaction (output viFcReturnSuper (oiReturnStatus)) in persistence>
if viFcReturnSuper <> 0
then assign viLocalReturn = viFcReturnSuper.
if viFcReturnSuper < 0
then leave TRX_block.
for each bInstances by bInstances.tiPriority
on error undo TRX_block, leave TRX_block:
assign vhDatabaseInst = bInstances.thInsHandle
viDatabaseId = bInstances.tiInstanceNr.
<M-6 run DataSaveWorker (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then assign viLocalReturn = viFcReturnSuper.
if viFcReturnSuper < 0
then do:
assign vhFcComponent = vhPL.
<M-18 run AbortTransaction (output viFcReturnSuper (oiReturnStatus)) in persistence>
undo TRX_block, leave TRX_block.
end.
/* Release memory used by persistent query programs as these queries most likely are not needed any more from here. */
if bInstances.tiInstanceNr <> viParent
then run gipr_DeleteQueryProcedures in vhdatabaseInst.
end.
assign vhFcComponent = vhPL.
<M-19 run CommitTransaction (output viFcReturnSuper (oiReturnStatus)) in persistence>
if viFcReturnSuper <> 0
then assign viLocalReturn = viFcReturnSuper.
if viFcReturnSuper < 0
then do:
assign vhFcComponent = vhPL.
<M-20 run AbortTransaction (output viFcReturnSuper (oiReturnStatus)) in persistence>
undo TRX_block, leave TRX_block.
end.
if viLocalReturn = -98
then assign viLocalReturn = 0.
end.
assign oiReturnStatus = viLocalReturn
ocInstances = ''.
/* Close all communication, whether or not the commit succeeded.
From here on do not stop for any error. */
for each bInstances by bInstances.tiPriority:
assign vhDatabaseInst = bInstances.thInsHandle
viDatabaseId = bInstances.tiInstanceNr
vcClassShortName = entry(1, bInstances.tcInsName).
if num-entries(vcClassShortName, "[") = 1
then assign vcUserDefinedContext = "".
else assign vcUserDefinedContext = entry(1, entry(2, vcClassShortName, "["), "]")
vcClassShortName = entry(1, vcClassShortName, "[").
if oiReturnStatus >= 0
then do:
<M-22 run UpdateStatus (output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper > 0
and oiReturnStatus = 0
then assign oiReturnStatus = viFcReturnSuper.
end.
else do:
<M-28 run UndoStatus (output viFcReturnSuper (oiReturnStatus)) in database>
end.
if bInstances.tiInstanceNr = viParent
then next.
if oiReturnStatus >= 0
then do:
assign vlTransactionOpen = yes
ocInstances = ocInstances + (if ocInstances = '' then '' else ',') + string(bInstances.tiInstanceNr).
<M-26 run BusinessClassActions
(input vcClassShortName (icClassShortname),
input (if ilStop = no or viDatabaseId = viParent then 'CLOSE':U else 'CLOSE+STOP':U) (icAction),
input no (ilSubtransaction),
input-output bInstances.tiOpenCount (biClassOpenCount),
input-output vhDatabaseInst (bhClassInstanceHandle),
input-output viDatabaseID (biClassInstanceId),
input '' (icDraftReference),
input vcUserDefinedContext (icUserDefinedContext),
output viFcReturnSuper (oiReturnStatus)) in Transaction>
assign vlTransactionOpen = no.
if ilStop
and bInstances.tiInstanceNr <> viParent
then do:
if ihParentInstance <> ?
then run gipr_ResetInstance in ihParentInstance
(input vcClassShortName,
input bInstances.tiInstanceNr).
delete bInstances.
end.
end.
else do:
<M-27 run BusinessClassActions
(input vcClassShortName (icClassShortname),
input 'CLOSE':U (icAction),
input no (ilSubtransaction),
input-output bInstances.tiOpenCount (biClassOpenCount),
input-output vhDatabaseInst (bhClassInstanceHandle),
input-output viDatabaseId (biClassInstanceId),
input '' (icDraftReference),
input vcUserDefinedContext (icUserDefinedContext),
output viFcReturnSuper (oiReturnStatus)) in Transaction>
end.
end.
vhFcComponent = vhPL.
<M-75 run ClearAuditContext () in persistence>
assign vlTransactionActive = no.
if oiReturnStatus >= 0
then do:
if ilStop
then assign viTransactionLevel = viTransactionLevel - 1.
/* ================================================================= */
/* On successfull commit of a draft transaction, */
/* the draft instance of transaction can be deleted. */
/* the draft instances of the business classes are already deleted. */
/* ================================================================= */
if viCurrentDraftInstanceId <> 0
then do:
vhFcComponent = vhPL.
<M-31 run WriteDirect (input 'fcDraftInstance':U (icTableName),
input 'for each fcDraftInstance where fcDraftInstance.DraftInstance_Id = ':U + string(viCurrentDraftInstanceId) (icPrepare),
input '' (icFieldList),
input '' (icFieldListDataTypes),
input '' (icAbsolute),
input '' (icIncremental),
input {&TARGETPROCEDURE} (ihClass),
input vcUserLogin (icUserLogin),
output viFcReturnSuper (oiReturnStatus)) in persistence>
assign viCurrentDraftInstanceId = 0.
end.
end.