project QadFinancials > class BReportTree > 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/breporttree.p)

do transaction on error undo, throw:

    /*PROCESSBLOCK:*/
    for each t_sFRWTreeNode:   
        vcFreeform = "for each FRWTreeNode where FRWTreeNode.FRWTreeNode_ID = " + string(t_sFRWTreeNode.FRWTreeNode_ID).
        <M-92 run DataLoad
           (input  '' (icRowids), 
            input  '' (icPkeys), 
            input  '' (icObjectIds), 
            input  vcFreeForm (icFreeform), 
            input  true (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BReportTree>

            if viFcReturnSuper >= 0
            then do: 
                find first tFRWTreeNode 
                     where tFRWTreeNode.FRWTreeNode_ID = t_sFRWTreeNode.FRWTreeNode_ID
                     no-error.
                      
                if available tFRWTreeNode
                then do: /* Modify */
                /*
                assign t_sFRWTreeNode.tc_Status = "C":U
                         tFRWTreeNode.tc_Status = "C":U.
                */
                assign t_sFRWTreeNode.FRWTreeNode_ID = tFRWTreeNode.FRWTreeNode_ID.                                             
                end.                 
            end. /* if viFcReturnSuper >= 0 */              
            else do: /* Create */

                if t_sFRWTreeNode.ParentFRWTreeNode_ID = 0 then
                do:
                    <Q-13 run ReportTreeRootNode (all) (Read) (NoCache)
                       (input t_sFRWTreeNode.FRWTreeNodeFRWChartCode, (FRWTreeNodeFRWChartCode)
                        input t_sFRWTreeNode.FRWTreeNodeCode, (FRWTreeNodeCode)
                        output dataset tqReportTreeRootNode) in BReportTree>
                    find first tqReportTreeRootNode no-error.
                    if available tqReportTreeRootNode then
                    do:
                        <M-72 run StartPersistence
                           (output vhFcComponent (ohPersistence), 
                            output viFcReturnSuper (oiReturnStatus)) in BReportTree>
                        if viFcReturnSuper <> 0
                        then do :
                            assign oiReturnStatus = viFcReturnSuper.
                            if oiReturnStatus < 0
                            then return.
                        end.
                        assign vhPersistanceViaFcComponent = vhFcComponent. 
          
                        assign vcForEachClause = "for each FRWTreeView where FRWTreeView.FRWTreeNode_ID = ":U + string(tqReportTreeRootNode.tiFRWTreeNode_ID)
                               vcFieldList = "FRWTreeNode_ID":U
                               vcFieldListDataTypes = "i":U
                               vcValueList = string(t_sFRWTreeNode.FRWTreeNode_ID).                
                        assign vhFcComponent = vhPersistanceViaFcComponent.
                        <M-1 run WriteDirect
                           (input  'FRWTreeView':U (icTableName), 
                            input  vcForEachClause (icPrepare), 
                            input  vcFieldList (icFieldList), 
                            input  vcFieldListDataTypes (icFieldListDataTypes), 
                            input  vcValueList (icAbsolute), 
                            input  '':U (icIncremental), 
                            input  {&TARGETPROCEDURE} (ihClass), 
                            input  vcUserLogin (icUserLogin), 
                            output viFcReturnSuper (oiReturnStatus)) in Progress>

                        assign vcForEachClause = "for each FRWRepMstr where FRWRepMstr.FRWTreeNode_ID = ":U + string(tqReportTreeRootNode.tiFRWTreeNode_ID)
                               vcFieldList = "FRWTreeNode_ID":U
                               vcFieldListDataTypes = "i":U
                               vcValueList = string(t_sFRWTreeNode.FRWTreeNode_ID).                
                        assign vhFcComponent = vhPersistanceViaFcComponent.
                        <M-60 run WriteDirect
                           (input  'FRWRepMstr':U (icTableName), 
                            input  vcForEachClause (icPrepare), 
                            input  vcFieldList (icFieldList), 
                            input  vcFieldListDataTypes (icFieldListDataTypes), 
                            input  vcValueList (icAbsolute), 
                            input  '':U (icIncremental), 
                            input  {&TARGETPROCEDURE} (ihClass), 
                            input  vcUserLogin (icUserLogin), 
                            output viFcReturnSuper (oiReturnStatus)) in Progress>

                        empty temp-table tTreeNodeIdCodeList.
                        create tTreeNodeIdCodeList.
                        assign tTreeNodeIdCodeList.tiFRWTreeNode_ID = tqReportTreeRootNode.tiFRWTreeNode_ID
                               tTreeNodeIdCodeList.tlReportNodeIsInTreeList = no.
                        <M-85 run GetChildNodes
                           (input  tqReportTreeRootNode.tiFRWTreeNode_ID (iiFRWTreeNode_ID), 
                            output viFcReturnSuper (oiReturnStatus)) in BReportTree>

                        for each tTreeNodeIdCodeList:
                            vcFreeForm = "for each FRWTreeNode where FRWTreeNode.FRWTreeNode_ID = " + string(tTreeNodeIdCodeList.tiFRWTreeNode_ID).
                            <M-98 run DataLoad
                               (input  '':U (icRowids), 
                                input  '':U (icPkeys), 
                                input  '':U (icObjectIds), 
                                input  vcFreeform (icFreeform), 
                                input  yes (ilKeepPrevious), 
                                output viFcReturnSuper (oiReturnStatus)) in BReportTree>
                            find first tFRWTreeNode where tFRWTreeNode.FRWTreeNode_ID = tTreeNodeIdCodeList.tiFRWTreeNode_ID no-error.
                            if available tFRWTreeNode then
                                tFRWTreeNode.tc_Status = "D":U.
                        end.                          
                    end. 

                    find first tAnCodeForUpdateTemp no-error.
                    if available tAnCodeForUpdateTemp then
                    do:
                        /* DataSave BFRWAnCode */
                        <I-6 {bFcStartAndOpenInstance
                             &ADD-TO-TRANSACTION   = "yes"
                             &CLASS                = "BFRWAnalysisCode"}>
                    
                         <M-37 run UpdateFRWAnCode
                            (input  tAnCodeForUpdateTemp (tAnCodeforUpdate), 
                             output tFRWAnalysisCodeNew (tFRWAnCodeNew), 
                             input  tTreeNodeIdCodeList (tReportTreeDeleteList), 
                             output viFcReturnSuper (oiReturnStatus)) in BFRWAnalysisCode>
                    
                        if viFcReturnSuper <> 0 then
                            assign oiReturnStatus = viFcReturnSuper.
                        if oiReturnStatus < 0 then
                        do:
                            <I-14 {bFcCloseAndStopInstance
                                 &CLASS           = "BFRWAnalysisCode"}>
                            return.
                        end.
                        else do:
                            <I-50 {bFcCloseInstance
                                 &CLASS           = "BFRWAnalysisCode"}>
                        end.
                    end.
                end.

                <M-97 run AddDetailLine
                   (input  'FRWTreeNode':U (icTable), 
                    input  '' (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BReportTree>
                /*
                assign t_sFRWTreeNode.tc_Status = "N":U
                         tFRWTreeNode.tc_Status = "N":U.
                */

                assign     tFRWTreeNode.FRWTreeNode_ID       = t_sFRWTreeNode.FRWTreeNode_ID
                         t_sFRWTreeNode.Domain_ID = viDomainID.

            end.
            
            assign t_sFRWTreeNode.tc_Rowid = tFRWTreeNode.tc_Rowid
                   t_sFRWTreeNode.tc_ParentRowid = ""
                   opPrimeKey = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                              + string(tFRWTreeNode.FRWTreeNode_ID).
            
            /* Assign FRWChart_ID */
            <Q-70 run GetFRWChartByCode (all) (Read) (NoCache)
               (input t_sFRWTreeNode.FRWTreeNodeFRWChartCode, (ChartCode)
                output dataset tqGetFRWChartByCode) in BCubeQuery>
            find first tqGetFRWChartByCode no-lock no-error.
            if available tqGetFRWChartByCode
            then do:
                assign t_sFRWTreeNode.FRWChart_ID = tqGetFRWChartByCode.tiFRWChart_ID.
            end.
                              
            /* Assign FRWAnCode_ID */
            <Q-5 run GetFRWAnCodeByCodeAndChartId (all) (Read) (NoCache)
               (input t_sFRWTreeNode.FRWTreeNodeCode, (AnCodeCode)
                input t_sFRWTreeNode.FRWChart_ID, (ChartId)
                output dataset tqGetFRWAnCodeByCodeAndChartId) in BCubeQuery>
            find first tqGetFRWAnCodeByCodeAndChartId no-lock no-error. 
            if available tqGetFRWAnCodeByCodeAndChartId
            then do:
                assign t_sFRWTreeNode.FRWAnCode_ID = tqGetFRWAnCodeByCodeAndChartId.tiFRWAnCode_ID.
            end.
            else do:
                find first tFRWAnalysisCodeNew where
                    tFRWAnalysisCodeNew.tiFRWAnChart_ID   = t_sFRWTreeNode.FRWChart_ID and
                    tFRWAnalysisCodeNew.tcAnalysisCode    = t_sFRWTreeNode.FRWTreeNodeCode no-error.
                if available tFRWAnalysisCodeNew
                then do:
                   assign t_sFRWTreeNode.FRWAnCode_ID = tFRWAnalysisCodeNew.tiFRWAn_ID.
                end.
            end.
            
            /* Check Print Text Only */
            <Q-67 run FRWAnCodeById (all) (Read) (NoCache)
               (input t_sFRWTreeNode.FRWAnCode_ID, (FRWAnCode_ID)
                output dataset tqFRWAnCodeById) in BFRWAnalysisCode>
            find first tqFRWAnCodeById no-error.
            if available tqFRWAnCodeById then
            do:
                if tqFRWAnCodeById.tcFRWAnCodeAnalyseType = {&FRWANALYSISTYPE-TEXT} then
                    t_sFRWTreeNode.FRWTreeNodeIsTextOnly = yes.
                else
                    t_sFRWTreeNode.FRWTreeNodeIsTextOnly = no.
           end.
           else do:
                find first tFRWAnalysisCodeNew where
                    tFRWAnalysisCodeNew.tiFRWAn_ID   = t_sFRWTreeNode.FRWAnCode_ID no-error.
                if available tFRWAnalysisCodeNew
                then do:
                    if tFRWAnalysisCodeNew.tcFRWAnCodeAnalysisType = {&FRWANALYSISTYPE-TEXT} then
                        t_sFRWTreeNode.FRWTreeNodeIsTextOnly = yes.
                    else
                        t_sFRWTreeNode.FRWTreeNodeIsTextOnly = no.
                end.
            end.
    end. /* PROCESSBLOCK */
end.