icClassShortname | input | character | Shortname of the business class |
icAction | input | character | Possible actions: Start Close Open Stop Start+Open Close+Stop Store |
ilSubtransaction | input | logical | Start the new business instance as part of current transaction yes/no. |
biClassOpenCount | input-output | integer | use vi{&CLASS}OC |
bhClassInstanceHandle | input-output | handle | use vh{&CLASS}Inst |
biClassInstanceId | input-output | integer | use vi{&CLASS}Id |
icDraftReference | input | character | A description for the stored instance |
icUserDefinedContext | input | character | |
oiReturnStatus | output | integer | Return status of the method. |
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.