project QadFinancials > class BAPMatching > method UpdateMatchingLinesAndSubFromUI


Parameters


ictAPMAtchingTcRowidinputcharactericAPMatchingTcRowid: TcRowid of the APMatching record.
Mandatory
tSPTAPMatchingLninput-outputtemp-tableTemp-table holding the Lines of the matching
tSPTAPMatchingLnTaxinput-outputtemp-tableTemp-table holding the Taxes of the Lines of the matching
tSPTAPMatchingLnWHTinput-outputtemp-table
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program8/bapmatching.p)

/* ============================================================================================================ */
/* This method is implemented in order to improve the performance:                                              */
/* At the moment 'Save' is pressed on the UI - that only supports maintaining a single APMatching at the time , */
/* the normal approach would be that for every new record in APMatchingLn, APMatchingLnTax or APMatchingLnWHT,  */
/* a call to the BL is made to actualy create the record in the instance-data (eg method CreateAPMatchingLnTax) */
/* This method receives the datasets from the UI for assigning the IDs and tc_status fields into it             */
/* Note these records are only created at the moment the APMatching gets saved.                                 */
/* ============================================================================================================ */
/* Making a single all from UI to BL for every APMatchingLn and every underlying record is far less performing  */
/* than making a single call from UI to BL and doing all logic at once. This however implies that all required  */
/* data from the UI is passed to BL and back again (so the UI holds the updated data).                          */
/* This data that comes from the UI and is send back to the UI is contained in the parameter-temp-tables of     */
/* this method whose name all starts with 'tSPTAPMatchingLn'.                                                   */
/* ============================================================================================================ */
/* Some info on the input:                                                                                      */
/*  TEMP-TABLE tSPTAPMatchingLn                                                                                 */
/*      (this temp-table doesn't hold any deleted records, only the unchanged, changed and new ones):           */
/*      If tc_status = N                                                                                        */
/*      then APMatching_ID and APMatchingLn_ID are empty                                                        */
/*           tc_ParentRowid is empty                                                                            */
/*           tc_Rowid has an artibrary value                                                                    */
/*      If tc_status = C                                                                                        */
/*      then APMatching_ID, APMatchingLn_ID, tc_ParentRowid and tc_Rowid are properly filled                    */
/*  TEMP-TABLE tSPTAPMatchingLnTax (and the same for WHT):                                                      */
/*      (this temp-table doesn't hold any deleted or changed records, only unchanged and new ones):             */
/*      If tc_status = N                                                                                        */
/*      then APMatching_ID, APMatchingLn_ID and APMatchingLnTax_ID are empty                                    */
/*           tc_ParentRowid is filled with a value of a tSPTAPMatchingLn.tc_Rowid                               */
/*           tc_Rowid has an artibrary value                                                                    */
/*      If tc_status = ""                                                                                       */
/*      then APMatching_ID, APMatchingLn_ID and APMatchingLnTax_ID are properly filled                          */
/*           tc_ParentRowid is filled with a value of a tSPTAPMatchingLn.tc_Rowid                               */
/*           tc_Rowid is properly filled                                                                        */
/* ============================================================================================================ */



/* ================== */
/* Exception handling */	
/* ================== */
assign oiReturnStatus       = -98
       viLocalReturnStatus  = 0.

/* ===================== */
/* Main processing block */	
/* ===================== */
MAIN_BLOCK: 
do on error undo, leave MAIN_BLOCK:
    
    
    /* ================================================== */ 
    /* 0. Verify the correctness of the parameters passed */ 
    /* ================================================== */  
    if ictAPMatchingTcRowid = "":U or
       ictAPMatchingTcRowid = ?
    then do:
        assign vcMsgAPMatching     = trim(substitute(#T-19'Internal error: the system cannot find the matching as the internal row-ID is empty.':255(516794138)T-19#))
               viLocalReturnStatus = -3. 
        <M-6 run SetMessage
           (input  vcMsgAPMatching (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'qadfin-234853':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BAPMatching> 
        leave MAIN_BLOCK.
    end. /* if not available tAPMatching  */
    find tAPMatching where 
         tAPMatching.tc_Rowid = ictAPMatchingTcRowid
         no-lock no-error.
    if not available tAPMatching 
    then do:
        assign vcMsgAPMatching     = trim(substitute(#T-96'Internal error: the system cannot find the matching based upon the internal row-ID (&1)':230(270897944)T-96#,ictAPMatchingTcRowid))
               viLocalReturnStatus = -3. 
        <M-15 run SetMessage
           (input  vcMsgAPMatching (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'qadfin-570623':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BAPMatching> 
        leave MAIN_BLOCK.
    end. /* if not available tAPMatching  */
    
    
    /* ===================================================================================================================================== */
    /* 1. Loop through the all tSPTAPMatchingLn and:                                                                                         */
    /*      - run AddDetailLine for it in case of new-mode (tc_ParentRowid is empty and tc_status = N)                                       */
    /*      - run AddDetailLine for its underlying (tSPTAPMatchingLnTax and tSPTAPMatchingLnWHT) records as well                             */
    /* The functional content of the tSPT-records is copied into the t-records and after that the t-records are copied into the tSPT-records */
    /* ===================================================================================================================================== */
    repeat preselect each tSPTAPMatchingLn :
	
	    find next tSPTAPMatchingLn.
        
        /* ============================================================= */
        /* Actions for new tSPTAPMatchingLn: Create a new tAPMatchingLn  */
        /* Check on tc_status and tc_ParentRowid to see if its a new one */
        /* ============================================================= */
        if tSPTAPMatchingLn.tc_status = "N":U and 
           (tSPTAPMatchingLn.tc_ParentRowid = "":U or 
            tSPTAPMatchingLn.tc_ParentRowid = ?)
        then do :
            <M-27 run AddDetailLine
               (input  'APMatchingLn':U (icTable), 
                input  tAPMatching.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BAPMatching>
            if viFcReturnSuper < 0 or 
               (viFcReturnSuper > 0 and 
                viLocalReturnStatus = 0) 
            then assign viLocalReturnStatus = viFcReturnSuper.
            if viLocalReturnStatus < 0 
            then leave MAIN_BLOCK.
        end. /* if tSPTAPMatchingLn.tc_status = "N":U and  */
        
        /* ========================================================= */
        /* Actions for changed Lines: Find the tAPMatchingLn         */
        /* Check on tc_status to see if its a changed one            */
        /* ========================================================= */
        if tSPTAPMatchingLn.tc_status  = "C":U and  
           tSPTAPMatchingLn.tc_rowid  <> "":U  and 
           tSPTAPMatchingLn.tc_rowid  <> ?
        then do :
            find tAPMatchingLn where 
                 tAPMatchingLn.tc_rowid = tSPTAPMatchingLn.tc_rowid
                 no-lock no-error.
            if not available tAPMatchingLn
            then do :
                assign vcMsgAPMatching     = trim(substitute(#T-11'Internal error: the system cannot find the matching-line based upon the internal row-ID (&1)':255(848355533)T-11#,tSPTAPMatchingLn.tc_rowid))
                       viLocalReturnStatus = -3. 
                <M-66 run SetMessage
                   (input  vcMsgAPMatching (icMessage), 
                    input  '':U (icArguments), 
                    input  '':U (icFieldName), 
                    input  '':U (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  '':U (icRowid), 
                    input  'qadfin-764570':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BAPMatching> 
                leave MAIN_BLOCK.
            end. /* if not available tAPMatchingLn */
        end. /* if tSPTAPMatchingLn.tc_status  = "C":U and  */
        
        /* ====================================================================================================================== */
        /* By now we should always have a tAPMatchingLn record available - if not then just go to the next iteration of this loop */
        /* ====================================================================================================================== */
        if not available tAPMatchingLn
        then next.
        
        /* ============================================================== */                    
	    /* Copy functional content of tSPTAPMatchingLn into tAPMatchingLn */
        /* ============================================================== */
        buffer-copy tSPTAPMatchingLn  
            except tc_RowId tc_ParentRowId tc_status APMatchingLn_ID APMatching_ID
            to tAPMatchingLn.
	    
        /* ============================================================================================================= */
        /* Go trough all the tSPTAPMatchingLnTax linked to the tSPTAPMatchingLn and create a new tAPMatchingLnTax for it */
        /* Do exactly the same for APMatchingLnWHT as for APMatchingLnTax                                                */
        /* ============================================================================================================= */
        for each tSPTAPMatchingLnTax where 
                 tSPTAPMatchingLnTax.tc_parentRowid = tSPTAPMatchingLn.tc_rowid and 
                 tSPTAPMatchingLnTax.tc_Status      = "N":U:
            <M-1 run AddDetailLine
               (input  'APMatchingLnTax':U (icTable), 
                input  tAPMatchingLn.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BAPMatching>
            if viFcReturnSuper < 0 or 
               (viFcReturnSuper > 0 and 
                viLocalReturnStatus = 0) 
            then assign viLocalReturnStatus = viFcReturnSuper.
            if viLocalReturnStatus < 0 then
            leave MAIN_BLOCK.
            /* Copy functional content of tSPTAPMatchingLnTax into tAPMatchingLnTax */
            buffer-copy tSPTAPMatchingLnTax
                except tc_RowId tc_ParentRowId tc_Status APMatchingLn_ID APMatchingLnTax_ID APMatching_ID
                to tAPMatchingLnTax.
            /* Copy complete content of tAPMatchingLnTax into tSPTAPMatchingLnTax */
            buffer-copy tAPMatchingLnTax 
                to tSPTAPMatchingLnTax.
        end. /* for each tSPTAPMatchingLnTax */  
        for each tSPTAPMatchingLnWHT where 
                 tSPTAPMatchingLnWHT.tc_parentRowid = tSPTAPMatchingLn.tc_rowid and 
                 tSPTAPMatchingLnWHT.tc_Status      = "N":U:
            <M-52 run AddDetailLine
               (input  'APMatchingLnWHT':U (icTable), 
                input  tAPMatchingLn.tc_rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BAPMatching>
            if viFcReturnSuper < 0 or 
               (viFcReturnSuper > 0 and 
                viLocalReturnStatus = 0)
            then assign viLocalReturnStatus = viFcReturnSuper.
            if viLocalReturnStatus < 0
            then leave MAIN_BLOCK.
            /* Copy functional content of tSPTAPMatchingLnWHT into tAPMatchingLnWHT */
            buffer-copy tSPTAPMatchingLnWHT  
                 except tc_RowId tc_ParentRowId tc_status APMatchingLn_ID APMatching_ID APMatchingLnWHT_ID 
                 to tAPMatchingLnWHT.
            /* Copy complete content of tAPMatchingLnWHT into tSPTAPMatchingLnWHT */
            buffer-copy tAPMatchingLnWHT 
                to tSPTAPMatchingLnWHT.
        end. /*for each tSPTAPMatchingLnWHT */	                                         
        
        /* ============================================================ */
        /* Copy complete content of tAPMatchingLn into tSPTAPMatchingLn */
        /* ============================================================ */
        buffer-copy tAPMatchingLn 
            to tSPTAPMatchingLn.
        
    end. /* for each tSPTAPMatchingLn : */
    
    
    /* ====================================================================================== */
    /* 2. Now delete tAPMatchingLn records that are not in tSPTAPMatchingLn and do the same   */
    /* for the underlying records on APMatchingLnTax and APMatchingLnWHT                      */
    /* As the content of the records that exist both in tAPMatchingLn and tSPTAPMatchingLn is */
    /* the same, we can now simply use relations based upon tc_Rowid and tc_parentRowid.      */
    /* The same applies to the underlying tables.                                             */
    /* ====================================================================================== */
    for each tAPMatchingLn where
             tAPMatchingLn.tc_ParentRowid = tAPMatching.tc_Rowid :
        
        /* ========================================================================= */
        /* The tAPMatchingLn needs to be deleted (together with its underlying data) */
        /* ========================================================================= */
        if not can-find (tSPTAPMatchingLn where
                         tSPTAPMatchingLn.tc_Rowid = tAPMatchingLn.tc_Rowid)
        then do :
            /* Actions when tAPMatchingLn is in create mode */
            if tAPMatchingLn.tc_Status = "N":U 
            then do:
                for each tAPMatchingLnTax where
                         tAPMatchingLnTax.tc_ParentRowid = tAPMatchingLn.tc_Rowid:
                    delete tAPMatchingLnTax.
                end. /* for each tAPMatchingLnTax */
                for each tAPMatchingLnWHT where
                         tAPMatchingLnWHT.tc_ParentRowid = tAPMatchingLn.tc_Rowid:
                    delete tAPMatchingLnWHT.
                end. /* for each tAPMatchingLnWHT */
                delete tAPMatchingLn.
                next.  
            end. /* if tAPMatchingLn.tc_Status = "N":U  */
            /* Actions when tAPMatchingLn is in modify mode  */
            if tAPMatchingLn.tc_Status = "C":U 
            then do:
                for each tAPMatchingLnTax where
                         tAPMatchingLnTax.tc_ParentRowid = tAPMatchingLn.tc_Rowid:
                    assign tAPMatchingLnTax.tc_Status = "D":U.
                end. /* for each tAPMatchingLnTax */
                for each tAPMatchingLnWHT where
                         tAPMatchingLnWHT.tc_ParentRowid = tAPMatchingLn.tc_Rowid:
                    assign tAPMatchingLnWHT.tc_Status = "D":U.
                end. /* for each tAPMatchingLnWHT */
                assign tAPMatchingLn.tc_Status = "D":U.
                next.
            end. /* if tAPMatchingLn.tc_Status = "C":U  */
        end. /* if not can-find (first tSPTAPMatchingLn where */
        
        /* ===================================================================================================== */
        /* If tAPMatchingLn has not yet been deleted or marked as deleted then delete the underlying records in  */
        /* APMatchingLnTax and APMatchingLnWHT that are in the t-temp-table but no longer in the tSPT-temp-table */
        /* ===================================================================================================== */
        if available tAPMatchingLn and 
           tAPMatchingLn.tc_Status <> "D":U
        then do : 
            for each tAPMatchingLnTax where
                     tAPMatchingLnTax.tc_ParentRowid = tAPMatchingLn.tc_Rowid:
                if not can-find (tSPTAPMatchingLnTax where
                                 tSPTAPMatchingLnTax.tc_Rowid = tAPMatchingLnTax.tc_Rowid)
                then do :
                    if tAPMatchingLnTax.tc_Status = "N":U 
                    then delete tAPMatchingLnTax.
                    else assign tAPMatchingLnTax.tc_Status = "D":U.
                end. /* if not can-find (tSPTAPMatchingLnTax where */
            end. /* for each tAPMatchingLnTax where */            
            for each tAPMatchingLnWHT where
                     tAPMatchingLnWHT.tc_ParentRowid = tAPMatchingLn.tc_Rowid:
                if not can-find (tSPTAPMatchingLnWHT where
                                 tSPTAPMatchingLnWHT.tc_Rowid = tAPMatchingLnWHT.tc_Rowid)
                then do :
                    if tAPMatchingLnWHT.tc_Status = "N":U 
                    then delete tAPMatchingLnWHT.
                    else assign tAPMatchingLnWHT.tc_Status = "D":U.
                end. /* if not can-find (tSPTAPMatchingLnWHT where */
            end. /* for each tAPMatchingLnWHT where */
        end. /* if available tAPMatchingLn and */
        
    end. /* 2.  for each tAPMatchingLn where */
    
    
END. /* MAIN_BLOCK */    

/* ================== */                        
/* Exception handling */
/* ================== */
assign oiReturnStatus = viLocalReturnStatus.