project QadFinancials > class BCOAMaskCC > 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/bcoamaskcc.p)

assign viLocalReturn  = 0
       oiReturnStatus = -98.

MAIN_BLOCK:
do on error undo, return:

    if not valid-handle(vhSessionInst)
    then do:
        <I-8 {bFcOpenInstance
             &CLASS           = "Session"}>
        assign vlIsSessionOpenedHere = true.
    end.

    <M-1 run GetIntegerValue
       (input  'SharedSetForCOSTCENTERCOAMASK':U (icName), 
        output viCOAMaskCCSharedSetId (oiValue), 
        output viFcReturnSuper (oiReturnStatus)) in Session>
    if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0)
    then assign viLocalReturn = viFcReturnSuper.

    <M-18 run GetIntegerValue
       (input  'SharedSetForGL':U (icName), 
        output viGLSharedSetID (oiValue), 
        output viFcReturnSuper (oiReturnStatus)) in Session>
    if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0)
    then assign viLocalReturn = viFcReturnSuper.

    <M-19 run GetIntegerValue
       (input  'SharedSetForDIVISION':U (icName), 
        output viDivSharedSetId (oiValue), 
        output viFcReturnSuper (oiReturnStatus)) in Session>
    if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0)
    then assign viLocalReturn = viFcReturnSuper.

    if vlIsSessionOpenedHere
    then do:
        <I-20 {bFcCloseInstance
             &CLASS           = "Session"}>
    end.

    if viFcReturnSuper < 0 or viLocalReturn < 0 then leave MAIN_BLOCK.

    for each t_sCOAMaskCC:

        /* ================================================================= */
        /* Lookup object by logical key                                      */
        /* When in create mode, skip lookup.                                 */
        /* ================================================================= */
        if vcActivityCode <> "Create":U
        then do:

            /* fill SharedSet_id when blank */
            if t_sCOAMaskCC.SharedSet_ID = 0 or
               t_sCOAMaskCC.SharedSet_ID = ?
            then assign t_sCOAMaskCC.SharedSet_ID = viCOAMaskCCSharedSetId.
    
            vcFreeform = "for each COAMaskCC where COAMaskCC.COAMaskCCCode = '":U       +
                                                   t_sCOAMaskCC.COAMaskCCCode           +
                                                   "' and COAMaskCC.SharedSet_ID = '":U +
                                                   string(viCOAMaskCCSharedSetId)       +
                                                   "'":U.
            <M-2 run DataLoad
               (input  '':U (icRowids), 
                input  '':U (icPkeys), 
                input  '':U (icObjectIds), 
                input  vcFreeform (icFreeform), 
                input  true (ilKeepPrevious), 
                output viFcReturnSuper (oiReturnStatus)) in BCOAMaskCC>
            if viFcReturnSuper >= 0
            then find first tCOAMaskCC where 
                            tCOAMaskCC.COAMaskCCCode = t_sCOAMaskCC.COAMaskCCCode 
                            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_sCOAMaskCC.
            else do:
                if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0)
                then assign viLocalReturn = viFcReturnSuper.
                if viFcReturnSuper < 0 then leave MAIN_BLOCK.
        
                /* ================================================================= */
                /* Update input to allow correct matching                            */
                /* ================================================================= */
                assign t_sCOAMaskCC.tc_Rowid  = tCOAMaskCC.tc_Rowid
                       t_sCOAMaskCC.tc_ParentRowid = ""
                       opPrimeKey   = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                    + string(tCOAMaskCC.COAMaskCC_ID).
            end. /* else do */
            next.
        end. /* if 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(substitute(#T-6'Unable to find Cost Center COA Mask with code &1':100(999890704)T-6#, t_sCOAMaskCC.COAMaskCCCode)).
                <M-3 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  t_sCOAMaskCC.COAMaskCCCode (icArguments), 
                    input  't_sCOAMaskCC.COAMaskCCCode':U (icFieldName), 
                    input  tCOAMaskCC.COAMaskCCCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sCOAMaskCC.tc_Rowid (icRowid), 
                    input  'QadFin-9212':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BCOAMaskCC>
                assign oiReturnStatus = -1.
                leave MAIN_BLOCK.
            end. /* if vcActivityCode = "Modify":U */

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

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

        if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0)
        then assign viLocalReturn = viFcReturnSuper.
        if viFcReturnSuper < 0 then leave MAIN_BLOCK.

        assign t_sCOAMaskCC.COAMaskCC_ID = tCOAMaskCC.COAMaskCC_ID.
    
        /* insert code for subtables here */
        /* ================================================================= */
        /* Delete existing detail (only valid in current domain)             */
        /* ================================================================= */
        for each tCOAMaskCCGL where
                 tCOAMaskCCGL.tc_ParentRowid = tCOAMaskCC.tc_Rowid and
                 tCOAMaskCCGL.GLSharedSet_ID = viGLSharedSetID:
            assign tCOAMaskCCGL.tc_Status = "D":U.
        end.
    
        for each tCOAMaskCCDiv where
                 tCOAMaskCCDiv.tc_ParentRowid  = tCOAMaskCC.tc_Rowid and
                 tCOAMaskCCDiv.DivSharedSet_ID = viDivSharedSetID:
            assign tCOAMaskCCDiv.tc_Status = "D":U.
        end.

        /* ================================================================= */
        /* Update / add detail                                               */
        /* ================================================================= */
        for each t_sCOAMaskCCGL where
                 t_sCOAMaskCCGL.tc_ParentRowid =  t_sCOAMaskCC.tc_Rowid and
                 t_sCOAMaskCCGL.tc_Status     <> "D":U:
            
            assign t_sCOAMaskCCGL.COAMaskCC_ID =  t_sCOAMaskCC.COAMaskCC_ID.
    
            find first tCOAMaskCCGL where
                       tCOAMaskCCGL.COAMaskCC_ID     = t_sCOAMaskCCGL.COAMaskCC_ID     and
                       tCOAMaskCCGL.COAMaskCCGLFrom  = t_sCOAMaskCCGL.COAMaskCCGLFrom  and
                       tCOAMaskCCGL.COAMaskCCGLTo    = t_sCOAMaskCCGL.COAMaskCCGLTo    and
                       tCOAMaskCCGL.COAMaskCCGLIsNeg = t_sCOAMaskCCGL.COAMaskCCGLIsNeg and
                       tCOAMaskCCGL.COAMaskCCGLDescr = t_sCOAMaskCCGL.COAMaskCCGLDescr and
                       tCOAMaskCCGL.GLSharedSet_ID   = viGLSharedSetID
                       no-error.
            
            if available tCOAMaskCCGL
            then assign t_sCOAMaskCCGL.tc_Status      = tCOAMaskCC.tc_Status
                        t_sCOAMaskCCGL.COAMaskCCGL_ID = tCOAMaskCCGL.COAMaskCCGL_ID.
            else do:
                <M-5 run AddDetailLine
                   (input  'COAMaskCCGL':U (icTable), 
                    input  tCOAMaskCC.tc_Rowid (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BCOAMaskCC>
                
                if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0) then assign viLocalReturn = viFcReturnSuper.
                if viFcReturnSuper < 0 then leave MAIN_BLOCK.

                assign t_sCOAMaskCCGL.tc_Status = "N":U.
            end.

            /* ================================================================= */
            /* override value for identity fields in input                       */
            /* ================================================================= */
            assign t_sCOAMaskCCGL.COAMaskCCGL_ID = tCOAMaskCCGL.COAMaskCCGL_ID
                   t_sCOAMaskCCGL.COAMaskCC_ID   = tCOAMaskCCGL.COAMaskCC_ID
                   t_sCOAMaskCCGL.GLSharedSet_ID = tCOAMaskCCGL.GLSharedSet_ID
                   t_sCOAMaskCCGL.tc_Rowid       = tCOAMaskCCGL.tc_Rowid
                   t_sCOAMaskCCGL.tc_ParentRowid = tCOAMaskCC.tc_Rowid.
        end. /* for each t_sCOAMaskCCGL where */

        for each t_sCOAMaskCCDiv where
                 t_sCOAMaskCCDiv.tc_ParentRowid  =  t_sCOAMaskCC.tc_Rowid and
                 t_sCOAMaskCCDiv.tc_Status       <> "D":U:
             
             assign t_sCOAMaskCCDiv.COAMaskCC_ID = t_sCOAMaskCC.COAMaskCC_ID.
    
            find first tCOAMaskCCDiv where
                       tCOAMaskCCDiv.COAMaskCC_ID      = t_sCOAMaskCCDiv.COAMaskCC_ID      and
                       tCOAMaskCCDiv.COAMaskCCDivFrom  = t_sCOAMaskCCDiv.COAMaskCCDivFrom  and
                       tCOAMaskCCDiv.COAMaskCCDivTo    = t_sCOAMaskCCDiv.COAMaskCCDivTo    and
                       tCOAMaskCCDiv.COAMaskCCDivIsNeg = t_sCOAMaskCCDiv.COAMaskCCDivIsNeg and
                       tCOAMaskCCDiv.COAMaskCCDivDescr = t_sCOAMaskCCDiv.COAMaskCCDivDescr and
                       tCOAMaskCCDiv.DivSharedSet_ID   = viDivSharedSetID
                       no-error.
            if available tCOAMaskCCDiv
            then assign t_sCOAMaskCCDiv.tc_Status       = tCOAMaskCC.tc_Status
                        t_sCOAMaskCCDiv.COAMaskCCDiv_ID = tCOAMaskCCDiv.COAMaskCCDiv_ID.
            else do:
                <M-7 run AddDetailLine
                   (input  'COAMaskCCDiv':U (icTable), 
                    input  tCOAMaskCC.tc_Rowid (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BCOAMaskCC>
                if viFcReturnSuper <  0 or (viFcReturnSuper > 0 and viLocalReturn = 0) then assign viLocalReturn = viFcReturnSuper.
                if viFcReturnSuper < 0 then leave MAIN_BLOCK.
                
                assign t_sCOAMaskCCDiv.tc_Status     = "N":U.
            end.
    
            /* ================================================================= */
            /* override value for identity fields in input                       */
            /* ================================================================= */
            assign t_sCOAMaskCCDiv.COAMaskCCDiv_ID = tCOAMaskCCDiv.COAMaskCCDiv_ID
                   t_sCOAMaskCCDiv.COAMaskCC_ID    = tCOAMaskCCDiv.COAMaskCC_ID
                   t_sCOAMaskCCDiv.DivSharedSet_ID = tCOAMaskCCDiv.DivSharedSet_ID
                   t_sCOAMaskCCDiv.tc_Rowid        = tCOAMaskCCDiv.tc_Rowid
                   t_sCOAMaskCCDiv.tc_ParentRowid  = tCOAMaskCC.tc_Rowid.
        end. /* for each t_sCOAMaskCCDiv where */
        
        <I-57 {UpdateTransString
             &TABLE = "COAMaskCC"}>
             
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign t_sCOAMaskCC.COAMaskcc_ID = tCOAMaskCC.COAMaskCC_ID
               t_sCOAMaskCC.SharedSet_ID = tCOAMaskCC.SharedSet_ID
               t_sCOAMaskCC.tc_Rowid     = tCOAMaskCC.tc_Rowid
               opPrimeKey                = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                         + string(tCOAMaskCC.COAMaskCC_ID).
    end. /* for each t_sCOAMaskCC: */   
end. /* MAIN_BLOCK */

/* Error handling */
assign oiReturnStatus = viLocalReturn.