project QadFinancials > class BPosting > 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/bposting.p)

/* ================================================================================================================== */
/* Call method that extends the tApi-tables with some defaults to ease the integration                                */
/* Note that this method DataLoadByInput works withe the t_s-tables while the called method works on the tApi-tables  */
/* As such we have to copy the t_s-tables to the tApi-tables before the call and the other ways around after the call */
/* ================================================================================================================== */
if vcActivityCode = "" or 
    vcActivityCode = ?
then assign vcActivityCode = "ExternalCreate".

temp-table tApiPosting:handle:copy-temp-table (temp-table t_sPosting:handle).
temp-table tApiPostingLine:handle:copy-temp-table (temp-table t_sPostingLine:handle).
temp-table tApiPostingSaf:handle:copy-temp-table (temp-table t_sPostingSaf:handle).
temp-table tApiPostingVat:handle:copy-temp-table (temp-table t_sPostingVat:handle).
temp-table tApiPostingVatDelay:handle:copy-temp-table (temp-table t_sPostingVatDelay:handle).

<M-95 run ApiStdMaintainTTInitialDefaulting  (output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

temp-table t_sPosting:handle:copy-temp-table (temp-table tApiPosting:handle).
temp-table t_sPostingLine:handle:copy-temp-table (temp-table tApiPostingLine:handle).
temp-table t_sPostingSaf:handle:copy-temp-table (temp-table tApiPostingSaf:handle).
temp-table t_sPostingVat:handle:copy-temp-table (temp-table tApiPostingVat:handle).
temp-table t_sPostingVatDelay:handle:copy-temp-table (temp-table tApiPostingVatDelay:handle).

/* Exception Handling */
assign oiReturnStatus      = -98
       viLocalReturnStatus = 0.


/* Go through all postings in the input in order of their tc_rowid */
PROCESSBLOCKDATALOADBYINPUT: 
for each t_sPosting :
   
    /* Reset some data-item */
    assign viDataLoadReturnStatus = 0.
                              
    /* When we are not in Create-mode then Load the posting based on its logical key */
    if vcActivityCode <> "Create":U and 
       vcActivityCode <> "ExternalCreate":U
    then do:
        /* fill company_id when blank */
        if t_sPosting.Company_ID = 0 or
           t_sPosting.Company_ID = ?
        then assign t_sPosting.Company_ID = viCompanyId.

        /* Retrieve the Journal_ID to use in the freeform */
        <Q-15 run JournalPrim (all) (Read) (NoCache)
           (input t_sPosting.Company_ID, (CompanyId)
            input t_sPosting.tcJournalCode, (JournalCode)
            input ?, (JournalID)
            output dataset tqJournalPrim) in BJournal >

        find tqJournalPrim where
             tqJournalPrim.tcJournalCode = t_sPosting.tcJournalCode
             no-error.
        if available tqJournalPrim
        then t_sPosting.Journal_ID = tqJournalPrim.tiJournal_ID.
        
        /* Try to Load the posting */
        assign vcFreeform = "for each Posting where Posting.Company_ID = ":U + string(t_sPosting.Company_ID) +
                                " and Posting.PostingYear = ":U + string(t_sPosting.PostingYear) + 
                                " and Posting.Journal_ID = ":U + string(t_sPosting.Journal_ID) + 
                                " and Posting.PostingVoucher = ":U + string(t_sPosting.PostingVoucher).
        <M-17 run DataLoad
           (input  '' (icRowids), 
            input  '' (icPkeys), 
            input  '' (icObjectIds), 
            input  vcFreeform (icFreeform), 
            input  true (ilKeepPrevious), 
            output viDataLoadReturnStatus (oiReturnStatus)) in BPosting>

        /* ============================================================================================================================= */
        /* if the DataLoad returned -4 and the activity is Delete, then just delete the t_sPosting and continue with the next t_sPosting */
        /* if the DataLoad returned -4 and the activity is Modify, then raise an error                                                   */
        /* else, if the DataLoad returned -4 then we do not log this error and we just act as if the acitivity was Create                */
        /* ============================================================================================================================= */
        if viDataLoadReturnStatus = -4 
        then do :
            if vcActivityCode = "Delete":U 
            then do :
                delete t_sPosting.
                next.
            end. /* if vcActivityCode = "Delete":U  */
            else do :
                if vcActivityCode = "Modify":U
                then do:
                    assign vcMessage = trim(#T-38'Unable to find Posting.':255(71306)T-38#)                                                + chr(10) +
                                       trim(substitute(#T-39'Company-ID: &1':255(999890489)T-39#, trim(string(t_sPosting.Company_ID)) ))       + chr(10) + 
                                       trim(substitute(#T-40'Accounting Year: &1':255(71307)T-40#, trim(string(t_sPosting.PostingYear)) )) + chr(10) +
                                       trim(substitute(#T-41'Daybook code: &1':222(31365)T-41#, trim(t_sPosting.tcJournalCode) ))          + chr(10) +
                                       trim(substitute(#T-42'Voucher: &1':200(71308)T-42#, trim(string(t_sPosting.PostingVoucher)) )).
                    if viLocalReturnStatus >= 0
                    then assign viLocalReturnStatus = viFcReturnSuper.
                    <M-37 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  't_sPosting.PostingVoucher':U (icFieldName), 
                        input  t_sPosting.PostingVoucher (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  t_sPosting.tc_Rowid (icRowid), 
                        input  'QadFin-9123':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BPosting>
                    Leave PROCESSBLOCKDATALOADBYINPUT.
                end.  /* if vcActivityCode = Modify */
            end. /* Not if vcActivityCode = "Delete":U  */

        end. /* if viDataLoadReturnStatus = -4 */
        else do :

            if viDataLoadReturnStatus <> 0 and viLocalReturnStatus >= 0
            then assign viLocalReturnStatus = viDataLoadReturnStatus.
            if viDataLoadReturnStatus < 0 
            then Leave PROCESSBLOCKDATALOADBYINPUT.

        end. /* Not if viDataLoadReturnStatus = -4 */

        find first tPosting where 
                   tPosting.Company_ID     = t_sPosting.Company_ID    and
                   tPosting.PostingYear    = t_sPosting.PostingYear   and
                   tPosting.Journal_ID     = t_sPosting.Journal_ID    and
                   tPosting.PostingVoucher = t_sPosting.PostingVoucher
                   no-error.
        if not available tPosting and 
           (vcActivityCode = "Modify":U or 
            vcActivityCode = "Delete":U)
        then do :
            assign vcMessage = trim(#T-44'Unable to find Posting.':255(71306)T-44#)                                                + chr(10) +
                               trim(substitute(#T-45'Company-ID: &1':255(999890489)T-45#, trim(string(t_sPosting.Company_ID)) ))       + chr(10) + 
                               trim(substitute(#T-46'Accounting Year: &1':255(71307)T-46#, trim(string(t_sPosting.PostingYear)) )) + chr(10) +
                               trim(substitute(#T-47'Daybook code: &1':222(31365)T-47#, trim(t_sPosting.tcJournalCode) ))          + chr(10) +
                               trim(substitute(#T-48'Voucher: &1':200(71308)T-48#, trim(string(t_sPosting.PostingVoucher)) )).
            if viLocalReturnStatus >= 0
            then assign viLocalReturnStatus = viFcReturnSuper.
            <M-43 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  't_sPosting.PostingVoucher':U (icFieldName), 
                input  t_sPosting.PostingVoucher (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  t_sPosting.tc_Rowid (icRowid), 
                input  'QadFin-9124':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  '':U (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BPosting>
            leave PROCESSBLOCKDATALOADBYINPUT. 
        end. /* if not available tPosting */                                      
    end. /* if vcActivityCode <> "Create":U and */
    
    /* ==================================================================================== */
    /* When in delete mode:                                                                 */
    /* - If dataload returned  -4 then just delete the t_sPosting record (handled before)   */
    /* - If dataload returned no error then just mark it as deleted                         */
    /* In all cases of delete: go the next t_sPosting after this block                      */
    /* ==================================================================================== */
    if vcActivityCode = "Delete":U
    then do:
        <M-50 run SetRowidConvert
           (input  t_sPosting.tc_Rowid (icOldRowid), 
            input  tPosting.tc_Rowid (icNewRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

        assign t_sPosting.tc_Rowid       = tPosting.tc_Rowid
               t_sPosting.tc_ParentRowid = "":U
               t_sPosting.tc_Status      = "D":U
               opPrimeKey                = (if opPrimeKey = "" then "" else opPrimeKey + chr(4))
                                         + string(tPosting.Posting_ID).
        next.
    end.  /* if vcActivityCode = Delete */

    /* ============================================================================== */
    /* Block for the create-activity and for case of modify where the DataLoad could  */ 
    /* not read the posting from the db (we will act like create create in that case) */
    /* ============================================================================== */
    if vcActivityCode           = "ExternalCreate":U or
       vcActivityCode           = "Create":U         or
       viDataLoadReturnStatus   = -4
    then do:
        /* When object not found or in create mode, create it. */ 
        <M-5 run AddDetailLine
           (input  'Posting':U (icTable), 
            input  '' (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BPosting>        

        if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
        then viLocalReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave PROCESSBLOCKDATALOADBYINPUT.

        /* Update input to allow correct matching */ 
        assign t_sPosting.tc_Status = "N":U.

    end.  /* if vcActivityCode = Create */
    else assign t_sPosting.tc_Status = "C":U.

    /* ================================================================================================================================= */
    /* Assign the ID in the input record with the ID of the loaded-created record                                                        */
    /* Note: In case of Excel-integration activities we here accept the Posting_ID of the input and use that in the real New Postings    */
    /*       The functional reason for this is that once the ExcelSheet has been uploaded in the UI, the UI calls a business-method      */
    /*       on this class that returns a list of Posting_IDs and then the UI replaces the Posting_IDs in the grid with the Posting_IDs  */
    /*       that were returned by the business-method.                                                                                  */
    /*       The reason for this construction is that once the ExcelSheet has been loaded into the grid users can add attachments and    */
    /*       the link between the Posting in the grid and these attachements is the Posting_ID. As such, at that moment it is needed     */
    /*       that the UI alsready has got the final Posting_ID that will also go into the database                                       */
    /* ================================================================================================================================= */
    if t_sPosting.tc_Status   = "N":U and 
       t_sPosting.Posting_ID <> 0     and 
       t_sPosting.Posting_ID <> ?     and 
       (vcActivityCode = "JournalEntryExcelIntegrationRepair":U or vcActivityCode = "ExcelIntegration ":U)
    then assign tPosting.Posting_ID   = t_sPosting.Posting_ID. 
    else assign t_sPosting.Posting_ID = tPosting.Posting_ID. 
        
    /* Code for PostingLines  */
    for each tPostingLine where
             tPostingLine.tc_ParentRowid = tPosting.tc_Rowid:
        assign tPostingLine.tc_Status = "D":U.
    end. /* for each tPostingLine where */

    for each t_sPostingLine where
             t_sPostingLine.tc_ParentRowid  = t_sPosting.tc_Rowid and
             t_sPostingLine.tc_Status      <> "D":U:

        assign t_sPostingLine.Posting_ID = t_sPosting.Posting_ID.

        find first tPostingLine where
                   tPostingLine.tc_ParentRowid      = tPosting.tc_Rowid and
                   tPostingLine.PostingLineSequence = t_sPostingLine.PostingLineSequence
                   no-error.
        if available tPostingLine
        then do :
            if tPostingLine.tc_Status = "D":U
            then assign t_sPostingLine.tc_Status = "C":U
                        tPostingLine.tc_Status = "C":U.
            else do:
                assign vcMsgExplanation = <M-70 GetErrorExplanation
                                             (input  t_sPosting.tc_Rowid (icPostingRowId), 
                                              input  t_sPostingLine.tc_Rowid (icPostingLineRowId), 
                                              output viFcReturnSuper (oiReturnStatus)) in BPosting>.
                              
                assign vcMessage = trim(#T-29'Duplicate posting line sequence in input.':255(999890336)T-29#).
                if viLocalReturnStatus >= 0
                then assign viLocalReturnStatus = -3.
                <M-28 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  'tPostingLine.PostingLineSequence' (icFieldName), 
                    input  string(t_sPostingLine.PostingLineSequence) (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sPostingLine.tc_Rowid (icRowid), 
                    input  'QadFin-9038':U (icFcMsgNumber), 
                    input  vcMsgExplanation (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BPosting>
                leave PROCESSBLOCKDATALOADBYINPUT.
            end. /* Not if tPostingLine.tc_Status = "D":U */
        end. /* if avail tPostingLine */
        else do:       
            <M-7 run AddDetailLine
               (input  'PostingLine':U (icTable), 
                input  tPosting.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BPosting>            

            if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
            then viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCKDATALOADBYINPUT.

            assign t_sPostingLine.tc_Status = "N":U
                   tPostingLine.PostingLineSequence = t_sPostingLine.PostingLineSequence.

        end. /* Not if avail tPostingLine */

        assign t_sPostingLine.PostingLine_ID = tPostingLine.PostingLine_ID
                      t_sPostingLine.tlLinkedCrCyDaemonReqExists  = false.

        /* Code for PostingSaf */
        for each tPostingSaf where
                 tPostingSaf.tc_ParentRowid = tPostingLine.tc_Rowid:
            assign tPostingSaf.tc_Status = "D":U.
        end. /* for each tPostingSaf where */

        if not can-find (first  t_sPostingSaf where
                                t_sPostingSaf.tc_ParentRowid = t_sPostingLine.tc_Rowid)
        then do :
            /* Call method that will create the default safs */
            <M-30 run DataLoadByInputSafDefaulting
               (input-output vlQStartedGetSafConceptsForStr (blQStartedGetSafConceptsForStr), 
                output viFcReturnSuper (oiReturnStatus)) in BPosting>

            if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
            then viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave PROCESSBLOCKDATALOADBYINPUT.

        end. /* if not can-find (first  t_sPostingSaf where */
        else do :
            for each t_sPostingSaf where
                     t_sPostingSaf.tc_ParentRowid = t_sPostingLine.tc_Rowid and
                     t_sPostingSaf.tc_Status     <> "D":U:

                find first tPostingSaf where
                           tPostingSaf.tc_ParentRowid          = tPostingLine.tc_Rowid              and                    
                           tPostingSaf.PostingSafParentType    = t_sPostingSaf.PostingSafParentType and
                           tPostingSaf.PostingSafInputSequence = t_sPostingSaf.PostingSafInputSequence
                           no-error.

                if available tPostingSaf
                then assign t_sPostingSaf.tc_Status = "C":U.
                else do:
                    <M-23 run AddDetailLine
                       (input  'PostingSaf':U (icTable), 
                        input  tPostingLine.tc_Rowid (icParentRowid), 
                        output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

                    then leave PROCESSBLOCKDATALOADBYINPUT.
                    assign t_sPostingSaf.tc_Status = "N":U.

                end. /* else do: */

                <M-51 run SetRowidConvert
                   (input  t_sPostingSaf.tc_Rowid (icOldRowid), 
                    input  tPostingSaf.tc_Rowid (icNewRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

                assign t_sPostingSaf.PostingSaf_ID  = tPostingSaf.PostingSaf_ID
                       t_sPostingSaf.Posting_ID     = tPostingSaf.Posting_ID
                       t_sPostingSaf.tc_Rowid       = tPostingSaf.tc_Rowid
                       t_sPostingSaf.tc_ParentRowid = tPostingLine.tc_Rowid.

            end.  /* for each t_sPostingSaf */
        end. /* Not if not can-find (first  t_sPostingSaf where */

        /* Code for PostingVat */
        for each tPostingVat where
                 tPostingVat.tc_ParentRowid = tPosting.tc_Rowid:
            assign tPostingVat.tc_Status = "D":U.
        end. /* for each tPostingVat where */

        for each t_sPostingVat where
                 t_sPostingVat.tc_ParentRowid = t_sPostingLine.tc_Rowid and
                 t_sPostingVat.tc_Status     <> "D":U:

            find first tPostingVat where
                       tPostingVat.tc_ParentRowid = tPostingLine.tc_Rowid 
                       no-error.

            if available tPostingVat
            then assign t_sPostingVat.tc_Status = "C":U.
            else do:
                <M-26 run AddDetailLine
                   (input  'PostingVat':U (icTable), 
                    input  tPostingLine.tc_Rowid (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BPosting>

                if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
                then viLocalReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then leave PROCESSBLOCKDATALOADBYINPUT.    

                <M-77 run DataLoadByInputVatRule
                   (input-output vlQStartedVatRuleByVatIDCode (blQStartedVatRuleByVatIDCode), 
                    output viFcReturnSuper (oiReturnStatus)) in BPosting>   

                if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
                then viLocalReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then leave PROCESSBLOCKDATALOADBYINPUT. 

                assign t_sPostingVat.tc_Status = "N":U.

            end. /* else do: */

            <M-52 run SetRowidConvert
               (input  t_sPostingVat.tc_Rowid (icOldRowid), 
                input  tPostingVat.tc_Rowid (icNewRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

            assign t_sPostingVat.PostingVat_ID  = tPostingVat.PostingVat_ID
                   t_sPostingVat.Posting_ID     = tPostingVat.Posting_ID
                   t_sPostingVat.tc_Rowid       = tPostingVat.tc_Rowid
                   t_sPostingVat.tc_ParentRowid = tPostingLine.tc_Rowid.

        end.  /* for each t_sPostingVat */

        /* Code for PostingVatDelay */
        for each tPostingVatDelay where
                 tPostingVatDelay.tc_ParentRowid = tPostingLine.tc_Rowid:
            assign tPostingVatDelay.tc_Status = "D":U.
        end. /* for each tPostingVatDelay where */

        for each t_sPostingVatDelay where
                 t_sPostingVatDelay.tc_ParentRowid = t_sPostingLine.tc_Rowid and
                 t_sPostingVatDelay.tc_Status     <> "D":U:

            find first tPostingVatDelay where
                       tPostingVatDelay.tc_ParentRowid = tPostingLine.tc_Rowid 
                       no-error.

            if available tPostingVatDelay
            then assign t_sPostingVatDelay.tc_Status = "C":U.
            else do:
                <M-27 run AddDetailLine
                   (input  'PostingVatDelay':U (icTable), 
                    input  tPostingLine.tc_Rowid (icParentRowid), 
                    output viFcReturnSuper (oiReturnStatus)) in BPosting>

                if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
                then viLocalReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then leave PROCESSBLOCKDATALOADBYINPUT.

                assign t_sPostingVatDelay.tc_Status = "N":U.

            end. /* else do: */

            <M-53 run SetRowidConvert
               (input  t_sPostingVatDelay.tc_Rowid (icOldRowid), 
                input  tPostingVatDelay.tc_Rowid (icNewRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

            assign t_sPostingVatDelay.PostingVatDelay_ID = tPostingVatDelay.PostingVatDelay_ID
                   t_sPostingVatDelay.Posting_ID         = tPostingVatDelay.Posting_ID
                   t_sPostingVatDelay.tc_Rowid           = tPostingVatDelay.tc_Rowid
                   t_sPostingVatDelay.tc_ParentRowid     = tPostingLine.tc_Rowid.

        end.  /* for each t_sPostingVatDelay */

        /* Override value for identity fields in input (PostingLine)         */
        /* Update input to allow correct matching                            */
        <M-54 run SetRowidConvert
           (input  t_sPostingLine.tc_Rowid (icOldRowid), 
            input  tPostingLine.tc_Rowid (icNewRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BPosting>
        if viFcReturnSuper <> 0                
        then oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave PROCESSBLOCKDATALOADBYINPUT.

        assign t_sPostingLine.PostingLine_ID = tPostingLine.PostingLine_ID
               t_sPostingLine.Posting_ID     = tPostingLine.Posting_ID
               t_sPostingLine.tc_Rowid       = tPostingLine.tc_Rowid
               t_sPostingLine.tc_ParentRowid = tPosting.tc_Rowid.      
                
    end.  /* for each t_sPostingLine */

    /* Get a new Voucher if empty  */ 
    if t_sPosting.PostingVoucher = 0 or
       t_sPosting.PostingVoucher = ? 
    then do:       

        <M-13 run GetPostingNumber
           (input  tPosting.tc_Rowid (ictcRowid), 
            input  t_sPosting.PostingYear (iiYear), 
            input  t_sPosting.tcJournalCode (icJournalCode), 
            output t_sPosting.PostingVoucher (oiVoucher), 
            output viFcReturnSuper (oiReturnStatus)) in BPosting>
        if viFcReturnSuper <> 0 and viLocalReturnStatus >= 0
        then viLocalReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave PROCESSBLOCKDATALOADBYINPUT.

    end. /* if tPosting.PostingVoucher = 0 */  

    /* Override value for identity fields in input (Posting) */          
    <M-55 run SetRowidConvert
       (input  t_sPosting.tc_Rowid (icOldRowid), 
        input  tPosting.tc_Rowid (icNewRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BPosting>

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

    assign t_sPosting.Posting_ID           = tPosting.Posting_ID
           t_sPosting.Company_ID           = tPosting.Company_ID
           t_sPosting.PostingVerifyStatus  = 'INITIAL':U
           t_sPosting.PostingApproveStatus = 'INITIAL':U
           t_sPosting.CreatorUsr_ID        = viUsrId
           t_sPosting.tcUsrLogin           = vcUserLogin
           t_sPosting.tc_Rowid             = tPosting.tc_Rowid
           t_sPosting.tc_ParentRowid       = ""           
           opPrimeKey                      = (if opPrimeKey = "" 
                                              then "" 
                                              else opPrimeKey + chr(4)) + 
                                             string(tPosting.Posting_ID).

    /* we overwrite any given value by today's date */           
    if tPosting.tc_Status = 'N'
    then assign t_sPosting.PostingSystemDate = today.
    
END. /* PROCESSBLOCKDATALOADBYINPUT */

/* Exception hanlding */
assign oiReturnStatus = viLocalReturnStatus.