project QadFinancials > class BHistoryDaemonQueue > method CreateHistoryDaemonQueue

Description

This method will create DaemonQueue records


Parameters


oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BHistoryDaemonProcessor.LoadExternalWork


program code (program6/bhistorydaemonqueue.p)

/* ========================================================================================================== */
/* This method will create fcDaemonQueue records whenever there are QPostingline records found.               */
/* The actual processing of the fcDaemonQueues records happens in HistoryDaemonProcessor:LoopForWork ()       */
/* Depending on the setting in DaemonNrOfRequestsInLoop, the system will create a single fcDaemonQueue-record */
/* for all QPostingLines that do  or will create 1 fcDaemonQueue for each individual QPostingLine             */ 
/* ========================================================================================================== */


/* ===================================== */
/* Start with a clean and empty instance */
/* ===================================== */
<M-15 run ClearData  (output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonQueue>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

/* ============================== */
/* Find the History Daemon-record */
/* ============================== */
<Q-70 run DaemonInfoLimited (all) (Read) (NoCache)
   (input ?, (DaemonId)
    input {&HISTORYDAEMON}, (DaemonName)
    input ?, (DaemonStatus)
    input ?, (DaemonStatusDiffersFrom)
    output dataset tqDaemonInfoLimited) in BBaseDaemon>
find tqDaemonInfoLimited where
     tqDaemonInfoLimited.tcDaemonName = {&HISTORYDAEMON}
     no-lock no-error.
if not available tqDaemonInfoLimited
then do:
    assign vcHistoryDaemonQueueMsg = trim(#T-12'History Daemon record does not exist.':100(2370)t-12#)
           oiReturnStatus          = -3.
    <M-3 run SetMessage (input  vcHistoryDaemonQueueMsg (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  {&HISTORYDAEMON} (icFieldValue),
                     input  'E':U (icType),
                     input  2 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QADFIN-1422':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonQueue>       
    return.
end. /* if not available tqDaemonInfoLimited */

/* =================================================================================================== */
/* Create fcDaemonQueue records based upon the QPosting records                                                                                                         */
/* Depending on the setup we either create just a single fcDaemonQueue record for all QPostingLines found, either we create a single fcDaemonQueue for every QPostingLine */
/* =================================================================================================== */
assign viCount = 0.

/* ============================================================================= */
/* Field DaemonNrOfRequestsInLoop on Daemon-level states the different behaviour */
/* ============================================================================= */
if tqDaemonInfoLimited.tiDaemonNrOfRequestsInLoop >= 999999
then do :        
    
    /* =========================================================== */
    /* Check if there is at least 1 QPostingLine record to Process */
    /* =========================================================== */
    <Q-25 assign vlFcQueryRecordsAvailable = QPostingLineByCompanyIDByGL (NoCache)
       (input ?, (CompanyId)
        input ?, (GLID)) in BQPosting>
    
    /* ======================================================================== */
    /* Create a single fcDaemonQueue-record to process all QPostingLine records */
    /* ======================================================================== */
    if vlFcQueryRecordsAvailable <> false
    then do:
        <M-98 run AddDetailLine
           (input  'fcDaemonQueue':U (icTable), 
            input  ? (icParentRowid), 
            output oiReturnStatus (oiReturnStatus)) in BHistoryDaemonQueue>                      
        if oiReturnStatus <> 0
        then leave.    
        assign tfcDaemonQueue.DaemonId                  = tqDaemonInfoLimited.tiDaemonId
               tfcDaemonQueue.DaemonQueueStatus         = {&DAEMONQUEUESTATUS-WAITING}
               tfcDaemonQueue.DaemonQueuePriority       = 1
               tfcDaemonQueue.DaemonQueueRef            = {&DAEMONQUEUEREFERENCE-MULTIPLE}
               tfcDaemonQueue.DaemonQueueRefDescription = {&DAEMONQUEUEREFERENCE-MULTIPLE}
               tfcDaemonQueue.DaemonQueueReqStartDate   = ?
               tfcDaemonQueue.DaemonQueueReqStartTime   = 0.    
        /* Indicate fcDaemonQueue-records are created */
        assign viCount = 1.
    end. /* vlFcQueryRecordsAvailable <> false */

end. /* if tqDaemonInfoLimited.tiDaemonNrOfRequestsInLoop = 999999 */

else do:

    /* =================================================================================================== */
    /* Instead of reading all the QRecords, just read the first 100 as that is enough for creating at once */
    /* =================================================================================================== */
    assign viNbrRecordsToRead = viCountErrorQueues + 100.
    <Q-18 run QPostingLineByCompanyIDROWID (firstviNbrRecordsToRead) (Read) (NoCache)
       (input ?, (CompanyId)
        output dataset tqQPostingLineByCompanyIDROWID) in BQPosting>
    
    /* Start the Persistence Layer for BQposting */
    if can-find (first tqQPostingLineByCompanyIDROWID) and 
       vhPerstistenceLayerHandleLocal = ?
    then do:
        <M-85 run StartPersistence
           (output vhPerstistenceLayerHandleLocal (ohPersistence), 
            output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonQueue>
    end. /* if can-find (first tqQPostingLineByCompanyIDROWID) and  */
    
    /* =========================================== */
    /* Cycle through the read QPostingLine records */
    /* =========================================== */
    assign viCount            = 0
           viCountErrorQueues = 0.
    for each tqQPostingLineByCompanyIDROWID no-lock:
        /* Raise error-counter - will be decreased when it is succesfully handled */
        assign viCountErrorQueues = viCountErrorQueues + 1.
        /* If DaemonQueue not correct filled, skip it */
        if tqQPostingLineByCompanyIDROWID.tiQPostingLine_ID = 0 or 
           tqQPostingLineByCompanyIDROWID.tiQPostingLine_ID = ? or 
           tqQPostingLineByCompanyIDROWID.tiCompany_ID      = 0 or
           tqQPostingLineByCompanyIDROWID.tiCompany_ID      = ?
        then next.
        /* if DaemonQueue already exists, skip it */    
        if tqQPostingLineByCompanyIDROWID.tiDaemonQueueId <> 0 and 
           tqQPostingLineByCompanyIDROWID.tiDaemonQueueId <> ? and 
           tqQPostingLineByCompanyIDROWID.tiDaemonId = tqDaemonInfoLimited.tiDaemonId
        then next.
        /* if qRecord is still locked, then skip it */
        assign vcRowID = ?.
        if vhPerstistenceLayerHandleLocal <> ?
        then do :        
              assign vcRowID = entry (1,tqQPostingLineByCompanyIDROWID.tc_rowid).
              if vcRowID <> '' and vcRowID <> ?
              then do :
                 assign vhFcComponent = vhPerstistenceLayerHandleLocal.
                 if <M-61 RecordIsLocked
                       (input  'QPostingLine':U (icTableName), 
                        input  vcRowID (icRecordRowid)) in Progress> = true
                 then next.
             end. /* IF vcRowID <> '' and vcRowID <> ? */
        end. /* IF vhPerstistenceLayerHandleLocal <> ? */
        /* Indicate as correctly handled */            
        assign viCountErrorQueues = viCountErrorQueues - 1.
        /* Create fcDaemonQueue record */
        <M-11 run AddDetailLine (input  'fcDaemonQueue':U (icTable), 
                             input  ? (icParentRowid), 
                             output oiReturnStatus (oiReturnStatus)) in BHistoryDaemonQueue>                      
        if oiReturnStatus <> 0
        then leave.
        assign tfcDaemonQueue.DaemonId                  = tqDaemonInfoLimited.tiDaemonId
               tfcDaemonQueue.DaemonQueueStatus         = {&DAEMONQUEUESTATUS-WAITING}
               tfcDaemonQueue.DaemonQueuePriority       = 1
               tfcDaemonQueue.DaemonQueueRef            = string(tqQPostingLineByCompanyIDROWID.tiQPostingLine_ID)
               tfcDaemonQueue.DaemonQueueRefDescription = trim(tqQPostingLineByCompanyIDROWID.tcQPostingLineInfo) + ' ((':U + trim(string(tqQPostingLineByCompanyIDROWID.tiCompany_ID)) + '))':U
               tfcDaemonQueue.DaemonQueueReqStartDate   = ?
               tfcDaemonQueue.DaemonQueueReqStartTime   = 0.
        /* Increase counter and make sure to only process first 100 records */
        assign viCount = viCount + 1.
        if viCount > 100
        then leave.        
    end. /* for each tqQPostingLineByCompanyIDROWID no-lock: */

end. /* Not if tqDaemonInfoLimited.tiDaemonNrOfRequestsInLoop = 999999 */


/* ================================================================ */
/* Check for errors in the previous block                           */
/* ================================================================ */
if oiReturnStatus < 0
then return.

/* ================================================================ */
/* Required actions in case fcDaemonQueue records have been created */
/* ================================================================ */
if viCount > 0
then do :
    /* ========================================== */
    /* Run Validate Component BHistoryDaemonQueue */
    /* ========================================== */
    <M-6 run ValidateBC (output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonQueue>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.   
    if oiReturnStatus < 0
    then return.    
    /* ==================== */
    /* Run Addition Updates */
    /* ==================== */
    <M-7 run AdditionalUpdates (output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonQueue>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.        
    if oiReturnStatus < 0
    then return.    
    /* ============================================================== */
    /* Run Datasave for BHistoryDaemonQueue                           */
    /* ============================================================== */
    <M-8 run DataSave (output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonQueue>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnstatus = viFcReturnSuper.        
    if oiReturnStatus < 0
    then return.    
end. /* if viCount > 0  */