project QadFinancials > class BTaxRegister > method DataLoadByInput

Description

This method loads database records corresponding to input values (records found in the t_s*** tables).
When nothing found in the database, a new record should be initialised.
Input values should also be updated with :
- identity fields (override input values)
- tc_Rowid / tc_ParentRowid / tc_Status

Annotation

This template can be used to implement the code for this method.

* Replace [MainTableName] with the name of the main table in the class dataset (no prefixes).
* This template assumes that the main table has an identity field, and this field is the only field of the primary index of the table. Replace [PrimaryKeyFieldName] with the name of this field.
* This template assumes that the table has one logical alternate key (a key that is visible and editable to end-users) with one field. Replace [LogicalKeyFieldName] with the name of this field. If the logical key contains more than one field, repeat the code with this tag for every field in the key.
* The run statement following [METHOD CALL] should not be copied literally, but inserted as a method call (run the method in your own component).




for each t_s[MainTableName] by rowid(t_s[MainTableName]) on error undo, throw:

/* ================================================================= */
/* Lookup object by logical key */
/* When in create mode, skip lookup. */
/* ================================================================= */
if vcActivityCode <> "Create":U
then do:
vcFreeform = "for each [MainTableName] where [MainTableName].[LogicalKeyFieldName] = '":U + t_s[MainTableName].[LogicalKeyFieldName] + "'":U.
[METHOD CALL]
run DataLoad
(input '' (icRowids),
input '' (icPkeys),
input '' (icObjectIds),
input vcFreeform (icFreeform),
input yes (ilKeepPrevious),
output viFcReturnSuper (oiReturnStatus))
if viFcReturnSuper >= 0
then do:
/* DataLoad succeeded, no no-error needed */
find first t[MainTableName] where t[MainTableName].[LogicalKeyFieldName] = t_s[MainTableName].[LogicalKeyFieldName].
if t[MainTableName].tc_Status <> ""
then do:
[METHOD CALL]
run SetMessage
(input [duplicate key error] (icMessage),
input t_s[MainTableName].[LogicalKeyFieldName] (icArguments),
input 't[MainTableName].[LogicalKeyFieldName]':U (icFieldName),
input t_s[MainTableName].[LogicalKeyFieldName] (icFieldValue),
input 'E':U (icType),
input 3 (iiSeverity),
input t_s[MainTableName].tc_Rowid (icRowid),
input 'ERR-xyz':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus))
assign oiReturnStatus = -1.
return.
end.
end.
end.

/* ================================================================= */
/* When in delete mode, ignore input data. */
/* When object not found, do not return an error. */
/* ================================================================= */
if vcActivityCode = "Delete":U
then do:
if viFcReturnSuper = -4
then delete t_s[MainTableName].
else do:
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

/* keep the UI rowid for usage in error messages (tFcMessages.tcFcRowid) */
[METHOD CALL]
run SetRowidConvert
(input t_s[MainTableName].tc_Rowid (icOldRowid),
input t[MainTableName].tc_Rowid (icNewRowid),
output viFcReturnSuper (oiReturnStatus))

/* ================================================================= */
/* Update input to allow correct matching */
/* ================================================================= */
assign t_s[MainTableName].tc_Rowid = t[MainTableName].tc_Rowid
t_s[MainTableName].tc_ParentRowid = ""
opPrimeKey = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
+ string(t[MainTableName].[PrimaryKeyFieldName]).
end.

next.
end.

if vcActivityCode = "Create":U
or viFcReturnSuper = -4
then do:
/* ================================================================= */
/* When object not found and in modify only mode, return an error. */
/* ================================================================= */
if vcActivityCode = "Modify":U
then do:
[METHOD CALL]
run SetMessage
(input #T'Object with key $1 does not exist.':100T# (icMessage),
input t_s[MainTableName].[LogicalKeyFieldName] (icArguments),
input 't[MainTableName].[LogicalKeyFieldName]':U (icFieldName),
input t_s[MainTableName].[LogicalKeyFieldName] (icFieldValue),
input 'E':U (icType),
input 3 (iiSeverity),
input t_s[MainTableName].tc_Rowid (icRowid),
input 'ERR-xyz':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus))
assign oiReturnStatus = -1.
return.
end.

/* ================================================================= */
/* When object not found or in create mode, create it. */
/* ================================================================= */
[METHOD CALL]
run AddDetailLine
(input '[MainTableName]':U (icTable),
input '' (icParentRowid),
output viFcReturnSuper (oiReturnStatus))

/* ================================================================= */
/* Update input to allow correct matching */
/* ================================================================= */
assign t_s[MainTableName].tc_Status = "N":U.
end.
else do:
/* ================================================================= */
/* Update input to allow correct matching */
/* ================================================================= */
assign t_s[MainTableName].tc_Status = "C":U
t[MainTableName].tc_Status = "C":U.
end.

if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

/* insert code for subtables here */

/* keep the UI rowid for usage in error messages (tFcMessages.tcFcRowid) */
[METHOD CALL]
run SetRowidConvert
(input t_s[MainTableName].tc_Rowid (icOldRowid),
input t[MainTableName].tc_Rowid (icNewRowid),
output viFcReturnSuper (oiReturnStatus))

/* ================================================================= */
/* override value for identity fields in input */
/* ================================================================= */
assign t_s[MainTableName].[PrimaryKeyFieldName] = t[MainTableName].[PrimaryKeyFieldName]

/* ================================================================= */
/* Update input to allow correct matching */
/* ================================================================= */
t_s[MainTableName].tc_Rowid = t[MainTableName].tc_Rowid
t_s[MainTableName].tc_ParentRowid = ""

opPrimeKey = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
+ string(t[MainTableName].[PrimaryKeyFieldName]).
end.






If the class dataset contains more than one table, insert this code for every additional table.

/* ================================================================= */
/* Delete existing detail */
/* ================================================================= */
for each t[ChildTableName] where
t[ChildTableName].tc_ParentRowid = t[ParentTableName].tc_Rowid:
assign t[ChildTableName].tc_Status = "D":U.
end.

/* ================================================================= */
/* Update / add detail */
/* ================================================================= */
for each t_s[ChildTableName] where
t_s[ChildTableName].tc_ParentRowid = t_s[ParentTableName].tc_Rowid
on error undo, throw:

find first t[ChildTableName] where
t[ChildTableName].tc_ParentRowid = t[ParentTableName].tc_Rowid and
t[ChildTableName].[LogicalKeyFieldName] = t_s[ChildTableName].[LogicalKeyFieldName] no-error.
if available t[ChildTableName]
then if t[ChildTableName].tc_Status = "D":U
then assign t_s[ChildTableName].tc_Status = "C":U
t[ChildTableName].tc_Status = "C":U.
else do:
[METHOD CALL]
run SetMessage
(input [duplicate key error] (icMessage),
input t_s[ChildTableName].[LogicalKeyFieldName] (icArguments),
input 't[ChildTableName].[LogicalKeyFieldName]':U (icFieldName),
input t_s[ChildTableName].[LogicalKeyFieldName] (icFieldValue),
input 'E':U (icType),
input 3 (iiSeverity),
input t_s[ChildTableName].tc_Rowid (icRowid),
input 'ERR-xyz':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus))
assign oiReturnStatus = -1.
return.
end.
else do:
[METHOD CALL]
run AddDetailLine (input '[ChildTableName]':U (icTable),
input t[ParentTableName].tc_Rowid (icParentRowid),
output viFcReturnSuper (oiReturnStatus))
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
assign t_s[ChildTableName].tc_Status = "N":U
t[ChildTableName].[LogicalKeyFieldName] = t_s[ChildTableName].[LogicalKeyFieldName].
end.

/* keep the UI rowid for usage in error messages (tFcMessages.tcFcRowid) */
[METHOD CALL]
run SetRowidConvert
(input t_s[ChildTableName].tc_Rowid (icOldRowid),
input t[ChildTableName].tc_Rowid (icNewRowid),
output viFcReturnSuper (oiReturnStatus))

/* ================================================================= */
/* override value for identity fields in input */
/* ================================================================= */
assign t_s[ChildTableName].[ChildPrimaryKeyFieldName] = t[ChildTableName].[ChildPrimaryKeyFieldName]

/* ================================================================= */
/* Update input to allow correct matching */
/* ================================================================= */
t_s[ChildTableName].[ParentPrimaryKeyFieldName] = t[ChildTableName].[ParentPrimaryKeyFieldName]
t_s[ChildTableName].tc_Rowid = t[ChildTableName].tc_Rowid
t_s[ChildTableName].tc_ParentRowid = t[ParentTableName].tc_Rowid.
end.

PreCondition

The code of this method must always be overridden, not extended.


Parameters


opPrimeKeyoutputlongcharPrimary Key field value of loaded record(s).
Keys are chr(4) separated.
Key fields are chr(2) separated.
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program2/btaxregister.p)

assign oiReturnStatus = -98
       viLocalReturnStatus = 0.

<Q-10 run JournalPrim  (Start) in BJournal >   
<Q-11 run CompanyPrim  (Start) in BCompany >

PROCESSBLOCK:
for each t_sTaxReg:
    assign t_sTaxReg.Domain_ID = viDomainID.

    /* ================================================================= */
    /* Lookup object by logical key                                      */
    /* When in create mode, skip lookup.                                 */
    /* ================================================================= */
    if vcActivityCode <> "Create":U
    then do:   
        /* ================ */
        /* Load TaxReg  */
        /* ================ */
        assign vcFreeform = "for each TaxReg where TaxReg.TaxRegCode = '":U + t_sTaxReg.TaxRegCode + "'":U
                          + " and TaxReg.Domain_ID = " + string(t_sTaxReg.Domain_ID).
        <M-4 run DataLoad
           (input  '':U (icRowids), 
            input  '':U (icPkeys), 
            input  '':U (icObjectIds), 
            input  vcFreeform (icFreeform), 
            input  true (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BTaxRegister>                   

        if viFcReturnSuper >= 0
        then find first tTaxReg where 
                        tTaxReg.TaxRegCode = t_sTaxReg.TaxRegCode and
                        tTaxReg.Domain_ID  = viDomainID
                        no-error.                       
     end. /* if vcActivityCode <> "Create":U */                            
            
    /* ================================================================= */
    /* When in delete mode, ignore input data.                           */
    /* When object not found, do not return an error.                    */
    /* ================================================================= */
    if vcActivityCode = "Delete":U
    then do:
        if viFcReturnSuper = -4
        then delete t_sTaxReg.
        else do:
            if viFcReturnSuper <> 0
            then viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCK.
    
            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
            assign t_sTaxReg.tc_Rowid  = tTaxReg.tc_Rowid
                   t_sTaxReg.tc_ParentRowid = ""
                   opPrimeKey   = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                + string(tTaxReg.TaxReg_ID).
        end.
        next.
    end. /* vcActivityCode = "Delete":U */

    if vcActivityCode = "Create":U
    or viFcReturnSuper = -4
    then do:
        /* ================================================================= */
        /* When object not found and in modify only mode, return an error.   */
        /* ================================================================= */
        if vcActivityCode = "Modify":U
        then do:
            assign
                vcMessage = trim(#T-1'Object with key $1 does not exist.':100(48021)T-1#).
                <M-3 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  t_sTaxReg.TaxRegCode (icArguments), 
                    input  'tTaxReg.TaxRegCode':U (icFieldName), 
                    input  t_sTaxReg.TaxRegCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sTaxReg.tc_Rowid (icRowid), 
                    input  'QadFin-9466':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BTaxRegister>
            assign viLocalReturnStatus = -1.
            leave PROCESSBLOCK.
        end. /* if vcActivityCode = "Modify":U */

        /* ================================================================= */
        /* When object not found or in create mode, create it.               */
        /* ================================================================= */
        <M-2 run AddDetailLine
           (input  'TaxReg':U (icTable), 
            input  '' (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BTaxRegister>

        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
        assign t_sTaxReg.tc_Status = "N":U.
    end. /* if vcActivityCode = "Create":U */
    else do:
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
        assign t_sTaxReg.tc_Status = "C":U.
    end.

    if viFcReturnSuper <> 0
    then viLocalReturnStatus = viFcReturnSuper.
    if viFcReturnSuper < 0
    then leave PROCESSBLOCK.

    assign t_sTaxReg.TaxReg_ID = tTaxReg.TaxReg_ID.

    /* insert code for sub-tables here: tTaxRegJournal and tTaxRegCompany */
    /* ================================================================= */
    /* Delete existing detail                                            */
    /* ================================================================= */
    for each tTaxRegJournal where
             tTaxRegJournal.tc_ParentRowid = tTaxReg.tc_Rowid:
        assign tTaxRegJournal.tc_Status = "D":U.
    end.
    for each tTaxRegCompany where
             tTaxRegCompany.tc_ParentRowid = tTaxReg.tc_Rowid:
        assign tTaxRegCompany.tc_Status = "D":U.    
    end.
    
    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    for each t_sTaxRegJournal where
             t_sTaxRegJournal.tc_ParentRowid = t_sTaxReg.tc_Rowid and
             t_sTaxRegJournal.tc_Status     <> "D":U:
    
        assign t_sTaxRegJournal.TaxReg_ID = t_sTaxReg.TaxReg_ID.

        /* ============================================== */
        /* Get the TaxRegJournal_ID based on the logical key */
        /* ============================================== */
        if (t_sTaxRegJournal.Journal_ID  = ?    or
            t_sTaxRegJournal.Journal_ID  = 0)   and
            t_sTaxRegJournal.tcJournalCode <> ?  and
            t_sTaxRegJournal.tcJournalCode <> ""
        then do:
            <Q-5 run JournalPrim (all) (Read) (NoCache)
               (input viCompanyId, (CompanyId)
                input t_sTaxRegJournal.tcJournalCode, (JournalCode)
                input ?, (JournalID)
                output dataset tqJournalPrim) in BJournal >   
            find tqJournalPrim where 
                 tqJournalPrim.tcJournalCode = t_sTaxRegJournal.tcJournalCode
                 no-lock no-error.
            if available tqJournalPrim
            then assign t_sTaxRegJournal.Journal_ID = tqJournalPrim.tiJournal_ID.
        end. /* if (t_sTaxRegJournal.Journal_ID  = ? */

        find first tTaxRegJournal where tTaxRegJournal.tc_ParentRowid = tTaxReg.tc_Rowid 
                                    and tTaxRegJournal.TaxReg_ID      = t_sTaxRegJournal.TaxReg_ID
                                    and tTaxRegJournal.Journal_ID     = t_sTaxRegJournal.Journal_ID
                                    no-error.
        if available tTaxRegJournal 
        then assign t_sTaxRegJournal.tc_Status = "C":U.
        else do:
            <M-7 run AddDetailLine
               (input  'TaxRegJournal':U (icTable), 
                input  tTaxReg.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BTaxRegister>
            if viFcReturnSuper <> 0
            then viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCK.
            assign t_sTaxRegJournal.tc_Status = "N":U.
        end.
    
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign t_sTaxRegJournal.TaxRegJournal_ID = tTaxRegJournal.TaxRegJournal_ID
    
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
               t_sTaxRegJournal.TaxReg_ID  = tTaxRegJournal.TaxReg_ID
               t_sTaxRegJournal.tc_Rowid   = tTaxRegJournal.tc_Rowid
               t_sTaxRegJournal.tc_ParentRowid = tTaxReg.tc_Rowid.
    end. /* for each t_sTaxRegJournal */
    
    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    for each t_sTaxRegCompany where
             t_sTaxRegCompany.tc_ParentRowid = t_sTaxReg.tc_Rowid and
             t_sTaxRegCompany.tc_Status     <> "D":U:
    
        assign t_sTaxRegCompany.TaxReg_ID = t_sTaxReg.TaxReg_ID.

        /* ============================================== */
        /* Get the Company_ID based on the logical key */
        /* ============================================== */
        if (t_sTaxRegCompany.Company_ID  = ?    or
            t_sTaxRegCompany.Company_ID  = 0)   and
            t_sTaxRegCompany.tcCompanyCode <> ?  and
            t_sTaxRegCompany.tcCompanyCode <> ""
        then do:
            <Q-8 run CompanyPrim (all) (Read) (NoCache)
               (input ?, (LookupCompanyId)
                input t_sTaxRegCompany.tcCompanyCode, (CompanyCode)
                output dataset tqCompanyPrim) in BCompany >
            find tqCompanyPrim where 
                 tqCompanyPrim.tcCompanyCode = t_sTaxRegCompany.tcCompanyCode
                 no-lock no-error.
            if available tqCompanyPrim 
            then assign t_sTaxRegCompany.Company_ID = tqCompanyPrim.tiCompany_ID.
        end. /* if (t_sTaxRegCompany.Company_ID  = ? */

        find first tTaxRegCompany where tTaxRegCompany.tc_ParentRowid = tTaxReg.tc_Rowid 
                                    and tTaxRegCompany.TaxReg_ID      = t_sTaxRegCompany.TaxReg_ID
                                    and tTaxRegCompany.Company_ID     = t_sTaxRegCompany.Company_ID
                                    no-error.
        if available tTaxRegCompany 
        then assign t_sTaxRegCompany.tc_Status = "C":U.
        else do:
            <M-9 run AddDetailLine
               (input  'TaxRegCompany':U (icTable), 
                input  tTaxReg.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BTaxRegister>
            if viFcReturnSuper <> 0
            then viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCK.
            assign t_sTaxRegCompany.tc_Status = "N":U.
        end.
    
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign t_sTaxRegCompany.TaxRegCompany_ID = tTaxRegCompany.TaxRegCompany_ID
    
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
               t_sTaxRegCompany.TaxReg_ID  = tTaxRegCompany.TaxReg_ID
               t_sTaxRegCompany.tc_Rowid   = tTaxRegCompany.tc_Rowid
               t_sTaxRegCompany.tc_ParentRowid = tTaxReg.tc_Rowid.
    end. /* for each t_sTaxRegCompany */
                                                        
    <I-72 {UpdateTransString
         &TABLE = "TaxReg"}>
         
    /* ================================================================= */
    /* override value for identity fields in input                       */
    /* ================================================================= */
     
    assign t_sTaxReg.TaxReg_ID = tTaxReg.TaxReg_ID
           t_sTaxReg.Domain_ID  = tTaxReg.Domain_ID

    /* ================================================================= */
    /* Update input to allow correct matching                            */
    /* ================================================================= */
           t_sTaxReg.tc_Rowid  = tTaxReg.tc_Rowid
           t_sTaxReg.tc_ParentRowid = ""

           opPrimeKey       = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                            + string(tTaxReg.TaxReg_ID).
end. /* PROCESSBLOCK: */

<Q-12 run JournalPrim  (Stop) in BJournal >   
<Q-13 run CompanyPrim  (Stop) in BCompany >

assign oiReturnStatus = viLocalReturnStatus.