project QadFinancials > class BSafStructure > 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

Important : code of this method must be overridden, not extended.

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.



if oiReturnStatus = 0
then oiReturnStatus = -98.

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

/* ================================================================= */
/* 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.

/* ================================================================= */
/* Update input to allow correct matching */
/* ================================================================= */
assign t_s[MainTableName].tc_Rowid = t[MainTableName].tc_Rowid
t_s[MainTableName].tc_ParentRowid = ""
ocPrimeKey = (if ocPrimeKey = "" then "" else ocPrimeKey + 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 */

/* ================================================================= */
/* 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 = ""

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

if oiReturnStatus = -98
then oiReturnStatus = 0.






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:

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.

/* ================================================================= */
/* 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/bsafstructure.p)

if oiReturnStatus = 0
then oiReturnStatus = -98.

<Q-9 run SafConceptPrim  (Start) in BSafConcept >  

PROCESSBLOCK:
for each t_sSafStructure:

    /* ================================================================= */
    /* Lookup object by logical key                                      */
    /* When in create mode, skip lookup.                                 */
    /* ================================================================= */
    if vcActivityCode <> "Create":U
    then do:
        vcFreeform = "for each SafStructure where SafStructure.SafStructureCode = '":U + t_sSafStructure.SafStructureCode + "'":U.
        <M-3 run DataLoad
           (input  '':U (icRowids), 
            input  '':U (icPkeys), 
            input  '':U (icObjectIds), 
            input  vcFreeform (icFreeform), 
            input  yes (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BSafStructure>
        if viFcReturnSuper >= 0
        then do:
            find first tSafStructure where 
                       tSafStructure.SafStructureCode = t_sSafStructure.SafStructureCode 
                       no-error.
            if available tSafStructure and tSafStructure.tc_Status <> "":U
            then do:
                assign vcMessage      = trim(#T-85'This SAF structure was already processed in this transaction.':255(561371344)T-85#) + chr(10) + 
                                        substitute(#T-23'SAF Structure Code: &1':255(104878325)T-23#, trim(t_sSafStructure.SafStructureCode))     
                       oiReturnStatus = -1.
                <M-63 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  'tSafStructure.SafStructureCode':U (icFieldName), 
                    input  t_sSafStructure.SafStructureCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sSafStructure.tc_Rowid (icRowid), 
                    input  'QadFin-488818':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BSafStructure>
                return.
            end. /* if available tSafStructure and tSafStructure.tc_Status <> "":U */
        end. /* if viFcReturnSuper >= 0 */
    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_sSafStructure.
        else do:
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCK.
    
            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
            assign t_sSafStructure.tc_Rowid  = tSafStructure.tc_Rowid
                   t_sSafStructure.tc_ParentRowid = ""
                   opPrimeKey   = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                + string(tSafStructure.SafStructure_ID).
        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:
            assign
                vcMessage = trim(#T-2'Object with key $1 does not exist.':100(48021)T-2#).
            <M-4 run SetMessage
               (input  vcMessage (icMessage), 
                input  t_sSafStructure.SafStructureCode (icArguments), 
                input  'tSafStructure.SafStructureCode':U (icFieldName), 
                input  t_sSafStructure.SafStructureCode (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  t_sSafStructure.tc_Rowid (icRowid), 
                input  'QadFin-8602':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  '':U (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BSafStructure>
            assign oiReturnStatus = -1.
            leave PROCESSBLOCK.
        end.

        /* ================================================================= */
        /* When object not found or in create mode, create it.               */
        /* ================================================================= */
        <M-5 run AddDetailLine
           (input  'SafStructure':U (icTable), 
            input  '':U (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BSafStructure>
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
        assign t_sSafStructure.tc_Status = "N":U
               tSafStructure.tc_Status   = "N":U. /* we need to assign this tomake are test for doubles work */
    end.
    else do:
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
        assign t_sSafStructure.tc_Status = "C":U
               tSafStructure.tc_Status   = "C":U. /* we need to assign this tomake are test for doubles work */
    end.

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

    assign t_sSafStructure.SafStructure_ID = tSafStructure.SafStructure_ID.

    /* insert code for subtables here */
    /* ================================================================= */
    /* Delete existing detail                                            */
    /* ================================================================= */
    for each tSafStructureLine where
             tSafStructureLine.tc_ParentRowid = tSafStructure.tc_Rowid:
        assign tSafStructureLine.tc_Status = "D":U.
    end.

    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    for each t_sSafStructureLine where
             t_sSafStructureLine.tc_ParentRowid = t_sSafStructure.tc_Rowid and
             t_sSafStructureLine.tc_Status     <> "D":U:
        assign t_sSafStructureLine.SafStructure_ID = t_sSafStructure.SafStructure_ID.

        if (t_sSafStructureLine.SafConcept_ID = 0 or 
            t_sSafStructureLine.SafConcept_ID = ?)       and
            t_sSafStructureLine.tcSafConceptCode <> "":U and
            t_sSafStructureLine.tcSafConceptCode <> ?   
        then do:
            <Q-8 run SafConceptPrim (all) (Read) (NoCache)
               (input ?, (SafConceptID)
                input t_sSafStructureLine.tcSafConceptCode, (SafConceptCode)
                output dataset tqSafConceptPrim) in BSafConcept >                
            find first tqSafConceptPrim no-error.
            if available tqSafConceptPrim
            then assign t_sSafStructureLine.SafConcept_ID = tqSafConceptPrim.tiSafConcept_ID.
        end.

        find first tSafStructureLine where
                   tSafStructureLine.tc_ParentRowid  = tSafStructure.tc_Rowid and                   
                   tSafStructureLine.SafConcept_ID   = t_sSafStructureLine.SafConcept_ID no-error.
        if available tSafStructureLine
        then assign t_sSafStructureLine.tc_Status           = "C":U
                    t_sSafStructureLine.SafStructureLine_ID = tSafStructureLine.SafStructureLine_ID.
        else do:             
            <M-6 run AddDetailLine
               (input  'SafStructureLine':U (icTable), 
                input  tSafStructure.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BSafStructure>
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCK.
            assign t_sSafStructureLine.tc_Status = "N":U.
        end.

        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign 
            t_sSafStructureLine.SafStructureLine_ID = tSafStructureLine.SafStructureLine_ID

            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
            t_sSafStructureLine.SafStructure_ID     = tSafStructureLine.SafStructure_ID
            t_sSafStructureLine.tc_Rowid            = tSafStructureLine.tc_Rowid
            t_sSafStructureLine.tc_ParentRowid      = tSafStructure.tc_Rowid.
    end.
                      
    <I-81 {UpdateTransString
         &TABLE = "SafStructure"}>
         
    /* ================================================================= */
    /* override value for identity fields in input                       */
    /* ================================================================= */
    assign t_sSafStructure.SafStructure_ID = tSafStructure.SafStructure_ID

    /* ================================================================= */
    /* Update input to allow correct matching                            */
    /* ================================================================= */
    t_sSafStructure.tc_Rowid       = tSafStructure.tc_Rowid
    t_sSafStructure.tc_ParentRowid = ""

    opPrimeKey       = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                      + string(tSafStructure.SafStructure_ID).
end.

<Q-10 run SafConceptPrim  (Stop) in BSafConcept >  

if oiReturnStatus = -98
then oiReturnStatus = 0.