project QadFinancials > class BDebtor > 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/bdebtor.p)

MAIN_BLOCK:
do on error undo, leave MAIN_BLOCK:
        
    assign viLocalReturnStatus = 0
           oiReturnStatus      = -98.

    /* ==================================================================== *
     * To optimalize performance, keep the instances as open as possible    *
     * In case of API execution where the DataSave is done in the same run  *
     * instances can be kept open even after Additional Updates             *
     * ==================================================================== */
    assign vlIsKeepInstOpenBDebtor = true.  

    /* ====================================== */
    /* Fill SharedSetID for excel integration */
    /* ====================================== */

    assign viSharedSetID = 0.
    if vcActivityCode <> "Create":U
    then do:
    /*SharedSet_ID linked to the current company (viCompanyId)*/
        assign vcSharedSetType = {&SHAREDSETTYPECODE-DEBTOR}.
        <Q-14 run LookupSharedSetForCompany (all) (Read) (NoCache)
           (input viCompanyId, (CompanyId)
            input vcSharedSetType, (SharedSetType)
            output dataset tqSharedSetForCompany) in BCompany >   
        find first tqSharedSetForCompany no-error.
        if available tqSharedSetForCompany
        then assign viSharedSetID = tqSharedSetForCompany.tiSharedSet_ID.
    end.
    
    for each t_sDebtor
        break by t_sDebtor.DebtorCode:

        assign t_sDebtor.SharedSet_ID = viSharedSetID.

        /* ================================================================= */
        /* Lookup object by logical key                                      */
        /* When in create mode, skip lookup.                                 */
        /* ================================================================= */
        if vcActivityCode <> "Create":U and vcActivityCode <> "CreateNoMfgUpdate":U
        then do: 
             assign vcFreeform = "for each Debtor where Debtor.DebtorCode = '":U + t_sDebtor.DebtorCode + "'":U
                        + " and Debtor.SharedSet_ID = " + string(t_sDebtor.SharedSet_ID).
             <M-15 run DataLoad
                (input  '':U (icRowids), 
                 input  '':U (icPkeys), 
                 input  '':U (icObjectIds), 
                 input  vcFreeform (icFreeform), 
                 input  yes (ilKeepPrevious), 
                 output viFcReturnSuper (oiReturnStatus)) in BDebtor>        
            if viFcReturnSuper >= 0
            then do:
                find first tDebtor where 
                           tDebtor.DebtorCode   = t_sDebtor.DebtorCode and 
                           tDebtor.SharedSet_ID = t_sDebtor.SharedSet_ID 
                           no-error.
                if available tDebtor and tDebtor.tc_Status <> "":U
                then do:
                    assign vcMessage      = trim(#T-63'This customer was already processed in this transaction.':255(864645554)T-63#) + chr(10) + 
                                            substitute(#T-75'Customer Code: &1':255(259600469)T-75#, trim(t_sDebtor.DebtorCode))      + chr(10) +
                                            substitute(#T-37'Shared Set ID: &1':255(95411682)T-37#,  trim(string(t_sDebtor.SharedSet_ID)))
                           oiReturnStatus = -1.
                    <M-74 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDebtor.DebtorCode':U (icFieldName), 
                        input  t_sDebtor.DebtorCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  t_sDebtor.tc_Rowid (icRowid), 
                        input  'QadFin-541428':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BDebtor>
                    return.
                end. /* if available tDebtor and tDebtor.tc_Status <> "":U */
            end. /* if viFcReturnSuper >= 0 */
        end. /* if vcActivityCode <> "Create":U and vcActivityCode <> "CreateNoMfgUpdate":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_sDebtor.
            else do:
                if viFcReturnSuper <> 0 then viLocalReturnStatus = viFcReturnSuper.
                if viLocalReturnStatus < 0 then leave MAIN_BLOCK.
                
                <M-85 run SetRowidConvert
                   (input  t_sDebtor.tc_Rowid (icOldRowid), 
                    input  tDebtor.tc_Rowid (icNewRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BDebtor>
                
                /* ================================================================= */
                /* Update input to allow correct matching                            */
                /* ================================================================= */
                assign t_sDebtor.tc_Rowid  = tDebtor.tc_Rowid
                       t_sDebtor.tc_ParentRowid = ""
                       opPrimeKey   = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                    + string(tDebtor.Debtor_ID).
            end.
            next.
        end.
    
        if vcActivityCode = "Create":U OR vcActivityCode = "CreateNoMfgUpdate":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_sDebtor.DebtorCode (icArguments), 
                    input  'tDebtor.DebtorCode':U (icFieldName), 
                    input  t_sDebtor.DebtorCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sDebtor.tc_Rowid (icRowid), 
                    input  'QadFin-5207':U (icFcMsgNumber), 
                    input  '' (icFcExplanation), 
                    input  '' (icFcIdentification), 
                    input  '' (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BDebtor>
                
                assign viLocalReturnStatus = -1.
                leave MAIN_BLOCK.
            end.
    
            /* ================================================================= */
            /* When object not found or in create mode, create it.               */
            /* ================================================================= */        
            <M-4 run AddDetailLine
               (input  'Debtor':U (icTable), 
                input  '' (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BDebtor>        
            if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturnStatus = 0 then assign viLocalReturnStatus = viFcReturnSuper.
            if viLocalReturnStatus < 0 then leave MAIN_BLOCK.
            
            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
            assign t_sDebtor.tc_Status = "N":U
                   tDebtor.tc_Status   = "N":U. /* we need to assign this tomake are test for doubles work */
        end.
        else if available tDebtor
        then do:
            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
            assign t_sDebtor.tc_Status = "C":U
                   tDebtor.tc_Status   = "C":U. /* we need to assign this tomake are test for doubles work */
        end.
    
        assign t_sDebtor.Debtor_ID = tDebtor.Debtor_ID.
    
        /* insert code for subtables here: DebtorSafDefault */
        /* ================================================================= */
        /* Delete existing detail                                            */
        /* ================================================================= */
        for each tDebtorSafDefault where
                 tDebtorSafDefault.tc_ParentRowid = tDebtor.tc_Rowid:
            assign tDebtorSafDefault.tc_Status = "D":U.
        end.
    
        /* ================================================================= */
        /* Update / add detail                                               */
        /* ================================================================= */
        for each t_sDebtorSafDefault where
                 t_sDebtorSafDefault.tc_ParentRowid = t_sDebtor.tc_Rowid:
    
            assign t_sDebtorSafDefault.Debtor_ID = t_sDebtor.Debtor_ID.
    
            /* ============================================ */
            /* Get the SafConcept_ID based on the logical key   */
            /* ============================================ */       
            if ( t_sDebtorSafDefault.SafConcept_ID = ?    or
                 t_sDebtorSafDefault.SafConcept_ID = 0)   and
                 t_sDebtorSafDefault.tcSafConceptCode <> "" and
                 t_sDebtorSafDefault.tcSafConceptCode <> ?
            then do:
                <Q-11 run SafConceptPrim (all) (Read) (NoCache)
                   (input ?, (SafConceptID)
                    input t_sDebtorSafDefault.tcSafConceptCode, (SafConceptCode)
                    output dataset tqSafConceptPrim) in BSafConcept >
                find tqSafConceptPrim where 
                     tqSafConceptPrim.tcSafConceptCode = t_sDebtorSafDefault.tcSafConceptCode            
                     no-lock no-error.
                if available tqSafConceptPrim
                then assign  t_sDebtorSafDefault.SafConcept_ID = tqSafConceptPrim.tiSafConcept_ID.
            end. /* if t_sDebtorSafDefault_ID = ? or */
    
            find first tDebtorSafDefault 
                 where tDebtorSafDefault.tc_ParentRowid = tDebtor.tc_Rowid 
                   and tDebtorSafDefault.Debtor_ID      = t_sDebtorSafDefault.Debtor_ID
                   and tDebtorSafDefault.SafConcept_ID  = t_sDebtorSafDefault.SafConcept_ID
                no-error.
            if available tDebtorSafDefault
            then assign t_sDebtorSafDefault.tc_Status = "C":U.
            else do:
                <M-5 run AddDetailLine
                   (input  'DebtorSafDefault':U (icTable), 
                    input  tDebtor.tc_Rowid (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BDebtor>
                if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturnStatus = 0 then assign viLocalReturnStatus = viFcReturnSuper.
                if viLocalReturnStatus < 0 then leave MAIN_BLOCK.
                
                assign t_sDebtorSafDefault.tc_Status = "N":U.
            end.
            
            <M-65 run SetRowidConvert
               (input  t_sDebtorSafDefault.tc_Rowid (icOldRowid), 
                input  tDebtorSafDefault.tc_Rowid (icNewRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BDebtor>
            
            /* ================================================================= */
            /* override value for identity fields in input                       */
            /* ================================================================= */
            assign t_sDebtorSafDefault.DebtorSafDefault_ID = tDebtorSafDefault.DebtorSafDefault_ID
    
                   /* ================================================================= */
                   /* Update input to allow correct matching                            */
                   /* ================================================================= */
                   t_sDebtorSafDefault.Debtor_ID      = tDebtorSafDefault.Debtor_ID
                   t_sDebtorSafDefault.tc_Rowid       = tDebtorSafDefault.tc_Rowid
                   t_sDebtorSafDefault.tc_ParentRowid = tDebtor.tc_Rowid.
        end.  /* for each t_sDebtorSafDefault */
        
        <M-8 run SetRowidConvert
           (input  t_sDebtor.tc_Rowid (icOldRowid), 
            input  tDebtor.tc_Rowid (icNewRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BDebtor>
        
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */        
            
        assign t_sDebtor.Debtor_ID      = tDebtor.Debtor_ID
               t_sDebtor.SharedSet_ID   = tDebtor.SharedSet_ID
    
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
               t_sDebtor.tc_Rowid  = tDebtor.tc_Rowid
               t_sDebtor.tc_ParentRowid = ""
    
               opPrimeKey       = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                + string(tDebtor.Debtor_ID).

        if t_sDebtor.TxzTaxZone = "":U or
           t_sDebtor.TxzTaxZone = ?
        then do:
            <Q-87 run AddressByBusinessRelationType (all) (Read) (NoCache)
               (input t_sDebtor.tcBusinessRelationCode, (BusinessRelationCode)
                input {&ADDRESSTYPECODESYSTEM-HEADOFFICE}, (AddressTypeCode)
                output dataset tqAddressByBusinessRelationType) in BBusinessRelation>

            find first tqAddressByBusinessRelationType where
                       tqAddressByBusinessRelationType.tcBusinessRelationCode = t_sDebtor.tcBusinessRelationCode and
                       tqAddressByBusinessRelationType.tcAddressTypeCode      = {&ADDRESSTYPECODESYSTEM-HEADOFFICE}
            no-error.
            if available tqAddressByBusinessRelationType
            then assign t_sDebtor.TxzTaxZone = tqAddressByBusinessRelationType.tcTxzTaxZone.

        end. /*if t_sDebtor.TxzTaxZone = "":U or*/ 
    end. /* for each t_sCreditor */
end. /* of MAIN_BLOCK */

if viLocalReturnStatus < 0
then do:
    <M-44 run StopExternalInstances  (output viFcReturnSuper (oiReturnStatus)) in BDebtor>
end.

/* Error handling */
assign oiReturnStatus = viLocalReturnStatus.