project QadFinancials > class BPosting > method StdMaintainTT

Description

StdMaintainTT; Method that allows the creation of new instances based on the content of the input temp-tables WITHOUT ValidateBC, AddUpd and DataSave


Parameters


tApiPostinginputtemp-tableInput table containing the postings
tApiPostingLineinputtemp-tableInput table containing the posting-lines
tApiPostingSafinputtemp-tableInput table containing the posting-safs of a posting-line
tApiPostingVatinputtemp-tableInput table containing the PostingVat
tApiPostingVatDelayinputtemp-tableInput table containing the PostingVatDelay
icActioninputcharacterSAVE
SAVESTORE
STORE
VALIDATE
ocLstPrimKeyoutputcharacterLstPrimKey
Char4 separated list with the primary keys of the newly created main-table records. The fields of a primkey are separated with Char2.
E.g. 1<Char2>2002<Char2>100<Char4>1<Char2>2002<Char2>101
ocLstReturnoutputcharacterLstReturn
Char4 separated list with the return-status of the newly created main-table records. Zero means no errors occured.
E.g. 0<Char4>-1<Char4>-504<Char4>1<Char4>0
ocLstRowidoutputcharacterLstRowid
Char4 separated list with the temporarely rowids (negative for new ones) of the newly created main-table records. .
E.g.
-1<Char2>aox00098001<Char2>-26
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BDInvoiceJournalEntry.ApiStdMaintainTT


program code (program7/bposting.p)

/* ============================================================================ */
/* Clear the instance:                                                          */
/* this will also clear the t_s tables that were filled in ApiMaintainByDataSet */
/* ============================================================================ */
<M-56 run ClearData (output viFcReturnSuper (oiReturnStatus)) in BPosting>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0
then return.

/* ==================== */
/* Set Default Return   */
/* Parameter Validation */
/* ==================== */
assign oiReturnStatus         = -98
       vlDraftInstanceCreated = false.
if icAction = ? then assign icAction = "":U.
if icAction <> {&DAEMONACTION-SAVESTORE} and
   icAction <> {&DAEMONACTION-SAVE}      and
   icAction <> {&DAEMONACTION-STORE}     and
   icAction <> {&DAEMONACTION-VALIDATE}
then do:
    assign vcMsgApi       = trim(subst(#T-87'Posting integration: the specified action (&1) should be in the list &2.':255(118339802)T-87#,trim(icAction),"{&DAEMONACTION-SAVESTORE},{&DAEMONACTION-SAVE},{&DAEMONACTION-STORE},{&DAEMONACTION-VALIDATE}":U))
           oiReturnStatus = -1.
    <M-64 run SetMessage (input  vcMsgApi (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  1 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QadFin-7158':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BPosting>
    return.
end. /* if icAction */

/* ======================== */
/* Count main-table records */
/* ======================== */
for each tApiPosting no-lock :
    assign viMainTableRecordCount = viMainTableRecordCount + 1.
end. /* for each */
if viMainTableRecordCount = 0
then do:
    assign vcMsgApi       = trim(#T-88'Posting integration: no main table records (posting) found.':255(825519009)T-88#)
           oiReturnStatus = -1.
    <M-70 run SetMessage (input  vcMsgApi (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  1 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QadFin-7159':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BPosting>
    return.
end. /* if viMainTableRecordCount */

/* ============= */
/* Start Queries */
/* ============= */
<Q-73 run VatRuleByVatIDCode (Start) in BVAT >

/* ================================ */
/* Start loop on main-table records */
/* ================================ */
for each tApiPosting : 
    
    /* =========== */
    /* Start Block */
    /* =========== */
    MAINPOSTINGPROCESSINGBLOCK: DO :
    
    /* ================================== */
    /* Initialise and Create new instance */
    /* ================================== */
    assign vcMsgApi         = "":U 
           vcRowID          = "":U
           vlWarningsFound  = false
           vlSaveAsDraft    = (icAction = {&DAEMONACTION-STORE}).
    
    /* ========================================================================== */
    /* Clear tApiSafFromPosting & Stop a possibly-still existing instance of BSaf */
    /* ========================================================================== */
    empty temp-table tApiSafFromPosting.
    if viBSafPostingID <> 0 and 
       viBSafPostingID = ? 
    then do:
        <I-75 {bFcStopInstance
            &CLASS           = "BSaf"}>
    end. /* if viBSafPostingID <> 0 and */
    
    /* ==================================================================== */
    /* Company_id should belong to current domain, if company is not passed */
    /* current company is defaulted                                         */
    /* ==================================================================== */
    if tApiPosting.Company_ID = ? or 
       tApiPosting.Company_ID = 0
    then assign tApiPosting.Company_ID = viCompanyId.
    else do:
         <Q-61 assign vlFcQueryRecordsAvailable = CompanyByDomain (NoCache)
            (input tApiPosting.Company_ID, (CompanyId)
             input viDomainID, (DomainId)
             input true, (Active)) in BCompany >
         if not (vlFcQueryRecordsAvailable = true)
         then do:    
            assign vcMsgApi      = trim(substitute(#T-92'Company ID (&1) does not match the current domain.)':200(915904178)T-92#, trim(string(tApiPosting.Company_ID)) ))
                   ocLstReturn   = ocLstReturn  + chr(4) + (if viFcReturnSuper = 0 then "-3":U else string(viFcReturnSuper))
                   ocLstPrimKey  = ocLstPrimKey + chr(4) + "*":U
                   ocLstRowid    = ocLstRowid   + chr(4) + "*":U 
                   vlSaveAsDraft = false.
            <M-62 run SetMessage (input  vcMsgApi (icMessage), 
                          input  '':U (icArguments), 
                          input  '':U (icFieldName), 
                          input  '':U (icFieldValue), 
                          input  'E':U (icType), 
                          input  3 (iiSeverity), 
                          input  '':U (icRowid), 
                          input  'QadFin-7156':U (icFcMsgNumber), 
                          input  '' (icFcExplanation), 
                          input  '' (icFcIdentification), 
                          input  '' (icFcContext), 
                          output viFcReturnSuper (oiReturnStatus)) in BPosting>
            leave MAINPOSTINGPROCESSINGBLOCK.
        end.
    end. /* if tApiPosting.Company_ID <> ? and  */
    
    /* ============================================ */
    /* Create Posting (modification is not allowed) */
    /* ============================================ */
    <M-71 run DataNew (output viFcReturnSuper (oiReturnStatus)) in BPosting> 
    if viFcReturnSuper >= 0 then do:
        <M-96 run SetRowidConvert
           (input  tApiPosting.tc_Rowid (icOldRowid), 
            input  tPosting.tc_Rowid (icNewRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BPosting>
    end.
    if viFcReturnSuper < 0 
    then assign vcMsgApi = trim(substitute(#T-91'Internal error on the posting integration: unable to create a new instance. Error number: &1.':255(52826970)T-91#,string(viFcReturnSuper))).
    
    /* ====================================== */
    /* Check for errors in the previous block */
    /* ====================================== */
    if vcMsgApi <> "":U
    then do:
        assign ocLstReturn   = ocLstReturn  + chr(4) + (if viFcReturnSuper = 0 then "-3":U else string(viFcReturnSuper))
               ocLstPrimKey  = ocLstPrimKey + chr(4) + "*":U
               ocLstRowid    = ocLstRowid   + chr(4) + "*":U 
               vlSaveAsDraft = false.
        <M-60 run SetMessage (input  vcMsgApi (icMessage), 
                      input  '':U (icArguments), 
                      input  '':U (icFieldName), 
                      input  '':U (icFieldValue), 
                      input  'E':U (icType), 
                      input  3 (iiSeverity), 
                      input  '':U (icRowid), 
                      input  'QadFin-7155':U (icFcMsgNumber), 
                      input  '' (icFcExplanation), 
                      input  '' (icFcIdentification), 
                      input  '' (icFcContext), 
                      output viFcReturnSuper (oiReturnStatus)) in BPosting>
        leave MAINPOSTINGPROCESSINGBLOCK.
    end. /* if vcMsgApi <> "":U */
    
    /* =========================================================================================== */
    /* Copy all data into the new posting                                                          */
    /* Before continuing, we copy the primary-key-fields of the main table to the input parameters */
    /* This is just to hold it there so it can be assigned to ocPrimKey if the save succeeds. This */
    /* is done because tPosting is no longer available after the save. We use vcRowID in stead  */
    /* of tApiPosting.tc_rowid because tApiPosting.tc_rowid is used as by-clause in the for each   */     
    /* and this would result in the fact that a single record is treated multiple times by the     */
    /* for-each                                                                                    */
    /* =========================================================================================== */            
    buffer-copy tApiPosting 
        except tApiPosting.Posting_ID 
               tApiPosting.tc_ParentRowid 
               tApiPosting.tc_rowid 
               tApiPosting.tc_status 
               tApiPosting.PostingSystemDate
            to tPosting.
    assign tApiPosting.Posting_ID = tPosting.Posting_ID /*Needed to set the prim-key after the save*/
           vcRowID                = tPosting.tc_Rowid.
           tPosting.PostingOriginIsExternal = (if tPosting.PostingOriginIsExternal = ?
                                               then false
                                               else tPosting.PostingOriginIsExternal).           
    
    /* ================= */
    /* Get a new Voucher */
    /* ================= */
    if tPosting.PostingVoucher = 0 or
       tPosting.PostingVoucher = ?
    then do:
        <M-59 run GetPostingNumber (input  tPosting.tc_Rowid (ictcRowid), 
                            input  tPosting.PostingYear (iiYear), 
                            input  tPosting.tcJournalCode (icJournalCode), 
                            output tPosting.PostingVoucher (oiVoucher), 
                            output viFcReturnSuper (oiReturnStatus)) in BPosting>
        if viFcReturnSuper < 0
        then do :
            assign vcMsgApi       = trim(substitute(#T-89'Posting integration: an error (&1) occurred while retrieving a new number for the posting.':255(583990505)T-89#,string(viFcReturnSuper)))
                   vlSaveAsDraft  = (icAction <> {&DAEMONACTION-SAVE} and icAction <> {&DAEMONACTION-VALIDATE})
                   ocLstReturn    = ocLstReturn  + chr(4) + string(viFcReturnSuper)
                   ocLstPrimKey   = ocLstPrimKey + chr(4) + "*":U
                   ocLstRowid     = ocLstRowid   + chr(4) + "*":U.
            Leave MAINPOSTINGPROCESSINGBLOCK.
        end. /* if viFcReturnSuper < 0 */
        else 
        if viFcReturnSuper > 0
        then assign vlWarningsFound = true.

        if not can-find (tCommitNumber where
                         tCommitNumber.tcNumberType   = {&COMMITNUMBERTYPE-POSTINGVOUCHER} and
                         tCommitNumber.tcPostingRowID = tPosting.tc_Rowid)
        then do :
           create tCommitNumber.
           assign tCommitNumber.tcNumberType   = {&COMMITNUMBERTYPE-POSTINGVOUCHER}
                  tCommitNumber.tcPostingRowID = tPosting.tc_Rowid.             
        end.     

    end. /* if tPosting.PostingVoucher = 0 */
    
    /* ======================================================================================= */
    /* Process posting-lines, posting-safs, posting-vats, posting-vat-delays and posting-xrefs */
    /* ======================================================================================= */
    <M-95 run StdMaintainTTSub1
       (input  icAction (icAction), 
        input-output ocLstReturn (bcLstReturn), 
        input-output ocLstPrimKey (bcLstPrimKey), 
        input-output ocLstRowid (bcLstRowid), 
        input-output vlSaveAsDraft (blSaveAsDraft), 
        output viFcReturnSuper (oiReturnStatus)) in BPosting>
    if viFcReturnSuper < 0
    then leave MAINPOSTINGPROCESSINGBLOCK.
    else if viFcReturnSuper > 0
         then assign vlWarningsFound = true.
    
    /* =================================================== */
    /* This is where it ends if only SaveAsDraft is needed */
    /* =================================================== */
    if vlSaveAsDraft
    then do:
        assign ocLstReturn  = ocLstReturn  + chr(4) + "-1":U
               ocLstPrimKey = ocLstPrimKey + chr(4) + "*":U
               ocLstRowid   = ocLstRowid   + chr(4) + "*":U.
        Leave MAINPOSTINGPROCESSINGBLOCK.
    end. /* vlSaveAsDraft */
    
    /* =================================================== */
    /* Create the SAFs based upon tApiSafFromPosting       */
    /* =================================================== */
    if can-find (first tApiSafFromPosting)
    then do :
        if viBSafPostingID = ? or 
           viBSafPostingID  = 0
        then do:
            <I-76 {bFcStartAndOpenInstance
                 &ADD-TO-TRANSACTION   = "false"
                 &CLASS                = "BSaf"}>
        end.
        else do:
            <I-77 {bFcOpenInstance
            &CLASS           = "BSaf"}>
        end.
        <M-78 run ApiStdMaintainTT (input  tApiSafFromPosting (tApiSaf), 
                            input  icAction (icAction), 
                            output vcLstPrimKey (ocLstPrimKey), 
                            output vcLstReturn (ocLstReturn), 
                            output vcLstRowId (ocLstRowId), 
                            output viBSafReturn (oiReturnStatus)) in BSaf>
        <I-79 {bFcCloseInstance
            &CLASS           = "BSaf"}>
        assign viFcReturnSuper = viBSafReturn.
        if viFcReturnSuper < 0
        then do :
            assign ocLstReturn   = ocLstReturn  + chr(4) + string(viFcReturnSuper)
                   ocLstPrimKey  = ocLstPrimKey + chr(4) + "*":U
                   ocLstRowid    = ocLstRowid   + chr(4) + "*":U
                   vlSaveAsDraft = (icAction <> {&DAEMONACTION-SAVE} and icAction <> {&DAEMONACTION-VALIDATE}).
            Leave MAINPOSTINGPROCESSINGBLOCK.
        end. /* viFcReturnSuper < 0 */
        else if viFcReturnSuper > 0
             then assign vlWarningsFound = true.
    end. /* if can-find (first tApiSafFromPosting) */
    
    /* =============================== */
    /* Set Actvity                     */
    /* =============================== */
    if (vcActivityCode = "":U or
        vcActivityCode = ?) and 
       can-find (first tPosting where
                       tPosting.tc_Status = "N":U)
    then assign vcActivityCode = "ExternalCreate":U.

    /* =========================================================== */
    /* Indicate the data is saved/stored correctly and set primkey */
    /* =========================================================== */
    assign ocLstReturn  = ocLstReturn  + chr(4) + (if vlWarningsFound = true then "1":U else "0":U)
           ocLstPrimKey = ocLstPrimKey + chr(4) + string(tApiPosting.Posting_ID)
           ocLstRowid   = ocLstRowid   + chr(4) + vcRowID.
    
    END. /* MAINPOSTINGPROCESSINGBLOCK */
    
    /* ================================================================== */
    /* Handle errors: Store if SaveAsDraft is needed                      */
    /* Check: only 1 draft is allowed for a single bus-component instance */
    /* ================================================================== */
    if vlSaveAsDraft and
       index(substring(ocLstReturn, r-index(ocLstReturn, chr(4)) + 1, -1, "CHARACTER":U), "-":U) <> 0 /*Negative return-status for this entry*/
    then do:
        if vlDraftInstanceCreated = true
        then do:
            assign vcMsgApi = trim(#T-93'Only one draft instance can be created per method call.':255(13856)T-93#) + chr(10) +
                              trim(#T-94'This second object will not be stored as a draft instance and will thus be considered as an error situation.':255(999890843)T-94#).
            <M-72 run SetMessage (input  vcMsgApi (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  1 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QadFin-7160':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BPosting>
            next.
        end. /* if vlDraftInstanceCreated = true */
        <M-67 run StoreState
           (input  '(':U + tPosting.PostingInvoiceReferenceTxt + ') ':U + trim(#T-90'Posting created via an API method':200(606057275)T-90#) (icDescription), 
            input  ? (icUIClass), 
            output viFcReturnSuper (oiReturnStatus)) in BPosting>
        assign vlDraftInstanceCreated                                         = true
               entry(num-entries(ocLstReturn , chr(4)), ocLstReturn , chr(4)) = string(viFcReturnSuper)
               entry(num-entries(ocLstPrimKey, chr(4)), ocLstPrimKey, chr(4)) = string(tApiPosting.Posting_ID)
               entry(num-entries(ocLstRowid  , chr(4)), ocLstRowid  , chr(4)) = vcRowID.
    end. /* if vlSaveAsDraft and */
    
end. /* for each tApiPosting */

/* ============= */
/* Stop Queries  */
/* ============= */
<Q-74 run VatRuleByVatIDCode (Stop) in BVAT >

/* ============================================================ */
/* Trim the first character of ocLstReturn and primkey          */
/* Check for correct number and format of the return-parameters */
/* ============================================================ */
if length(ocLstReturn,"CHARACTER":U)  > 1 then assign ocLstReturn  = substring(ocLstReturn,2,-1,"CHARACTER":U).
if length(ocLstPrimKey,"CHARACTER":U) > 1 then assign ocLstPrimKey = substring(ocLstPrimKey,2,-1,"CHARACTER":U).
if length(ocLstRowid,"CHARACTER":U)   > 1 then assign ocLstRowid   = substring(ocLstRowid,2,-1,"CHARACTER":U).
if num-entries(ocLstReturn,chr(4))  <> viMainTableRecordCount or
   num-entries(ocLstPrimKey,chr(4)) <> viMainTableRecordCount or
   num-entries(ocLstRowid,chr(4))   <> viMainTableRecordCount
then do :
    assign vcMsgApi       = trim(#T-80'Posting integration: incomplete information returned by an API method. See other messages for further details.':200(3206)T-80#) + chr(10) + 
                            trim(substitute(#T-81'Main table records: &1.':255(310)T-81#,string(viMainTableRecordCount))) + chr(10) + 
                            trim(substitute(#T-82'Return Statuses: &1.':255(311)T-82#,ocLstReturn))  + chr(10) +
                            trim(substitute(#T-83'Primary keys: &1.':255(312)T-83#,ocLstPrimKey)) + chr(10) +
                            trim(substitute(#T-84'Row IDs: &1.':255(313)T-84#,ocLstRowid)).
           oiReturnStatus = -3.
    <M-57 run SetMessage (input  vcMsgApi (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  1 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QadFin-7153':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BPosting>
    return.
end. /* if num-entries */

/* ===================================================== */
/* Set global return value based on the individual ones: */ 
/* assign it to zero if all individual ones are zero.    */
/* ===================================================== */
if ocLstReturn = substring(fill("0":U + CHR(4),viMainTableRecordCount),1,length(ocLstReturn,"CHARACTER":U),"CHARACTER":U)
then assign oiReturnStatus = 0.
else do :
    if index(ocLstReturn,"-":U) <> 0 
    then do :
        assign oiReturnStatus = -3
               vcMsgApi       = trim(#T-85'Posting integration: an error has occurred while running this API method. See other error messages for more details.':255(3207)T-85#).
        <M-58 run SetMessage (input  vcMsgApi (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  1 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QadFin-7154':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BPosting>
        return.
    end. /* if index(ocLstReturn,"-":U) <> 0  */
    else do : 
        assign vcMsgApi        = trim(#T-86'Posting integration: a warning has occurred while running this API method. See other error messages for more details.':255(14315)T-86#)
               oiReturnStatus  = +1.
        <M-63 run SetMessage (input  vcMsgApi (icMessage), 
                      input  '':U (icArguments), 
                      input  '':U (icFieldName), 
                      input  '':U (icFieldValue), 
                      input  'W':U (icType), 
                      input  3 (iiSeverity), 
                      input  '':U (icRowid), 
                      input  'QadFin-7157':U (icFcMsgNumber), 
                      input  '' (icFcExplanation), 
                      input  '' (icFcIdentification), 
                      input  '' (icFcContext), 
                      output viFcReturnSuper (oiReturnStatus)) in BPosting>
        return.
    end. /* not if lookup */
end. /* Not ocLstReturn = .... */