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


ilStopinputlogicalSet to true if the instances will be stopped after the save.
ihParentInstanceinputhandleIn case commit is run from a business class, the instance that initiates commit cannot be stopped.
ocInstancesoutputcharacterComma separated list of instanceId's of the instances within the transaction.
oiReturnStatusoutputinteger


Internal usage


BLF
method database.DataSave

QadFinancials
method BBankImportLineProcess.SaveAndProcess
method BBudgetRebuild.ApiRebuildBudget
method BCInvoiceAPMatching.CreateCInvoiceAPMatchingAllInOneTran
method BCInvoiceAPMatching.CreateCInvoiceAPMatchingOneInOneTran
method BCInvoiceJournalEntry.ApiStdMaintainTTV01
method BDInvoiceJournalEntry.ApiStdMaintainTT
method BDInvoiceMultiCy.UpdateDeductionDetailCy
method BDInvoiceMultiCy.UpdateDeductionDetailCyV01
method BERSProcessor.ERSProcessCreateBatchRequest
method BERSProcessor.ERSProcessFinish
method BERSProcessor.ERSProcessInit
method BGLCalendar.AdditionalUpdates
method BJournalEntryMultiCy.CreateMultiCyPostings
method BOpenItemAdjustment.OIAdjCommitSub
method BSelfBill.ApiCreateInvPrepayPayment
method BSharedSetMerge.MergeInit


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.