project BLF > class Transaction > method ExitInstance

Description

This method can be extended with code to execute when an instance of a business class is stopped.

Standard functionality in this method is
- Clean up instance data in the fcInstance table.
- Create or update a draft instance if applicable.

PreCondition

This method is executed when :
- A business instance is stopped (release object + delete instance data)
(icDraftReference = "" + viCurrentDraftInstanceId = 0)
- A business instance is saved as a draft (release object + create draft)
(icDraftReference <> "")
- A draft instance is stopped (release object, delete copy of draft, release original draft)
(icDraftReference = "" + viCurrentDraftInstanceId <> 0)

This method is NOT run when a business instance is only closed (release object + keep instance data).


Parameters


icDraftReferenceinputcharacterDescription for the draft instance.
This parameter will have a value when creating a draft instance.
icDraftFormNameinputcharacterThis parameter will have a value when creating a draft instance.
ilDraftIsSharedinputlogicalThis parameter will have a value when creating a draft instance.
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program/transaction.p)

if icDraftReference = ""
then do:
    if  viCurrentDraftInstanceId = 0
    and viTransactionLevel > 0
    then do:
        <M-1 run SetMessage
          (input  'Transaction not closed.':U (icMessage), 
           input  '' (icArguments), 
           input  '' (icFieldName), 
           input  '' (icFieldValue), 
           input  'S':U (icType), 
           input  3 (iiSeverity), 
           input  '' (icRowid), 
           input  'BLF-418':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output viFcReturnSuper (oiReturnStatus)) in Transaction>
        assign oiReturnStatus = -3.
        return.
    end.

    /* ================================================================= */
    /* Release draft instance                                            */
    /* ================================================================= */

    /*refs #600 when you press cancel on an opened draft instance, the draft instance should not go away,
      so do not stop the instances within the transaction
      I will leave this code commented untill after the code review.*/
    /* 3.5.2007 uncomment code */
    
    if viCurrentDraftInstanceId <> 0
    then for each tInstances on error undo, throw:
        assign vhDatabaseInst   = ?
               viDatabaseId     = tInstances.tiInstanceNr
               vcClassShortName = entry(1, tInstances.tcInsName).

        if num-entries(vcClassShortName, "[") = 1
        then assign vcUserDefinedContext = "".
        else assign vcUserDefinedContext = entry(1, entry(2, vcClassShortName, "["), "]")
                    vcClassShortName     = entry(1, vcClassShortName, "[").

        <M-3 run BusinessClassActions
           (input  vcClassShortName (icClassShortname), 
            input  'STOP':U (icAction), 
            input  no (ilSubtransaction), 
            input-output tInstances.tiOpenCount (biClassOpenCount), 
            input-output vhdatabaseInst (bhClassInstanceHandle), 
            input-output vidatabaseID (biClassInstanceId), 
            input  '' (icDraftReference), 
            input  vcUserDefinedContext (icUserDefinedContext), 
            output viFcReturnSuper (oiReturnStatus)) in Transaction>
    end.
end.
else do:
    /* ================================================================= */
    /* Save all instances in the transation as a draft                   */
    /* ================================================================= */
    assign vlTransactionActive = yes
           vcDraftClass        = ""
           vcDraftClassTemp    = "".

    for each tInstances by tInstances.tiPriority on error undo, throw:
        assign vhDatabaseInst    = ?
               viDatabaseId      = tInstances.tiInstanceNr
               vlTransactionOpen = yes
               vcClassShortName  = entry(1, tInstances.tcInsName).

        if num-entries(vcClassShortName, "[") = 1
        then assign vcUserDefinedContext = "".
        else assign vcUserDefinedContext = entry(1, entry(2, vcClassShortName, "["), "]")
                    vcClassShortName     = entry(1, vcClassShortName, "[").

        <M-4 run BusinessClassActions
           (input  vcClassShortName (icClassShortname), 
            input  'OPEN':U (icAction), 
            input  no (ilSubtransaction), 
            input-output tInstances.tiOpenCount (biClassOpenCount), 
            input-output vhdatabaseInst (bhClassInstanceHandle), 
            input-output vidatabaseID (biClassInstanceId), 
            input  '' (icDraftReference), 
            input  vcUserDefinedContext (icUserDefinedContext), 
            output oiReturnStatus (oiReturnStatus)) in Transaction>
        if oiReturnStatus < 0 then leave.

        <M-5 run GetPublicData (input  'vcActivityCode':U (icDataList), 
                        output vcFcMaskList (ocValues), 
                        output viFcReturnSuper (oiReturnStatus)) in database>

        if vcDraftClass    = ""
        or vcDraftActivity = ""
        then Assign vcDraftClass = entry (1,tInstances.tcInsName)
                    vcDraftClassTemp = vcDraftClass.
 
        if vcDraftActivity = ""
        then vcDraftActivity = vcFcMaskList.

        if viBSessionID = 0
        then do:
            <M-7 run GetPublicData (input  'viSessionId,viCompanyId':U (icDataList), 
                        output vcFcMaskList (ocValues), 
                        output viFcReturnSuper (oiReturnStatus)) in database>
            assign viBSessionID = integer(entry(1,vcFcMaskList,chr(3)))
                   viCYID       = integer(entry(2,vcFcMaskList,chr(3))).
        end.

        <M-2 run BusinessClassActions
           (input  vcClassShortName (icClassShortname), 
            input  'STORE':U (icAction), 
            input  no (ilSubtransaction), 
            input-output tInstances.tiOpenCount (biClassOpenCount), 
            input-output vhdatabaseInst (bhClassInstanceHandle), 
            input-output vidatabaseID (biClassInstanceId), 
            input  icDraftReference (icDraftReference), 
            input  vcUserDefinedContext (icUserDefinedContext), 
            output oiReturnStatus (oiReturnStatus)) in Transaction>  
        if oiReturnStatus < 0 then leave.
        Assign vcDraftClass = vcDraftClassTemp.
    end.    

    /*get current user */
    <M-6 run StartCacher (output vhFcComponent (ohCacher), 
                      output viFcReturnSuper (oiReturnStatus)) in Transaction>
    <M-8 run GetCharacterValueFromSession (input  viBSessionID (iiSessionId), 
                                       input  'UserLogin':U (icDataItemName), 
                                       output vcUserLogin (ocValue), 
                                       output viFcReturnSuper (oiReturnStatus)) in Cacher>

    assign vlTransactionActive = no
           viTransactionID     = viFcCurrentInstanceId
           viCompanyId         = viCYID
           vcActivityCode      = vcDraftActivity.
end.

<ANCESTOR-CODE>