project BLF > class BReportVariant > 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/breportvariant.p)

if oiReturnStatus = 0
then oiReturnStatus = -98.

for each t_sRptRequest on error undo, return:

    assign t_sRptRequest.RptRequestType = "V".
    
    if  vcUserLogin = "facdef"
    and  t_sRptRequest.RptRequestName begins "LASTUSED_"
    then assign t_sRptRequest.RptRequestName = {&STOREDSEARCH-FACTORY-DEFAULT}.

    /* ================================================================= */
    /* Lookup variant by name                                            */
    /* ================================================================= */
    if t_sRptRequest.RptRequestName = ""
    or t_sRptRequest.RptRequestName = ?
    then do:
        vcMsg = #T-3'Variant name is mandatory.':255(9193)T-3#.
        <M-4 run SetMessage
          (input  vcMsg (icMessage), 
           input  '' (icArguments), 
           input  'tRptRequest.RptRequestName' (icFieldName), 
           input  '' (icFieldValue), 
           input  'E' (icType), 
           input  3 (iiSeverity), 
           input  t_sRptRequest.tc_Rowid (icRowid), 
           input  'BLF-160':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
        oiReturnStatus = -1.
        return.
    end.
        
    if t_sRptRequest.tcBusActivityCode = ""
    or t_sRptRequest.tcBusActivityCode = ?
    or t_sRptRequest.tcBusComponentCode = ""
    or t_sRptRequest.tcBusComponentCode = ?
    then do:
        <Q-5 run DefaultVariantPrim (all) (Read) (NoCache)
          (input 0, (RequestID)
           input t_sRptRequest.RptRequestName, (RequestName)
           output dataset tqDefaultVariantPrim) in BReportRequestBase >
        find first tqDefaultVariantPrim no-error.
        if available tqDefaultVariantPrim
        then viRQID = tqDefaultVariantPrim.tiRptRequest_ID.
        else viRQID = -1.
    end.
    else do:
        <Q-6 run RptRequestPrim (all) (Read) (NoCache)
          (input 0, (RequestID)
           input t_sRptRequest.RptRequestName, (RequestName)
           input t_sRptRequest.tcBusComponentCode, (ComponentName)
           input t_sRptRequest.tcBusActivityCode, (ReportName)
           input 'V', (RequestType)
           output dataset tqRptRequestPrim) in BReportRequestBase >
        find first tqRptRequestPrim no-error.
        if available tqRptRequestPrim
        then viRQID = tqRptRequestPrim.tiRptRequest_ID.
        else viRQID = -1.
    end.
    
    if viRQID = -1
    then viFcReturnSuper = -4.
    else do:
        <M-7 run DataLoad
           (input  '' (icRowids), 
            input  string(viRQID) (icPkeys), 
            input  '' (icObjectIds), 
            input  '' (icFreeform), 
            input  yes (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
        if viFcReturnSuper >= 0
        then find first tRptRequest where tRptRequest.RptRequest_ID = viRQID.
    end.

    if viFcReturnSuper = -4
    then do:
        /* ================================================================= */
        /* When object not found or in create mode, create it.               */
        /* ================================================================= */
        <M-8 run AddDetailLine
           (input  'RptRequest' (icTable), 
            input  '' (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BReportVariant>

        /* should be available */
        if viFcReturnSuper >= 0  and not available tRptRequest
        then find tRptRequest where tRptRequest.tc_Rowid = vcLastCreatedRowid.
        
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
        assign t_sRptRequest.tc_Status = "N":U.
    end.
    else do:
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
        assign t_sRptRequest.tc_Status = "C":U.
    end.

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

    /* ================================================================= */
    /* Delete existing detail                                            */
    /* ================================================================= */
    for each tRptRequestCBF where
             tRptRequestCBF.tc_ParentRowid = tRptRequest.tc_Rowid:
        assign tRptRequestCBF.tc_Status = "D":U.
    end.
    
    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    for each t_sRptRequestCBF where
             t_sRptRequestCBF.tc_ParentRowid = t_sRptRequest.tc_Rowid:
    
        find first tRptRequestCBF where
                   tRptRequestCBF.tc_ParentRowid = tRptRequest.tc_Rowid and
                   tRptRequestCBF.RptRequestCBF  = t_sRptRequestCBF.RptRequestCBF and
                   tRptRequestCBF.tc_Status      = "D" no-error.
        if available tRptRequestCBF
        then assign t_sRptRequestCBF.tc_Status = "C":U.
        else do:
            <M-9 run AddDetailLine
               (input  'RptRequestCBF' (icTable), 
                input  tRptRequest.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then return.
            /* should be available */
            if not available tRptRequestCBF
            then find tRptRequestCBF where tRptRequestCBF.tc_Rowid = vcLastCreatedRowid.
            assign t_sRptRequestCBF.tc_Status = "N":U.
        end.
    
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign t_sRptRequestCBF.RptRequestCBF_ID = tRptRequestCBF.RptRequestCBF_ID
    
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
               t_sRptRequestCBF.RptRequest_ID = tRptRequestCBF.RptRequest_ID
               t_sRptRequestCBF.tc_Rowid       = tRptRequestCBF.tc_Rowid
               t_sRptRequestCBF.tc_ParentRowid = tRptRequest.tc_Rowid.
    end.

    /* ================================================================= */
    /* Delete existing detail                                            */
    /* ================================================================= */
    for each tRptRequestFilter where
             tRptRequestFilter.tc_ParentRowid = tRptRequest.tc_Rowid:
        assign tRptRequestFilter.tc_Status = "D":U.
    end.
    
    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    for each t_sRptRequestFilter where
             t_sRptRequestFilter.tc_ParentRowid = t_sRptRequest.tc_Rowid:
    
        find first tRptRequestFilter where
                   tRptRequestFilter.tc_ParentRowid = tRptRequest.tc_Rowid and
                   tRptRequestFilter.RptRequestFilterSequence  = t_sRptRequestFilter.RptRequestFilterSequence and
                   tRptRequestFilter.tc_Status = "D" no-error.
        if available tRptRequestFilter
        then assign t_sRptRequestFilter.tc_Status = "C":U.
        else do:
            <M-10 run AddDetailLine
               (input  'RptRequestFilter' (icTable), 
                input  tRptRequest.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then return.
            /* should be available */
            if not available tRptRequestFilter
            then find tRptRequestFilter where tRptRequestFilter.tc_Rowid = vcLastCreatedRowid.
            assign t_sRptRequestFilter.tc_Status = "N":U.
        end.
    
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign t_sRptRequestFilter.RptRequestFilter_ID = tRptRequestFilter.RptRequestFilter_ID
    
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
               t_sRptRequestFilter.RptRequest_ID = tRptRequestFilter.RptRequest_ID
               t_sRptRequestFilter.tc_Rowid       = tRptRequestFilter.tc_Rowid
               t_sRptRequestFilter.tc_ParentRowid = tRptRequest.tc_Rowid.
    end.

    /* ================================================================= */
    /* Delete existing detail                                            */
    /* ================================================================= */
    for each tRptRequestmail where
             tRptRequestmail.tc_ParentRowid = tRptRequest.tc_Rowid:
        assign tRptRequestmail.tc_Status = "D":U.
    end.
    
    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    for each t_sRptRequestmail where
             t_sRptRequestmail.tc_ParentRowid = t_sRptRequest.tc_Rowid:
    
        find first tRptRequestmail where
                   tRptRequestmail.tc_ParentRowid = tRptRequest.tc_Rowid and
                   tRptRequestmail.tcRoleName  = t_sRptRequestmail.tcRoleName and
                   tRptRequestmail.tc_Status = "D" no-error.
        if available tRptRequestmail
        then assign t_sRptRequestmail.tc_Status = "C":U.
        else do:
            <M-11 run AddDetailLine
               (input  'RptRequestMail' (icTable), 
                input  tRptRequest.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then return.
            /* should be available */
            if not available tRptRequestMail
            then find tRptRequestMail where tRptRequestMail.tc_Rowid = vcLastCreatedRowid.
            assign t_sRptRequestmail.tc_Status = "N":U.
        end.
    
        /* ================================================================= */
        /* override value for identity fields in input                       */
        /* ================================================================= */
        assign t_sRptRequestmail.RptRequestMail_ID = tRptRequestmail.RptRequestMail_ID
    
        /* ================================================================= */
        /* Update input to allow correct matching                            */
        /* ================================================================= */
               t_sRptRequestmail.RptRequest_ID = tRptRequestmail.RptRequest_ID
               t_sRptRequestmail.tc_Rowid       = tRptRequestmail.tc_Rowid
               t_sRptRequestmail.tc_ParentRowid = tRptRequest.tc_Rowid.
    end.

    /* ================================================================= */
    /* Update / add detail                                               */
    /* ================================================================= */
    vlOneRecord = yes.
    
    for each t_sRptRequestVariant where
             t_sRptRequestVariant.tc_ParentRowid = t_sRptRequest.tc_Rowid:
    
        if vlOneRecord
        then do:
            vlOneRecord = no.
            
            find first tRptRequestVariant where
                       tRptRequestVariant.tc_ParentRowid = tRptRequest.tc_Rowid no-error.
            if not available tRptRequestVariant
            then do:
                <M-1 run AddDetailLine
                   (input  'RptRequestVariant' (icTable), 
                    input  tRptRequest.tc_Rowid (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
                if viFcReturnSuper <> 0
                then oiReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then return.
                /* should be available */
                if not available tRptRequestVariant
                then find tRptRequestVariant where tRptRequestVariant.tc_Rowid = vcLastCreatedRowid.
            end.
            
            if tRptRequestVariant.tc_Status = "N":U
            then assign t_sRptRequestVariant.tc_Status = "N":U.
            
            /* ================================================================= */
            /* override value for identity fields in input                       */
            /* ================================================================= */
            assign t_sRptRequestVariant.RptRequestVariant_ID = tRptRequestVariant.RptRequestVariant_ID
        
            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
                   t_sRptRequestVariant.RptRequest_ID  = tRptRequest.RptRequest_ID
                   t_sRptRequestVariant.tc_Rowid       = tRptRequestVariant.tc_Rowid
                   t_sRptRequestVariant.tc_ParentRowid = tRptRequest.tc_Rowid.
        end.
        else do:
            <M-2 run SetMessage
          (input  'ambiguous reportvariant.' (icMessage), 
           input  '' (icArguments), 
           input  '' (icFieldName), 
           input  '' (icFieldValue), 
           input  'E' (icType), 
           input  3 (iiSeverity), 
           input  '' (icRowid), 
           input  'BLF-159':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output viFcReturnSuper (oiReturnStatus)) in BReportVariant>
            oiReturnStatus = -1.
            return.
        end.
    end.

    /* ================================================================= */
    /* override value for identity fields in input                       */
    /* ================================================================= */
    assign t_sRptRequest.RptRequest_ID = tRptRequest.RptRequest_ID

    /* ================================================================= */
    /* Update input to allow correct matching                            */
    /* ================================================================= */
           t_sRptRequest.tc_Rowid  = tRptRequest.tc_Rowid
           t_sRptRequest.tc_ParentRowid = ""

           opPrimeKey       = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                            + string(tRptRequest.RptRequest_ID).
end.

if oiReturnStatus = -98
then oiReturnStatus = 0.