Description
This method will create DaemonQueue records
Parameters
oiReturnStatus | output | integer | Return status of the method. |
Internal usage
QadFinancials
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 */