project BLF > class BStoredSearch > 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/bstoredsearch.p)

define buffer bsSSearchFilterField for t_sSSearchFilterField.
if oiReturnStatus = 0
then oiReturnStatus = -98.

for each t_sStoredSearch on error undo, return:

    /* ================================================================= */
    /* Ignore usrID in input, all received stored searches will be       */
    /* saved as shared. Lookup stored search by reference + name.        */
    /* When in create mode, skip lookup.                                 */
    /* ================================================================= */
    if vcActivityCode <> "Create":U
    then do:
        vcFreeform = "for each StoredSearch where StoredSearch.Usr_ID = 0":U
                   + " and StoredSearch.StoredSearchName = '":U + t_sStoredSearch.StoredSearchName + "'":U
                   + " and StoredSearch.StoredSearchLookupRef = '":U + t_sStoredSearch.StoredSearchLookupRef + "'":U.
        <M-8 run DataLoad (input  '' (icRowids), 
                   input  '' (icPkeys), 
                   input  '' (icObjectIds), 
                   input  vcFreeform (icFreeform), 
                   input  yes (ilKeepPrevious), 
                   output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
        if viFcReturnSuper >= 0
        then find first tStoredSearch where 
                        tStoredSearch.Usr_ID = 0 and
                        tStoredSearch.StoredSearchName = t_sStoredSearch.StoredSearchName and
                        tStoredSearch.StoredSearchLookupRef = t_sStoredSearch.StoredSearchLookupRef no-error.
    end.

    /* ================================================================= */
    /* When in delete mode, ignore input data.                           */
    /* When stored search not found, do not return an error.             */
    /* ================================================================= */
    if vcActivityCode = "Delete":U
    then do:
        if viFcReturnSuper = -4
        then delete t_sStoredSearch.
        else do:
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then return.
    
            /* ================================================================= */
            /* Update input to allow correct matching                            */
            /* ================================================================= */
            assign t_sStoredSearch.tc_Rowid  = tStoredSearch.tc_Rowid
                   t_sStoredSearch.tc_ParentRowid = ""
                   opPrimeKey   = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                + string(tStoredSearch.StoredSearch_ID).
        end.

        next.
    end.

    if vcActivityCode = "Create":U
    or viFcReturnSuper = -4
    then do:
        /* ====================================================================== */
        /* When stored search not found and in modify only mode, return an error. */
        /* ====================================================================== */
        if vcActivityCode = "Modify":U
        then do:
            <M-9 run SetMessage (input  #T-1'Stored search with name $1 and reference $2 does not exist.':100(6802)T-1# (icMessage), 
                     input  t_sStoredSearch.StoredSearchName + chr(2) + t_sStoredSearch.StoredSearchLookupRef (icArguments), 
                     input  'tStoredSearch.StoredSearchName':U (icFieldName), 
                     input  t_sStoredSearch.StoredSearchName (icFieldValue), 
                     input  'E':U (icType), 
                     input  3 (iiSeverity), 
                     input  t_sStoredSearch.tc_Rowid (icRowid), 
                     input  'BLF-215':U (icFcMsgNumber), 
                     input  '' (icFcExplanation), 
                     input  '' (icFcIdentification), 
                     input  '' (icFcContext), 
                     output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
            assign oiReturnStatus = -1.
            return.
        end.

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

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

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

    /* ================================================================= */
    /* Update filter items : delete existing items                       */
    /* ================================================================= */
    for each tSSearchFilterField where
             tSSearchFilterField.tc_ParentRowid = tStoredSearch.tc_Rowid:
        assign tSSearchFilterField.tc_Status = "D":U.
    end.

    /* ================================================================= */
    /* Update filter items : add new items                               */
    /* ================================================================= */
    assign viFFCount = 0.
    for each t_sSSearchFilterField where
             t_sSSearchFilterField.tc_ParentRowid = t_sStoredSearch.tc_Rowid 
             break by t_sSSearchFilterField.SSearchFilterFieldBusField on error undo, return:

        assign viFFCount = viFFCount + 1.
        if last-of (t_sSSearchFilterField.SSearchFilterFieldBusField)
        then do:
            if viFFCount = 1
            then do:
                /* ================================================================= */
                /* When only one found, then it can be re-used, and tc_status is     */
                /* put on "C"                                                        */
                /* ================================================================= */
                find first tSSearchFilterField where
                           tSSearchFilterField.tc_ParentRowid = tStoredSearch.tc_Rowid and
                           tSSearchFilterField.SSearchFilterFieldBusField  = t_sSSearchFilterField.SSearchFilterFieldBusField no-error.
                if available tSSearchFilterField
                then assign t_sSSearchFilterField.tc_Status = "C":U.
                else do:
                    <M-5 run AddDetailLine (input  'SSearchFilterField':U (icTable), 
                                input  tStoredSearch.tc_Rowid (icParentRowid), 
                                output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
                    if viFcReturnSuper <> 0
                    then oiReturnStatus = viFcReturnSuper.
                    if viFcReturnSuper < 0
                    then return.
                    assign t_sSSearchFilterField.tc_Status = "N":U.
                end.
        
                assign t_sSSearchFilterField.SSearchFilterField_ID = tSSearchFilterField.SSearchFilterField_ID
                       t_sSSearchFilterField.StoredSearch_ID       = tStoredSearch.StoredSearch_ID
                       t_sSSearchFilterField.tc_Rowid              = tSSearchFilterField.tc_Rowid
                       t_sSSearchFilterField.tc_ParentRowid        = tStoredSearch.tc_Rowid.
            end.
            else do:
                for each bsSSearchFilterField where
                         bsSSearchFilterField.SSearchFilterFieldBusField = t_sSSearchFilterField.SSearchFilterFieldBusField :
                    <M-10 run AddDetailLine (input  'SSearchFilterField':U (icTable), 
                                input  tStoredSearch.tc_Rowid (icParentRowid), 
                                output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
                    if viFcReturnSuper <> 0
                    then oiReturnStatus = viFcReturnSuper.
                    if viFcReturnSuper < 0
                    then return.
                    assign bsSSearchFilterField.tc_Status = "N":U
                           bsSSearchFilterField.SSearchFilterField_ID = tSSearchFilterField.SSearchFilterField_ID
                           bsSSearchFilterField.StoredSearch_ID       = tStoredSearch.StoredSearch_ID
                           bsSSearchFilterField.tc_Rowid              = tSSearchFilterField.tc_Rowid
                           bsSSearchFilterField.tc_ParentRowid        = tStoredSearch.tc_Rowid.
                end.
            end.
            assign viFFCount = 0.
        end.
    end.

    /* ================================================================= */
    /* Update Result items : delete existing items                       */
    /* ================================================================= */
    for each tSSearchResultField where
             tSSearchResultField.tc_ParentRowid = tStoredSearch.tc_Rowid:
        assign tSSearchResultField.tc_Status = "D":U.
    end.

    /* ================================================================= */
    /* Update Result items : add new items                               */
    /* ================================================================= */
    for each t_sSSearchResultField where
             t_sSSearchResultField.tc_ParentRowid = t_sStoredSearch.tc_Rowid on error undo, return:

        find first tSSearchResultField where
                   tSSearchResultField.tc_ParentRowid = tStoredSearch.tc_Rowid and
                   tSSearchResultField.SSearchResultFieldBusField  = t_sSSearchResultField.SSearchResultFieldBusField no-error.
        if available tSSearchResultField
        then assign t_sSSearchResultField.tc_Status = "C":U.
        else do:
            <M-6 run AddDetailLine (input  'SSearchResultField':U (icTable), 
                        input  tStoredSearch.tc_Rowid (icParentRowid), 
                        output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
            if viFcReturnSuper <> 0
            then oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then return.
            assign t_sSSearchResultField.tc_Status = "N":U.
        end.

        assign t_sSSearchResultField.SSearchResultField_ID = tSSearchResultField.SSearchResultField_ID
               t_sSSearchResultField.StoredSearch_ID       = tStoredSearch.StoredSearch_ID
               t_sSSearchResultField.tc_ParentRowid        = tStoredSearch.tc_Rowid
               t_sSSearchResultField.tc_Rowid              = tSSearchResultField.tc_Rowid.
    end.

    /* ================================================================= */
    /* override value for identity fields in input                       */
    /* ================================================================= */
    assign t_sStoredSearch.StoredSearch_ID   = tStoredSearch.StoredSearch_ID

    /* ================================================================= */
    /* Update input to allow correct matching                            */
    /* ================================================================= */
           t_sStoredSearch.tc_Rowid          = tStoredSearch.tc_Rowid
           t_sStoredSearch.tc_ParentRowid    = ""
           opPrimeKey       = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                            + string(tStoredSearch.StoredSearch_ID).
end.

if oiReturnStatus = -98
then oiReturnStatus = 0.