project BLF > class Business Component > method BusinessClassActions

Description

Provide all necessary functions to start and stop instances of a business class, both for stateless and for state-reset environments.


Parameters


icClassShortnameinputcharacterShortname of the business class
icActioninputcharacterPossible actions:
Start Close
Open Stop
Start+Open Close+Stop
Store
ilSubtransactioninputlogicalStart the new business instance as part of current transaction yes/no.
biClassOpenCountinput-outputintegeruse vi{&CLASS}OC
bhClassInstanceHandleinput-outputhandleuse vh{&CLASS}Inst
biClassInstanceIdinput-outputintegeruse vi{&CLASS}Id
icDraftReferenceinputcharacterA description for the stored instance
icUserDefinedContextinputcharacter
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


BLF
method business.BusinessClassActions
method business.GetCustomFieldValues
method BCustomField.UnusedCustomFieldsForComponent
method BDocumentLink.ApiDumpDocuments
method BDraftInstance.PostTransaction
method BGenericReportAdapter.openReport
method BQueryCache.RunQuery
method BReportDaemonProcessor.PerformWorkItem
method BResource.GetReportCBF
method BScanDaemonPerfWorkItem.ApiProcessSingleScanDaemonQueue
method BWorkObject.PostSave
method BXmlDaemonProcessor.LoadXmlDocument
method Session.GetBusinessFields
method Session.GetActivities
method Session.GetActivitiesForObject
method Session.GetWorkAssistantObjects
method Transaction.AbortTransaction
method Transaction.CommitTransaction
method Transaction.ExitInstance
method Transaction.GetInstanceDetails
method Transaction.InitInstance

QadFinancials
method BMultiCyProcessor.ProcessRequest
method BMultiCyProcessor.ProcessRequestAsyncProcess


program code (program1/business.p)

if  icAction = "STOP":U
and biClassInstanceId = 0
then return.

/* ================================================================= */
/* Some special facility for the transaction class only :            */
/* When a business class opens THE transaction class                 */
/* (the one to which this business class is supposed to be linked)   */
/* and the business class is actually not linked to a transaction,   */
/* the business class should start a transaction by itself.          */
/* ================================================================= */
if  icAction = "OPEN":U
and icClassShortname = "Transaction":U
and biClassInstanceId = 0
then do:
    <M-1 run BusinessClassActions
       (input  'Transaction':U (icClassShortname), 
        input  'START+OPEN':U (icAction), 
        input  no (ilSubtransaction), 
        input-output biClassOpenCount (biClassOpenCount), 
        input-output bhClassInstanceHandle (bhClassInstanceHandle), 
        input-output biClassInstanceId (biClassInstanceId), 
        input  '' (icDraftReference), 
        input  icUserDefinedContext (icUserDefinedContext), 
        output viLocalReturn (oiReturnStatus)) in business>
    if viLocalReturn <> 0
    then oiReturnStatus = viLocalReturn.
    if viLocalReturn < 0
    then return.

    assign viTransactionId   = biClassInstanceId
           vhTransactionInst = bhClassInstanceHandle.
    
    <M-2 run StartTransaction  (output viLocalReturn (oiReturnStatus)) in Transaction>
    if viLocalReturn <> 0
    then oiReturnStatus = viLocalReturn.
    if viLocalReturn < 0
    then return.

    <M-9 run AddInstance
       (input  viFcCurrentInstanceId (iiInstanceNr), 
        input  dynamic-function ('gipr_GetShortList':U in {&TARGETPROCEDURE}) (icClass), 
        input  ? (iiCompVersion), 
        output vlTransactionMainInstance (olFirst), 
        output viLocalReturn (oiReturnStatus)) in Transaction>
    if viLocalReturn <> 0
    then oiReturnStatus = viLocalReturn.
    if viLocalReturn < 0
    then return.

    assign vlTransactionActive = yes.
    
    return.
end.

/* ================================================================= */
/* Do business.                                                      */
/* ================================================================= */
if  icAction = "CLOSE":U
and biClassOpenCount <> 1
then do:
    if biClassOpenCount > 1
    then assign biClassOpenCount = biClassOpenCount - 1.
    else assign bhClassInstanceHandle = ?.
    return.
end.

if icAction begins "START":U
then assign biClassInstanceId     = 0
            biClassOpenCount      = 0
            bhClassInstanceHandle = ?.
else if not (valid-handle(bhClassInstanceHandle) and
             bhClassInstanceHandle:file-name = "ins/ins__":U + icClassShortname + ".p":U)
     then run GetInstanceInPool (input icClassShortname,
                                 input biClassInstanceId,
                                 output bhClassInstanceHandle).

if bhClassInstanceHandle = ?
then do:
    if ilSubtransaction
    and viTransactionId = 0
    then do:
        /*
        Subtransaction, but no transaction started ?
        Opening the transaction class will actually start it and add current instance.
        The transaction class is not closed here. It should stay in memory so other instances can be added.
        It will be closed either in de appserver deactivate procedure or when the transaction is stopped.
        */
        <I-3 {bFcOpenInstance
            &CLASS           = "Transaction"}>
    end.

    if  search("ins/ins__":U + lc(icClassShortname) + ".r":U) = ?
    and search("ins/ins__":U + lc(icClassShortname) + ".p":U) = ?
    then do:
        <M-8 run SetMessage
           (input  'Invalid Business Class ':U + icClassShortname (icMessage), 
            input  '' (icArguments), 
            input  '' (icFieldName), 
            input  '' (icFieldValue), 
            input  'S':U (icType), 
            input  3 (iiSeverity), 
            input  '' (icRowid), 
            input  'BLF-257':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viLocalReturn (oiReturnStatus)) in business>
        assign oiReturnStatus = -3.
        return.
    end.

    run value("ins/ins__":U + lc(icClassShortname) + ".p":U)
        persistent set bhClassInstanceHandle.

    run Mainblock in bhClassInstanceHandle
       (input       (if icClassShortname = "session":U
                     then 0
                     else viSessionId),
        input       (if ilSubtransaction then viTransactionId else 0),
        input        0,
        input        no,
        input        icUserDefinedContext,
        input-output biClassInstanceId,
              output viLocalReturn).

    if viLocalReturn <> 0
    then do:
        /* Stopping a dead instance = ignore */
        if icAction = "STOP":U
        then assign oiReturnStatus = 0.
        else assign oiReturnStatus = viLocalReturn.
    end.
    
    if viLocalReturn < 0
    then do:
        run StopInstance in bhClassInstanceHandle
           (input "", input "", input "", input no, output viLocalReturn).
        delete procedure bhClassInstanceHandle no-error.
        assign bhClassInstanceHandle = ?.
        return.
    end.
    
    biClassOpenCount = 1.
end.
else if biClassOpenCount > 0
     then biClassOpenCount = biClassOpenCount + 1.

if icAction begins "CLOSE":U
or icAction = "STOP":U
or icAction = "STORE":U
or (icAction = "START":U and vlFcStateless = yes)
then do:

    /*do not stop instance when closing an instance in state-reset mode and it is not redirected*/
    /* Close + state-reset + redirected = no    => do nothing */
    if  icAction = "CLOSE":U
    and vlFcStateless = no
    then if dynamic-function ("Redirected":U in bhClassInstanceHandle) = no
         then return.

    if icAction = "STORE":U
    then run StopInstance in bhClassInstanceHandle
            (input "SAVE":U,
             input icDraftReference,
             input "",
             input yes,
             output viLocalReturn).
    else run StopInstance in bhClassInstanceHandle
           (input (if vlFcStateless
                   then if icAction = "CLOSE":U
                        or icAction = "START":U
                        then "save":U
                        else "delete":U
                   else ""),
            input "",
            input "",
            input no,
            output viLocalReturn).

    delete procedure bhClassInstanceHandle no-error.

    if viLocalReturn <> 0
    then oiReturnStatus = viLocalReturn.
    if viLocalReturn < 0
    then return.
    
    if  valid-handle (bhClassInstanceHandle)
    and bhClassInstanceHandle:file-name = "ins/ins__":U + icClassShortname + ".p":U
    then do:
        <M-6 run SetMessage
          (input  'Instance cannot be stopped.':U (icMessage), 
           input  '' (icArguments), 
           input  '' (icFieldName), 
           input  '' (icFieldValue), 
           input  'S':U (icType), 
           input  3 (iiSeverity), 
           input  '' (icRowid), 
           input  'BLF-256':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output oiReturnStatus (oiReturnStatus)) in business>
        assign oiReturnStatus = -3.
        return.
    end.
    
    assign bhClassInstanceHandle = ?
           biClassOpenCount      = 0.
    
    if icAction matches "*STOP":U
    or icAction = "STORE":U
    then assign biClassInstanceId = 0.
end.