project QadFinancials > class BHistoryDaemonProcessor > method PerformWorkItemDIRECTUpdPHist


Parameters


ihLocalHandleToThePersistenceinputhandle
iiPostingSafCombinedIDinputinteger
oiNbrOfCreatedPostingHistoutputinteger
oiNbrOfUpdatedPostingHistoutputinteger
oiNbrOfCreatedQFRWCubeoutputinteger
oiNbrOfCreatedQFRWCubeSafoutputinteger
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BHistoryDaemonProcessor.PerformWorkItemDIRECT


program code (program1/bhistorydaemonprocessor.p)

/* ======================================================================= */
/* Prerequisite:                                                           */
/*      The calling methods has to make sure a QpostingLine is available   */
/* Purpose of this method:                                                 */
/*      Create and/or Update the PostingHist-records for that QPostingLine */
/* ======================================================================= */
/* Indicate Direct db-access (find, update and create) is done here        */
<I-42 {WRITEDIRECTDBACCESS
     &WRITETABLENAMES = "'PostingHist'"}>

/* ============================================================================== */ 
/* Prerequisite: The calling methods has to make sure a QpostingLine is available */
/* ============================================================================== */ 
if not available QpostingLine
then do :  
    assign oiReturnStatus  = -3
           vcMsgHist       = trim(substitute(#T-93'Internal error: mandatory information in the program code is not accessible; see below for more details.':255(70321)T-93#)) + chr(10) + 
                             trim(substitute(#T-10'Record for table &1 is not available in method &2.':255(587056425)T-10#,"QpostingLine":U,"PerformWorkItemDIRECTUpdPHist":U)).
    <M-22 run SetMessage
       (input  vcMsgHist (icMessage), 
        input  '':U (icArguments), 
        input  '':U (icFieldName), 
        input  '':U (icFieldValue), 
        input  'E':U (icType), 
        input  3 (iiSeverity), 
        input  '':U (icRowid), 
        input  'qadfin-929433':U (icFcMsgNumber), 
        input  '':U (icFcExplanation), 
        input  '':U (icFcIdentification), 
        input  '':U (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonProcessor>
    Return.
end. /* if not available QpostingLine */

/* Local definitions outside of CB */
define buffer bPostingHist for PostingHist.

/* ================================================================================================ */
/* Initialise the output parameters and initialise the date,time and etime values                   */
/* Update the PostingHist.PostingHistFRWCubeStimeStamp field  with the format YYYYMMDD,TIME,ETIME   */
/* We then use the same date,time and etime values to update the fields of QFRWCube records         */
/* ================================================================================================ */
assign oiNbrOfCreatedPostingHist        = 0
       oiNbrOfUpdatedPostingHist        = 0
       oiNbrOfCreatedQFRWCube           = 0
       oiNbrOfCreatedQFRWCubeSAF        = 0
       viPostingHistIDForCube           = 0
       vlUpdatePostingHistBalanceField  = false
       vtDateForCube                    = today
       viTimeForCube                    = time
       vgETimeForCube                   = etime
       vcLastModifyDateTimeEtime        = string(year(vtDateForCube) * 10000 + month(vtDateForCube) * 100 + day(vtDateForCube)) + ',':U + 
                                          trim(string(viTimeForCube)) + ',':U + 
                                          trim(string(vgETimeForCube)). 

/* ========================================================================== */
/* Start with assuming we do not find a PostingHist matching the QPostingLine */
/* ========================================================================== */
assign vlFoundPostingHistRecord = false.

/* =================================================== */
/* Try to find a PostingHist matching the QPostingLine */
/* =================================================== */
for first PostingHist where
          PostingHist.Company_ID                 = QpostingLine.Company_ID                 and
          PostingHist.GL_ID                      = QpostingLine.GL_ID                      and
          PostingHist.Journal_ID                 = QpostingLine.Journal_ID                 and
          PostingHist.Layer_ID                   = QpostingLine.Layer_ID                   and
          PostingHist.Currency_ID                = QpostingLine.Currency_ID                and
          PostingHist.Division_ID                = QpostingLine.Division_ID                and
          PostingHist.Project_ID                 = QpostingLine.Project_ID                 and
          PostingHist.CostCentre_ID              = QpostingLine.CostCentre_ID              and
          PostingHist.IntercoBusinessRelation_ID = QpostingLine.IntercoBusinessRelation_ID and
          PostingHist.PostingSafCombined_ID      = iiPostingSafCombinedID                  and
          PostingHist.PostingHistYearPeriodFrom <= QpostingLine.PeriodYearPeriod           and
          PostingHist.PostingHistYearPeriodTill >= QpostingLine.PeriodYearPeriod
          exclusive-lock
          on error undo, throw:
          
    /* ========================================================= */
    /* Indicate we found a PostingHist matching the QPostingLine */
    /* ========================================================= */
    assign vlFoundPostingHistRecord = true.
    
    /* =================================================================== */
    /* Check the Periods in PostingHist against the period in QpostingLine */
    /* =================================================================== */
    if PostingHist.PostingHistYearPeriodFrom = QpostingLine.PeriodYearPeriod
    then do:
        
        /* ============================================================================== */
        /* Case 1 : PostingHist.PostingHistYearPeriodFrom = QpostingLine.PeriodYearPeriod */
        /* ============================================================================== */
        assign oiNbrOfUpdatedPostingHist               = oiNbrOfUpdatedPostingHist + 1
               /* Update the Movements of the current Period */
               PostingHist.PostingHistMovemntDebitTC   = PostingHist.PostingHistMovemntDebitTC + QpostingLine.QPostingLineDebitTC
               PostingHist.PostingHistMovemntDebitLC   = PostingHist.PostingHistMovemntDebitLC + QpostingLine.QPostingLineDebitLC
               PostingHist.PostingHistMovemntDebitCC   = PostingHist.PostingHistMovemntDebitCC + QpostingLine.QPostingLineDebitCC
               PostingHist.PostingHistMovemntDebitPC   = PostingHist.PostingHistMovemntDebitPC + QpostingLine.QPostingLineDebitPC
               PostingHist.PostingHistMovemntCreditTC  = PostingHist.PostingHistMovemntCreditTC + QpostingLine.QPostingLineCreditTC
               PostingHist.PostingHistMovemntCreditLC  = PostingHist.PostingHistMovemntCreditLC + QpostingLine.QPostingLineCreditLC
               PostingHist.PostingHistMovemntCreditCC  = PostingHist.PostingHistMovemntCreditCC + QpostingLine.QPostingLineCreditCC
               PostingHist.PostingHistMovemntCreditPC  = PostingHist.PostingHistMovemntCreditPC + QpostingLine.QPostingLineCreditPC
               PostingHist.PostingHistMovemntQTY       = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                            QpostingLine.QPostingLineCreditTC > 0
                                                         then PostingHist.PostingHistMovemntQTY - QpostingLine.QPostingLineQTY
                                                         else PostingHist.PostingHistMovemntQTY + QpostingLine.QPostingLineQTY
               /* Update the Life-To-date Balances of the current Period */
               PostingHist.PostingHistBalanceDebitTC   = PostingHist.PostingHistBalanceDebitTC + QpostingLine.QPostingLineDebitTC
               PostingHist.PostingHistBalanceDebitLC   = PostingHist.PostingHistBalanceDebitLC + QpostingLine.QPostingLineDebitLC
               PostingHist.PostingHistBalanceDebitCC   = PostingHist.PostingHistBalanceDebitCC + QpostingLine.QPostingLineDebitCC
               PostingHist.PostingHistBalanceDebitPC   = PostingHist.PostingHistBalanceDebitPC + QpostingLine.QPostingLineDebitPC
               PostingHist.PostingHistBalanceCreditTC  = PostingHist.PostingHistBalanceCreditTC + QpostingLine.QPostingLineCreditTC
               PostingHist.PostingHistBalanceCreditLC  = PostingHist.PostingHistBalanceCreditLC + QpostingLine.QPostingLineCreditLC
               PostingHist.PostingHistBalanceCreditCC  = PostingHist.PostingHistBalanceCreditCC + QpostingLine.QPostingLineCreditCC
               PostingHist.PostingHistBalanceCreditPC  = PostingHist.PostingHistBalanceCreditPC + QpostingLine.QPostingLineCreditPC
               PostingHist.PostingHistBalanceQTY       = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                            QpostingLine.QPostingLineCreditTC > 0
                                                         then PostingHist.PostingHistBalanceQTY - QpostingLine.QPostingLineQTY
                                                         else PostingHist.PostingHistBalanceQTY + QpostingLine.QPostingLineQTY
               /* Update the Year-To-date Balances of the current Period */
               PostingHist.PostingHistYTDDebitTC       = PostingHist.PostingHistYTDDebitTC + QpostingLine.QPostingLineDebitTC
               PostingHist.PostingHistYTDDebitLC       = PostingHist.PostingHistYTDDebitLC + QpostingLine.QPostingLineDebitLC
               PostingHist.PostingHistYTDDebitCC       = PostingHist.PostingHistYTDDebitCC + QpostingLine.QPostingLineDebitCC
               PostingHist.PostingHistYTDDebitPC       = PostingHist.PostingHistYTDDebitPC + QpostingLine.QPostingLineDebitPC
               PostingHist.PostingHistYTDCreditTC      = PostingHist.PostingHistYTDCreditTC + QpostingLine.QPostingLineCreditTC
               PostingHist.PostingHistYTDCreditLC      = PostingHist.PostingHistYTDCreditLC + QpostingLine.QPostingLineCreditLC
               PostingHist.PostingHistYTDCreditCC      = PostingHist.PostingHistYTDCreditCC + QpostingLine.QPostingLineCreditCC
               PostingHist.PostingHistYTDCreditPC      = PostingHist.PostingHistYTDCreditPC + QpostingLine.QPostingLineCreditPC
               PostingHist.PostingHistYTDQTY           = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                            QpostingLine.QPostingLineCreditTC > 0
                                                         then PostingHist.PostingHistYTDQTY - QpostingLine.QPostingLineQTY
                                                         else PostingHist.PostingHistYTDQTY + QpostingLine.QPostingLineQTY
               /* Update some properties used by Cube */
               viPostingHistIDForCube                  = PostingHist.PostingHist_ID
               PostingHist.PostingHistFRWCubeTimeStamp = vcLastModifyDateTimeEtime
               /* Keep track if we have to update the Balance fields of other PoistingHist records as well */
               vlUpdatePostingHistBalanceField         = (PostingHist.PostingHistYearPeriodTill <> 999999).
      
        if  PostingHist.PostingHistYTDDebitTC       = 0    and
            PostingHist.PostingHistYTDDebitLC       = 0    and
            PostingHist.PostingHistYTDDebitCC       = 0    and
            PostingHist.PostingHistYTDDebitPC       = 0    and
            PostingHist.PostingHistYTDCreditTC      = 0    and
            PostingHist.PostingHistYTDCreditLC      = 0    and
            PostingHist.PostingHistYTDCreditCC      = 0    and
            PostingHist.PostingHistYTDCreditPC      = 0    and
            PostingHist.PostingHistMovemntDebitTC   = 0    and
            PostingHist.PostingHistMovemntDebitLC   = 0    and
            PostingHist.PostingHistMovemntDebitCC   = 0    and
            PostingHist.PostingHistMovemntDebitPC   = 0    and
            PostingHist.PostingHistMovemntCreditTC  = 0    and
            PostingHist.PostingHistMovemntCreditLC  = 0    and
            PostingHist.PostingHistMovemntCreditCC  = 0    and
            PostingHist.PostingHistMovemntCreditPC  = 0    and
            PostingHist.PostingHistBalanceDebitTC   = 0    and
            PostingHist.PostingHistBalanceDebitLC   = 0    and
            PostingHist.PostingHistBalanceDebitCC   = 0    and
            PostingHist.PostingHistBalanceDebitPC   = 0    and
            PostingHist.PostingHistBalanceCreditTC  = 0    and
            PostingHist.PostingHistBalanceCreditLC  = 0    and
            PostingHist.PostingHistBalanceCreditCC  = 0    and
            PostingHist.PostingHistBalanceCreditPC  = 0         
            
        then do:
            <Q-18 run JournalByJournalLayerType (all) (Read) (NoCache)
               (input PostingHist.Journal_ID, (JournalId)
                input ?, (JournalCode)
                input PostingHist.Company_ID, (CompanyId)
                input ?, (LayerTypeCode)
                output dataset tqJournalByJournalLayerType) in BJournal> 
                
            find first tqJournalByJournalLayerType where
                       tqJournalByJournalLayerType.tiJournal_ID = PostingHist.Journal_ID and
                       tqJournalByJournalLayerType.tcLayerTypeCode = {&LAYERTYPECODE-TRANSIENT} no-error.

            if available tqJournalByJournalLayerType
            then do:

                /* If there is a prev record, we need to change the TILL */
                
                for each bPostingHist where
                         bPostingHist.Company_ID                 = PostingHist.Company_ID                 and
                         bPostingHist.GL_ID                      = PostingHist.GL_ID                      and
                         bPostingHist.Journal_ID                 = PostingHist.Journal_ID                 and
                         bPostingHist.Layer_ID                   = PostingHist.Layer_ID                   and
                         bPostingHist.Currency_ID                = PostingHist.Currency_ID                and
                         bPostingHist.Division_ID                = PostingHist.Division_ID                and
                         bPostingHist.Project_ID                 = PostingHist.Project_ID                 and
                         bPostingHist.CostCentre_ID              = PostingHist.CostCentre_ID              and
                         bPostingHist.IntercoBusinessRelation_ID = PostingHist.IntercoBusinessRelation_ID and
                         bPostingHist.PostingSafCombined_ID      = iiPostingSafCombinedID                 
                      by bPostingHist.PostingHistYearperiodTill descending :
                         
                    if bPostingHist.PostingHistYearperiodTill < PostingHist.PostingHistYearperiodTill
                    then do:
                        assign bPostingHist.PostingHistYearperiodTill = PostingHist.PostingHistYearperiodTill.
                        leave.
                    end.
                 end.
                 delete PostingHist. 
             end.
        end.

    end. /* if PostingHist.PostingHistYearPeriodFrom = QpostingLine.PeriodYearPeriod */
    
    else do :
        
        if PostingHist.PostingHistYearPeriodFrom < QpostingLine.PeriodYearPeriod
        then do:
         
            /* ============================================================================== */
            /* Case 2 : PostingHist.PostingHistYearPeriodFrom < QpostingLine.PeriodYearPeriod */
            /* ============================================================================== */
            /* Update the PostingHist-record its ostingHistYearPeriodTill*/
            assign viPrevYearPeriod                       = PostingHist.PostingHistYearPeriodTill
                   oiNbrOfUpdatedPostingHist              = oiNbrOfUpdatedPostingHist + 1
                   PostingHist.PostingHistYearPeriodTill  = QpostingLine.PeriodYearPeriod - 1.
            /* Create a new PostingHist-record */
            create bPostingHist.
            assign oiNbrOfCreatedPostingHist                = oiNbrOfCreatedPostingHist + 1
                   vhFcComponent                            = ihLocalHandleToThePersistence
                   bPostingHist.PostingHist_ID              = <M-48 GetNextValue  (input  'ObjectNumber':U (icSequence)) in Progress>
                   bPostingHist.Company_ID                  = QpostingLine.Company_ID
                   bPostingHist.GL_ID                       = QpostingLine.GL_ID
                   bPostingHist.Journal_ID                  = QpostingLine.Journal_ID
                   bPostingHist.Layer_ID                    = QpostingLine.Layer_ID
                   bPostingHist.Currency_ID                 = QpostingLine.Currency_ID
                   bPostingHist.Division_ID                 = QpostingLine.Division_ID
                   bPostingHist.Project_ID                  = QpostingLine.Project_ID
                   bPostingHist.CostCentre_ID               = QpostingLine.CostCentre_ID
                   bPostingHist.Layer_ID                    = QpostingLine.Layer_ID
                   bPostingHist.IntercoBusinessRelation_ID  = QpostingLine.IntercoBusinessRelation_ID
                   bPostingHist.PostingSafCombined_ID       = iiPostingSafCombinedID
                   bPostingHist.PostingHistYearPeriodFrom   = QpostingLine.PeriodYearPeriod
                   bPostingHist.PostingHistYearPeriodTill   = viPrevYearPeriod
                   /* Update the Movements */
                   bPostingHist.PostingHistMovemntDebitTC   = QpostingLine.QPostingLineDebitTC
                   bPostingHist.PostingHistMovemntDebitLC   = QpostingLine.QPostingLineDebitLC
                   bPostingHist.PostingHistMovemntDebitCC   = QpostingLine.QPostingLineDebitCC
                   bPostingHist.PostingHistMovemntDebitPC   = QpostingLine.QPostingLineDebitPC
                   bPostingHist.PostingHistMovemntCreditTC  = QpostingLine.QPostingLineCreditTC
                   bPostingHist.PostingHistMovemntCreditLC  = QpostingLine.QPostingLineCreditLC
                   bPostingHist.PostingHistMovemntCreditCC  = QpostingLine.QPostingLineCreditCC
                   bPostingHist.PostingHistMovemntCreditPC  = QpostingLine.QPostingLineCreditPC
                   bPostingHist.PostingHistMovemntQTY       = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                                 QpostingLine.QPostingLineCreditTC > 0
                                                              then - QpostingLine.QPostingLineQTY
                                                              else QpostingLine.QPostingLineQTY
                   /* Update Life-To-Date */
                   bPostingHist.PostingHistBalanceDebitTC   = PostingHist.PostingHistBalanceDebitTC + QpostingLine.QPostingLineDebitTC
                   bPostingHist.PostingHistBalanceDebitLC   = PostingHist.PostingHistBalanceDebitLC + QpostingLine.QPostingLineDebitLC
                   bPostingHist.PostingHistBalanceDebitCC   = PostingHist.PostingHistBalanceDebitCC + QpostingLine.QPostingLineDebitCC
                   bPostingHist.PostingHistBalanceDebitPC   = PostingHist.PostingHistBalanceDebitPC + QpostingLine.QPostingLineDebitPC
                   bPostingHist.PostingHistBalanceCreditTC  = PostingHist.PostingHistBalanceCreditTC + QpostingLine.QPostingLineCreditTC
                   bPostingHist.PostingHistBalanceCreditLC  = PostingHist.PostingHistBalanceCreditLC + QpostingLine.QPostingLineCreditLC
                   bPostingHist.PostingHistBalanceCreditCC  = PostingHist.PostingHistBalanceCreditCC + QpostingLine.QPostingLineCreditCC
                   bPostingHist.PostingHistBalanceCreditPC  = PostingHist.PostingHistBalanceCreditPC + QpostingLine.QPostingLineCreditPC
                   bPostingHist.PostingHistBalanceQTY       = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                                  QpostingLine.QPostingLineCreditTC > 0
                                                               then PostingHist.PostingHistBalanceQTY - QpostingLine.QPostingLineQTY
                                                               else PostingHist.PostingHistBalanceQTY + QpostingLine.QPostingLineQTY
                   /* Update some properties used by Cube */
                   viPostingHistIDForCube                   = bPostingHist.PostingHist_ID
                   bPostingHist.PostingHistFRWCubeTimeStamp = vcLastModifyDateTimeEtime.
            /* Update Year-To-Date if it is in the same year */
            if trunc(PostingHist.PostingHistYearPeriodFrom / 100, 0) = trunc(QpostingLine.PeriodYearPeriod / 100, 0)
            then assign bPostingHist.PostingHistYTDDebitTC  = PostingHist.PostingHistYTDDebitTC + QpostingLine.QPostingLineDebitTC
                        bPostingHist.PostingHistYTDDebitLC  = PostingHist.PostingHistYTDDebitLC + QpostingLine.QPostingLineDebitLC
                        bPostingHist.PostingHistYTDDebitCC  = PostingHist.PostingHistYTDDebitCC + QpostingLine.QPostingLineDebitCC
                        bPostingHist.PostingHistYTDDebitPC  = PostingHist.PostingHistYTDDebitPC + QpostingLine.QPostingLineDebitPC
                        bPostingHist.PostingHistYTDCreditTC = PostingHist.PostingHistYTDCreditTC + QpostingLine.QPostingLineCreditTC
                        bPostingHist.PostingHistYTDCreditLC = PostingHist.PostingHistYTDCreditLC + QpostingLine.QPostingLineCreditLC
                        bPostingHist.PostingHistYTDCreditCC = PostingHist.PostingHistYTDCreditCC + QpostingLine.QPostingLineCreditCC
                        bPostingHist.PostingHistYTDCreditPC = PostingHist.PostingHistYTDCreditPC + QpostingLine.QPostingLineCreditPC
                        bPostingHist.PostingHistYTDQTY      = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                                 QpostingLine.QPostingLineCreditTC > 0
                                                              then PostingHist.PostingHistYTDQTY - QpostingLine.QPostingLineQTY
                                                              else PostingHist.PostingHistYTDQTY + QpostingLine.QPostingLineQTY.
            else assign bPostingHist.PostingHistYTDDebitTC  = QpostingLine.QPostingLineDebitTC
                        bPostingHist.PostingHistYTDDebitLC  = QpostingLine.QPostingLineDebitLC
                        bPostingHist.PostingHistYTDDebitCC  = QpostingLine.QPostingLineDebitCC
                        bPostingHist.PostingHistYTDDebitPC  = QpostingLine.QPostingLineDebitPC
                        bPostingHist.PostingHistYTDCreditTC = QpostingLine.QPostingLineCreditTC
                        bPostingHist.PostingHistYTDCreditLC = QpostingLine.QPostingLineCreditLC
                        bPostingHist.PostingHistYTDCreditCC = QpostingLine.QPostingLineCreditCC
                        bPostingHist.PostingHistYTDCreditPC = QpostingLine.QPostingLineCreditPC
                        bPostingHist.PostingHistYTDQTY      = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                                 QpostingLine.QPostingLineCreditTC > 0
                                                              then - QpostingLine.QPostingLineQTY
                                                              else QpostingLine.QPostingLineQTY.                        
            /* Keep track if we have to update the Balance fields of other PoistingHist records as well */
            assign vlUpdatePostingHistBalanceField = bPostingHist.PostingHistYearPeriodTill <> 999999.
            
        end. /* if PostingHist.PostingHistYearPeriodFrom < QpostingLine.PeriodYearPeriod */    
        
    end. /* Not if PostingHist.PostingHistYearPeriodFrom = QpostingLine.PeriodYearPeriod */
    
    /* ============================================================================== */
    /* If needed then update the Balance fields of other PoistingHist records as well */
    /* ============================================================================== */
    if vlUpdatePostingHistBalanceField
    then do:
        <M-31 run PerformWorkItemDIRECTUpdPHistBalances
           (input  ihLocalHandleToThePersistence (ihLocalHandleToThePersistence), 
            input  iiPostingSafCombinedID (iiPostingSafCombinedID), 
            input-output oiNbrOfUpdatedPostingHist (biNbrOfUpdatedPostingHist), 
            output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonProcessor> 
        if viFcReturnSuper <> 0 
        then assign oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0 
        then Return.
    end. /* if vlUpdatePostingHistBalanceField */
    
    /* ================================================================================================= */
    /* Create QFRWCube and QFRWCubeSaf records                                                           */
    /* If the QPostingLines are from the Rebuild Account Balance then do not create the QFRWCube Records */
    /* ================================================================================================= */
    <M-38 run PerformWorkItemDIRECTUpdPHistFRW
       (input  ihLocalHandleToThePersistence (ihLocalHandleToThePersistence), 
        input  vtDateForCube (itDateForCube), 
        input  viTimeForCube (iiTimeForCube), 
        input  vgETimeForCube (igETimeForCube), 
        input  viPostingHistIDForCube (iiPostingHistIDForCube), 
        output oiNbrOfCreatedQFRWCube (oiNbrOfCreatedQFRWCube), 
        output oiNbrOfCreatedQFRWCubeSaf (oiNbrOfCreatedQFRWCubeSaf), 
        output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonProcessor>
    if viFcReturnSuper <> 0 
    then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper < 0 
    then Return.

end. /* for first PostingHist where */

/* ======================================================================================= */
/* Actions required in case no PostingHist record was found with the for first PostingHist */
/* ======================================================================================= */
if not vlFoundPostingHistRecord
then do:
    /* Check if posting history records exist after this period */
    assign viPrevYearPeriod = 999999.
    for each bPostingHist where
             bPostingHist.Company_ID                 = QpostingLine.Company_ID                 and
             bPostingHist.GL_ID                      = QpostingLine.GL_ID                      and
             bPostingHist.Journal_ID                 = QpostingLine.Journal_ID                 and
             bPostingHist.Layer_ID                   = QpostingLine.Layer_ID                   and
             bPostingHist.Currency_ID                = QpostingLine.Currency_ID                and
             bPostingHist.Division_ID                = QpostingLine.Division_ID                and
             bPostingHist.Project_ID                 = QpostingLine.Project_ID                 and
             bPostingHist.CostCentre_ID              = QpostingLine.CostCentre_ID              and
             bPostingHist.IntercoBusinessRelation_ID = QpostingLine.IntercoBusinessRelation_ID and
             bPostingHist.PostingSafCombined_ID      = iiPostingSafCombinedID                   and
             bPostingHist.PostingHistYearPeriodFrom  > QpostingLine.PeriodYearPeriod
             by BPostingHist.PostingHistYearPeriodFrom
             on error undo, throw:
        assign viPrevYearPeriod = bPostingHist.PostingHistYearPeriodFrom - 1. 
        leave.
    end. /* for each bPostingHist */
    /* Create a new PostingHist record */
    create bPostingHist.
    assign oiNbrOfCreatedPostingHist                = oiNbrOfCreatedPostingHist + 1
           vhFcComponent                            = ihLocalHandleToThePersistence
           bPostingHist.PostingHist_ID              = <M-41 GetNextValue  (input  'ObjectNumber':U (icSequence)) in Progress>
           bPostingHist.PostingHistYearPeriodFrom   = QpostingLine.PeriodYearPeriod
           bPostingHist.PostingHistYearPeriodTill   = viPrevYearPeriod
           bPostingHist.Company_ID                  = QpostingLine.Company_ID
           bPostingHist.GL_ID                       = QpostingLine.GL_ID
           bPostingHist.Journal_ID                  = QpostingLine.Journal_ID
           bPostingHist.Layer_ID                    = QpostingLine.Layer_ID
           bPostingHist.Currency_ID                 = QpostingLine.Currency_ID
           bPostingHist.Division_ID                 = QpostingLine.Division_ID
           bPostingHist.Project_ID                  = QpostingLine.Project_ID
           bPostingHist.CostCentre_ID               = QpostingLine.CostCentre_ID
           bPostingHist.Layer_ID                    = QpostingLine.Layer_ID 
           bPostingHist.IntercoBusinessRelation_ID  = QpostingLine.IntercoBusinessRelation_ID
           bPostingHist.PostingSafCombined_ID       = iiPostingSafCombinedID
           /* Assign Movements */
           bPostingHist.PostingHistMovemntDebitTC  = QpostingLine.QPostingLineDebitTC
           bPostingHist.PostingHistMovemntDebitLC  = QpostingLine.QPostingLineDebitLC
           bPostingHist.PostingHistMovemntDebitCC  = QpostingLine.QPostingLineDebitCC
           bPostingHist.PostingHistMovemntDebitPC  = QpostingLine.QPostingLineDebitPC
           bPostingHist.PostingHistMovemntCreditTC = QpostingLine.QPostingLineCreditTC
           bPostingHist.PostingHistMovemntCreditLC = QpostingLine.QPostingLineCreditLC
           bPostingHist.PostingHistMovemntCreditCC = QpostingLine.QPostingLineCreditCC
           bPostingHist.PostingHistMovemntCreditPC = QpostingLine.QPostingLineCreditPC
           bPostingHist.PostingHistMovemntQTY      = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                        QpostingLine.QPostingLineCreditTC > 0
                                                     then - QpostingLine.QPostingLineQTY
                                                     else QpostingLine.QPostingLineQTY
           /* Assign Life-To-Date Balances */
           bPostingHist.PostingHistBalanceDebitTC   = QpostingLine.QPostingLineDebitTC
           bPostingHist.PostingHistBalanceDebitLC   = QpostingLine.QPostingLineDebitLC
           bPostingHist.PostingHistBalanceDebitCC   = QpostingLine.QPostingLineDebitCC
           bPostingHist.PostingHistBalanceDebitPC   = QpostingLine.QPostingLineDebitPC
           bPostingHist.PostingHistBalanceCreditTC  = QpostingLine.QPostingLineCreditTC
           bPostingHist.PostingHistBalanceCreditLC  = QpostingLine.QPostingLineCreditLC
           bPostingHist.PostingHistBalanceCreditCC  = QpostingLine.QPostingLineCreditCC
           bPostingHist.PostingHistBalanceCreditPC  = QpostingLine.QPostingLineCreditPC
           bPostingHist.PostingHistBalanceQTY       = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                         QpostingLine.QPostingLineCreditTC > 0
                                                      then - QpostingLine.QPostingLineQTY
                                                      else QpostingLine.QPostingLineQTY
           /* Assign Year-To-Date Balances */
           bPostingHist.PostingHistYTDDebitTC       = QpostingLine.QPostingLineDebitTC
           bPostingHist.PostingHistYTDDebitLC       = QpostingLine.QPostingLineDebitLC
           bPostingHist.PostingHistYTDDebitCC       = QpostingLine.QPostingLineDebitCC
           bPostingHist.PostingHistYTDDebitPC       = QpostingLine.QPostingLineDebitPC
           bPostingHist.PostingHistYTDCreditTC      = QpostingLine.QPostingLineCreditTC
           bPostingHist.PostingHistYTDCreditLC      = QpostingLine.QPostingLineCreditLC
           bPostingHist.PostingHistYTDCreditCC      = QpostingLine.QPostingLineCreditCC
           bPostingHist.PostingHistYTDCreditPC      = QpostingLine.QPostingLineCreditPC
           bPostingHist.PostingHistYTDQTY           = if QpostingLine.QPostingLineDebitTC  < 0 or
                                                         QpostingLine.QPostingLineCreditTC > 0
                                                      then - QpostingLine.QPostingLineQTY
                                                      else QpostingLine.QPostingLineQTY
           /* Assign some properties used by Cube */
           viPostingHistIDForCube                   = bPostingHist.PostingHist_ID
           bPostingHist.PostingHistFRWCubeTimeStamp = vcLastModifyDateTimeEtime.
    /* ============================================================================== */
    /* If needed then update the Balance fields of other PoistingHist records as well */
    /* ============================================================================== */
    if bPostingHist.PostingHistYearPeriodTill <> 999999
    then do :
        <M-63 run PerformWorkItemDIRECTUpdPHistBalances
           (input  ihLocalHandleToThePersistence (ihLocalHandleToThePersistence), 
            input  iiPostingSafCombinedID (iiPostingSafCombinedID), 
            input-output oiNbrOfUpdatedPostingHist (biNbrOfUpdatedPostingHist), 
            output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonProcessor>
        if viFcReturnSuper <> 0 
        then assign oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0 
        then Return.
    end. /* if bPostingHist.PostingHistYearPeriodTill <> 999999 */
    
    /* ================================================================================================= */
    /* Create QFRWCube and QFRWCubeSaf records                                                           */
    /* If the QPostingLines are from the Rebuild Account Balance then do not create the QFRWCube Records */
    /* ================================================================================================= */
    <M-1 run PerformWorkItemDIRECTUpdPHistFRW
       (input  ihLocalHandleToThePersistence (ihLocalHandleToThePersistence), 
        input  vtDateForCube (itDateForCube), 
        input  viTimeForCube (iiTimeForCube), 
        input  vgETimeForCube (igETimeForCube), 
        input  viPostingHistIDForCube (iiPostingHistIDForCube), 
        output oiNbrOfCreatedQFRWCube (oiNbrOfCreatedQFRWCube), 
        output oiNbrOfCreatedQFRWCubeSaf (oiNbrOfCreatedQFRWCubeSaf), 
        output viFcReturnSuper (oiReturnStatus)) in BHistoryDaemonProcessor>
    if viFcReturnSuper <> 0 
    then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper < 0 
    then Return.
    
end. /* if not vlFoundPostingHistRecord */

/* ==================== */
/* Release used buffers */
/* ==================== */
release PostingHist.
release bPostingHist.