project QadFinancials > class BDDocument > method ApiSetDDocumentStatusChange

Description

Set new status of debtor document(s). System expects list of debtor documents to be updated with new document status. This method does complete update of required debtor documents.

This method also support change of own bank number and payment format, from which payment goes out.

Preconditions: Method ApiGetDDocumentStatusChange should be called before execution of this method. All passed debtor documents have to exist in database

Postcondition: all passed debtor documents are updated, corresponding posting and other related financial updates are created and saved in database.


Parameters


tDDocumentStatusChangeinputtemp-tableInput temporary table which contains details needed for change of status/bank number and/or payment format of debtor document.

This temporary table is retreived using method ApiGetDDocumentStatusChange method.

Currently only change of following fields of debtor documents is supported. Change of other fields is not recommended.
- tcDDocumentStatus
- tcBankNumber
- tcGLCode

List of fields in temporary table:
- tlChangeFlag this field is not used
- tdOriginalDebitTC original debit of debtor's document (this value cannot be changed)
- tdOriginalStatus original status of debtor's document (this value cannot be changed)
- Initial
- Accepted
- Portfolio
- For collection
- Disconto
- Bounced
- Paid
- Paid conditionally
- tcOriginalBankNumber original own bank number of debtor's document (this value cannot be changed)
- tcOriginalGLCode original G/L account code of own bank number (this value cannot be changed)
- tcBankNumber own bank number of payment document from which payment goes out. If this value is changed, during execution of method ApiSetDDocumentStatus new own bank number is assigned.
- tiBankNumber_ID ID of own bank number from which payment goes out
- tiBankPayFormat_ID ID of bank payment format (defines both own bank number and payment format)
- tiBusinessRelation _ID ID of debtor's business relation
- tcBusinessRelationCode Code of debtor's business relation
- tiCompany_ID ID of company where debtor document was created
- tiCurrency_ID ID of debtor document's currency
- tcCurrencyCode Code of debtor document's currency
- tiDDocument_ID ID of debtor document
- ttDDocumentCreationDate Creation date of debtor document
- ttDDocumentDueDate Due date of debtor document
- tcDDocumentIncassoSelectCode Incasso selection code of debtor document
- tlDDocumentIsOpen Debtor document is open
- ttDDocumentLastPrintDate Last print date of debtor document
- tiDDocumentNumber Debtor document number
- tdDDocumentOriginalDebitLC Original debit amount in local currency
- tdDDocumentOriginalDebitTC Original debit amount in transactional currency
- tcDDocumentReference Reference of debtor document
- tcDDocumentStatus Status of debtor document
- Initial
- Accepted
- Portfolio
- For collection
- Disconto
- Bounced
- Paid
- Paid conditionally
- tcDDocumentSubType Indication of way, debtor document was created
- Automatic
- Manual
- tiDDocumentTimesPrinted Number of times document was printed
- tcDDocumentType Type of debtor document
- Check
- Direct debit
- Draft
- Promissory note
- Summary statement
- Credit card
- tiDDocumentValueDays Value days
- tiDDocumentYear Debtor document year
- tiDebtor_ID ID of debtor
- tcGLCode G/L code linked to company's bank number
- tcPayFormatTypeCode Payment format code
- ti_sequence Sequence record (internal usage)
- tc_rowid Unique row identification withing a table
itPostingDateinputdatePosting date of status change of debtor document
icFileFormatinputcharacterNot used
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program9/bddocument.p)

if not can-find(first tDDocumentStatusChange)
then return.

assign vcRowId                      = "":U
       viDPaySelSequence            = -1
       viPaySelCodeHeaderSequence   = -1
       vlStart1                     = false
       vcValidatedNewSelCodes       = "":U
       vcValidatedNewSelCodeDetails = "":U
       vcDPaySelRecordsIDChanged    = "":U.

for each tDDocumentStatusChange where
         tDDocumentStatusChange.tcDDocumentStatus <> tDDocumentStatusChange.tcOriginalStatus or
         tDDocumentStatusChange.tcBankNumber <> tDDocumentStatusChange.tcOriginalBankNumber or
         tDDocumentStatusChange.tcGLCode <> tDDocumentStatusChange.tcOriginalGLCode or
         tDDocumentStatusChange.tcPayFormatTypeCode <> tDDocumentStatusChange.tcOriginalPayFormatTypeCode or
         tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> tDDocumentStatusChange.tcOriginalIncassoSelectCode:
    assign vcDDocumentType = <M-1 GetDDocumentTypeTranslation (input  tDDocumentStatusChange.tcDDocumentType (icType)) in BDDocument>.

    if not vlStart1
    then do:
        <Q-2 run DDocumentById (Start) in BDDocument >
        assign vlStart1 = true.
    end.

    <Q-3 run DDocumentById (all) (Read) (NoCache)
          (input tDDocumentStatusChange.tiCompany_ID, (CompanyId)
           input tDDocumentStatusChange.tiDDocument_ID, (DDocumentId)
           output dataset tqDDocumentById) in BDDocument >

    find first tqDDocumentById
               no-error.

    if not available tqDDocumentById
    then do:
        <M-4 run SetMessage
           (input  trim(#T-12'$1 $2 $3 cannot be updated because another user has deleted it.':250(914)T-12#) (icMessage), 
            input  vcDDocumentType + chr(2) + string(tDDocumentStatusChange.tiDDocumentYear) + chr(2) + string(tDDocumentStatusChange.tiDDocumentNumber) (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-2562':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDDocument>

        assign oiReturnStatus = -1.
        next.
    end.
    
    /* Check to see if the document is to be added to a new selection code */
    if (tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> tDDocumentStatusChange.tcOriginalIncassoSelectCode and 
        tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> ? and tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> "")
    then do:
        /* first check to see if it's alreay been validated, and if so skip this validation */
        if lookup(tDDocumentStatusChange.tcDDocumentIncassoSelectCode, vcValidatedNewSelCodes, ",":U) = 0
        then do:
            if vcValidatedNewSelCodes <> "":U
            then assign 
                    vcValidatedNewSelCodes = vcValidatedNewSelCodes + ",":U
                    vcValidatedNewSelCodeDetails = vcValidatedNewSelCodeDetails + ",":U.

            assign 
                vcValidatedNewSelCodes       = vcValidatedNewSelCodeDetails + entry(1, tDDocumentStatusChange.tcDDocumentIncassoSelectCode)
                vcValidatedNewSelCodeDetails = vcValidatedNewSelCodeDetails + entry(1, 
                                                            tDDocumentStatusChange.tcDDocumentIncassoSelectCode + chr(2) +
                                                            tDDocumentStatusChange.tcBankNumber + chr(2) +
                                                            tDDocumentStatusChange.tcGLCode + chr(2) +
                                                            tDDocumentStatusChange.tcPayFormatTypeCode).
            
            /* validate selection code uniqueness, status and type */
            <M-34 run IsNewSelectionCodeValid
               (input  tDDocumentStatusChange.tcDDocumentIncassoSelectCode (icSelectionCode), 
                input  tDDocumentStatusChange.tcDDocumentStatus (icDocumentStatus), 
                input  tDDocumentStatusChange.tcPayFormatTypeCode (icFileFormat), 
                output oiReturnStatus (oiReturnStatus)) in BDDocument>                                                            
            
            if viFcReturnSuper <> 0 
            then assign oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper <  0 then return.

        end. /* if lookup */   
        else do:
            /* check to see if all records with this code have the same bank details  */
            if lookup(tDDocumentStatusChange.tcDDocumentIncassoSelectCode + chr(2) +
                                                    tDDocumentStatusChange.tcBankNumber + chr(2) +
                                                    tDDocumentStatusChange.tcGLCode + chr(2) +
                                                    tDDocumentStatusChange.tcPayFormatTypeCode, 
                                                    vcValidatedNewSelCodeDetails, ",":U) = 0
            then do:
                assign oiReturnStatus = -1
                       vcMsg          = #T-55'The combination of the bank number ($1) and the payment format ($2) must be the same for all records assigned to selection code $3.':255(819375154)T-55#.
                  /* vcMsg          = substitute(vcMsg, tDDocumentStatusChange.tcBankNumber, tDDocumentStatusChange.tcPayFormatTypeCode). */
            <M-72 run SetMessage
               (input  vcMsg (icMessage), 
                input  tDDocumentStatusChange.tcBankNumber + chr(2) + tDDocumentStatusChange.tcPayFormatTypeCode + chr(2) + tDDocumentStatusChange.tcDDocumentIncassoSelectCode (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-467541':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDDocument>
            next.
            
            end. /* if lookup */                                        
        end. /*else do */  
    end. /* tDDocumentStatusChange.tcDDocumentIncassoSelectCode */
       
    if tDDocumentStatusChange.tcOriginalStatus           <> tqDDocumentById.tcDDocumentStatus or
       tDDocumentStatusChange.tdDDocumentOriginalDebitTC <> tqDDocumentById.tdDDocumentOriginalDebitTC
    then do:
        <M-5 run SetMessage
           (input  trim(#T-13'$1 $2 $3 cannot be updated because another user has modified its status or amount.':250(915)T-13#) (icMessage), 
            input  vcDDocumentType + chr(2) + string(tDDocumentStatusChange.tiDDocumentYear) + chr(2) + string(tDDocumentStatusChange.tiDDocumentNumber) (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-2563':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDDocument>

        assign oiReturnStatus = -1.
        next.
    end.

    /* Check existence of combination of Bank Number and Payment Format */
    if tDDocumentStatusChange.tcBankNumber <> tDDocumentStatusChange.tcOriginalBankNumber or
       tDDocumentStatusChange.tcGLCode <> tDDocumentStatusChange.tcOriginalGLCode
    then do:
        if not vlStart2
        then do:
            <Q-26 run BankPayFormatByID  (Start) in BBankPayFormat >
            assign vlStart2 = true.
        end. /* if not vlStart2 */

        <Q-23 run BankPayFormatByID (all) (Read) (NoCache)
           (input tDDocumentStatusChange.tiBankPayFormat_ID, (BankPayFormatId)
            input viCompanyId, (CompanyId)
            output dataset tqBankPayFormatByID) in BBankPayFormat >

        find first tqBankPayFormatByID where
                   tqBankPayFormatByID.tiBankPayFormat_ID = tDDocumentStatusChange.tiBankPayFormat_ID no-error.
        if not available tqBankPayFormatByID
        then do:
            assign oiReturnStatus = -1
                   vcMsg          = #T-40'The combination of the bank number ($1) and the payment format ($2) is not defined.':255(70370)T-40#.
                  /* vcMsg          = substitute(vcMsg, tDDocumentStatusChange.tcBankNumber, tDDocumentStatusChange.tcPayFormatTypeCode). */
            <M-39 run SetMessage
               (input  vcMsg (icMessage), 
                input  tDDocumentStatusChange.tcBankNumber + chr(2) + tDDocumentStatusChange.tcPayFormatTypeCode (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QadFin-8307':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDDocument>
            next.
        end. /* if not available tqBankPayFormatByID */
    end. /* if tDDocumentStatusChange.tcBankNumber <> tcOriginalBankNumber or */

    if vcRowId <> "":U
    then assign vcRowId = vcRowId + ",":U.

    assign vcRowId = vcRowId + entry(1, tDDocumentStatusChange.tc_rowid).
end.

if vlStart1
then do:
    <Q-6 run DDocumentById (Stop) in BDDocument >
end. /* if vlStart1 */
if vlStart2
then do:
    <Q-27 run BankPayFormatByID  (Stop) in BBankPayFormat >
end. /* if vlStart2 */

if oiReturnStatus < 0
then return.

<M-7 run DataLoad (input  vcRowId (icRowids), 
                   input  '':U (icPkeys), 
                   input  '':U (icObjectIds), 
                   input  '':U (icFreeform), 
                   input  false (ilKeepPrevious), 
                   output viFcReturnSuper (oiReturnStatus)) in BDDocument>

if viFcReturnSuper < 0 or
   oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.

if oiReturnStatus < 0
then return.

for each tDDocumentStatusChange where
         tDDocumentStatusChange.tcDDocumentStatus <> tDDocumentStatusChange.tcOriginalStatus or
         tDDocumentStatusChange.tcBankNumber <> tDDocumentStatusChange.tcOriginalBankNumber or
         tDDocumentStatusChange.tcGLCode <> tDDocumentStatusChange.tcOriginalGLCode or
         tDDocumentStatusChange.tcPayFormatTypeCode <> tDDocumentStatusChange.tcOriginalPayFormatTypeCode or
         tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> tDDocumentStatusChange.tcOriginalIncassoSelectCode:
    find tDDocument where
         tDDocument.DDocument_ID = tDDocumentStatusChange.tiDDocument_ID
         no-error.

    if not available tDDocument
    then do:
         assign vcMsg = trim(#T-48'Previously loaded document with ID $1 not found.':255(71500)T-48#).
        <M-8 run SetMessage
           (input  vcMsg (icMessage), 
            input  tDDocumentStatusChange.tiDDocument_ID (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-2564':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDDocument>

        assign oiReturnStatus = -1.
        return.
    end.

    /* vlPayFormatCodeChange = true when only Payment Format Type Code is changed */
    if tDDocumentStatusChange.tcBankNumber = tDDocumentStatusChange.tcOriginalBankNumber and
       tDDocumentStatusChange.tcGLCode = tDDocumentStatusChange.tcOriginalGLCode and
       tDDocumentStatusChange.tcPayFormatTypeCode <> tDDocumentStatusChange.tcOriginalPayFormatTypeCode
    then assign vlPayFormatCodeChange = true.
    
    assign tDDocument.ttPostingDate = itPostingDate
           tDDocument.tc_Status     = "C":U.

    /* Status change */
    if tDDocumentStatusChange.tcDDocumentStatus <> tDDocumentStatusChange.tcOriginalStatus
    then do:
        assign tDDocument.DDocumentStatus = tDDocumentStatusChange.tcDDocumentStatus.
    end. /* if tDDocumentStatusChange.tcDDocumentStatus <> tcOriginalStatus */

    /* Own bank number change */
    if tDDocumentStatusChange.tcBankNumber <> tDDocumentStatusChange.tcOriginalBankNumber or
       tDDocumentStatusChange.tcGLCode <> tDDocumentStatusChange.tcOriginalGLCode or
       tDDocumentStatusChange.tcPayFormatTypeCode <> tDDocumentStatusChange.tcOriginalPayFormatTypeCode
    then do:
       if tDDocument.DDocumentType <> tDDocumentStatusChange.tcDDocumentType and 
           tDDocument.DDocumentNumber <> 0
        then do:
            assign vhFcComponent = ?.
            <M-90 run GetNumber
               (input  viCompanyId (iiCompanyId), 
                input  tDDocument.DDocumentYear (iiNumbrYear), 
                input  'D':U + tDDocumentStatusChange.tcDDocumentType (icNumbrType), 
                output tDDocument.DDocumentNumber (oiNumber), 
                input  viFcCurrentInstanceId (iiInstanceId), 
                input  vcFcComponentName (icClassName), 
                output viFcReturnSuper (oiReturnStatus)) in BNumber>    
    
            if viFcReturnSuper <> 0
            then assign oiReturnStatus = viFCReturnSuper.
            if oiReturnStatus < 0
            then return.
        end. /* if tDDocument.DDocumentType <> tDDocumentStatusChange.tcDDocumentType and */
    
        assign tDDocument.GL_ID       = tDDocumentStatusChange.tiGL_ID
               tDDocument.tcGLCode    = tDDocumentStatusChange.tcGLCode
               tDDocument.DDocumentType = tDDocumentStatusChange.tcDDocumentType
               viOriginalBankNumberID = tDDocument.BankNumber_ID.

        /* Check if the bank number has defined for the customer */
        if not vlStart3
        then do:
            <Q-29 run BankNumberByPayFormatParentObj  (Start) in BBankNumber >
            assign vlStart3 = true.
        end. /* if not vlStart3 */
        <Q-17 run BankNumberByPayFormatParentObj (all) (Read) (NoCache)
           (input tDDocumentStatusChange.tiBankPayFormat_ID, (PaymentFormatID)
            input tDDocument.Debtor_ID, (ParentObjectID)
            input ?, (CompanyId)
            output dataset tqBankNumberByPayFormatParentObj) in BBankNumber >
        
            find first tqBankNumberByPayFormatParentObj where
                   tqBankNumberByPayFormatParentObj.tiBankPayFormat_ID = tDDocumentStatusChange.tiBankPayFormat_ID and
                   tqBankNumberByPayFormatParentObj.tiParentObject_ID  = tDDocument.Debtor_ID no-error.
                   
        
        if available tqBankNumberByPayFormatParentObj and vlPayFormatCodeChange           
        then do:
            assign tDDocument.BankNumber_ID = tqBankNumberByPayFormatParentObj.tiBankNumber_ID.            
        end.
        else do:    
            find first tqBankNumberByPayFormatParentObj where
                       tqBankNumberByPayFormatParentObj.tiBankPayFormat_ID = tDDocumentStatusChange.tiBankPayFormat_ID and
                       tqBankNumberByPayFormatParentObj.tiParentObject_ID  = tDDocument.Debtor_ID and 
                       tqBankNumberByPayFormatParentObj.tcBankNumber       = tDDocument.tcDebtorBankNumber no-error.
                          
            /* Create the bank number for customer if it does not exist before */
            if not available tqBankNumberByPayFormatParentObj 
            then do:
                if viBBankNumber2ID = 0 or viBBankNumber2ID = ?
                then do:
                    <I-41 {bFcStartAndOpenInstance
                         &ADD-TO-TRANSACTION = "true"
                         &CLASS              = "BBankNumber"}>
                end. /* if viBBankNumber2ID = 0 or viBBankNumber2ID = ? */
                else do:
                    <I-42 {bFcOpenInstance
                         &CLASS           = "BBankNumber"}>
                end. /* else do: */
                 <M-85 run CreateCDBankNumberAsCopy
                    (input  tDDocument.BankNumber_ID (iiOriginalBankNumberID), 
                     input  tDDocumentStatusChange.tiBankPayFormat_ID (iiNewPayFormatID), 
                     output tDDocument.BankNumber_ID (oiNewBankNumberID), 
                     output viFcReturnSuper (oiReturnStatus)) in BBankNumber>
                if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then do:
                    <I-44 {bFcCloseInstance
                         &CLASS           = "BBankNumber"}>
                    if vlStart3
                    then do:
                        <Q-45 run BankNumberByPayFormatParentObj  (Stop) in BBankNumber >
                    end. /* if vlStart3 */
                    return.
                end. /* if viFcReturnSuper < 0 */
            end. /* if not available tqBankNumberByPayFormatParentObj */
            else do:
                assign tDDocument.BankNumber_ID = tqBankNumberByPayFormatParentObj.tiBankNumber_ID.
                <Q-94 assign vlFcQueryRecordsAvailable = BankNumberByIDAllInfo (NoCache)
                   (input viOriginalBankNumberID, (BankNumber_ID)
                    input true, (BankNumberIsDefault)) in BBankNumber>
                if vlFcQueryRecordsAvailable = true
                then do:
                    if viBBankNumber2ID = 0 or viBBankNumber2ID = ?
                    then do:
                        <I-50 {bFcStartAndOpenInstance
                             &ADD-TO-TRANSACTION   = "true"
                             &CLASS                = "BBankNumber"}>
                    end. /* if viBBankNumber2ID = 0 or viBBankNumber2ID = ? */
                    else do:
                        <I-53 {bFcOpenInstance
                             &CLASS           = "BBankNumber"}>
                    end. /* else do: */
                    <M-51 run ChangeDefaultBankNumber
                       (input  tqBankNumberByPayFormatParentObj.tiBankNumber_ID (iiNewDefaultBankNumberID), 
                        output viFcReturnSuper (oiReturnStatus)) in BBankNumber>
                    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
                    if viFcReturnSuper < 0
                    then do:
                        <I-59 {bFcCloseInstance
                             &CLASS           = "BBankNumber"}>
                        if vlStart3
                        then do:
                            <Q-836 run BankNumberByPayFormatParentObj  (Stop) in BBankNumber> 
                            end. /* if vlStart3 */
                        return.
                    end. /* if viFcReturnSuper < 0 */
                end. /* if tqBankNumberByPayFormatParentObj.tlBankNumberIsDefault = true */
    
            end. /* else do: */
        end.  /* else do: */

        /* Find linked invoices and store to temp-table. Bank number of these invoices need to to updated also */
        for each tDDocumentInvoiceXref where
                 tDDocumentInvoiceXref.DDocument_ID = tDDocument.DDocument_ID:
            create tUpdateDInvBankNumber.
            assign
                tUpdateDInvBankNumber.tiDInvoiceId          = tDDocumentInvoiceXref.DInvoice_ID
                tUpdateDInvBankNumber.tiNewBankNumberId     = tDDocument.BankNumber_ID
                tUpdateDInvBankNumber.tiOldBankNumberId     = viOriginalBankNumberID
                tUpdateDInvBankNumber.tdDInvoiceBankToPayTC = 0
                tUpdateDInvBankNumber.tlPayFormatChanged    = false.
        end. /* for each tDDocumentInvoiceXref where */
    end. /* if tDDocumentStatusChange.tcBankNumber <> tcOriginalBankNumber or */
    /* Set or regroup Payment Selection */    
    if tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> tDDocumentStatusChange.tcOriginalIncassoSelectCode
    then do:
        /* has this been created - if not create it */
        find first tDPaySelRefDDoc where tDPaySelRefDDoc.DPaySelCode = tDDocumentStatusChange.tcDDocumentIncassoSelectCode no-error.
        if not available tDPaySelRefDDoc 
        then do:
            create tDPaySelRefDDoc.
            assign tDPaySelRefDDoc.tc_Rowid             = string(viDPaySelSequence)
                   tDPaySelRefDDoc.tc_status            = 'N':U
                   tDPaySelRefDDoc.Company_ID           = viCompanyId
                   tDPaySelRefDDoc.DPaySelStatus        = tDDocumentStatusChange.tcDDocumentStatus
                   tDPaySelRefDDoc.tcPayFormatTypeCode  = tDDocumentStatusChange.tcPayFormatTypeCode
                   tDPaySelRefDDoc.GL_ID                = tDDocumentStatusChange.tiGL_ID
                   tDPaySelRefDDoc.tcGLCode             = tDDocumentStatusChange.tcGLCode
                   tDPaySelRefDDoc.BankPayFormat_ID     = tDDocumentStatusChange.tiBankPayFormat_ID
                   tDPaySelRefDDoc.DPaySelCode          = tDDocumentStatusChange.tcDDocumentIncassoSelectCode
                   tDPaySelRefDDoc.tiBankNumber_ID      = tDDocumentStatusChange.tiBankNumber_ID
                   tDPaySelRefDDoc.DPaySelDate          = today
                   viDPaySelSequence                    = viDPaySelSequence - 1.
             /* add the header fields */      
            find first tDPaySelPayCodeRefDDoc where tDPaySelPayCodeRefDDoc.tc_ParentRowid = tDPaySelRefDDoc.DPaySelCode no-error.
            
            if available tDPaySelPayCodeRefDDoc and tDPaySelPayCodeRefDDoc.tc_ParentRowid = tDPaySelRefDDoc.DPaySelCode
            then do:
                for each tDPaySelPayCodeRefDDoc where tDPaySelPayCodeRefDDoc.tc_ParentRowid = tDPaySelRefDDoc.DPaySelCode:                        
                    assign tDPaySelPayCodeRefDDoc.tc_ParentRowid = tDPaySelRefDDoc.tc_Rowid.
                    if tDPaySelPayCodeRefDDoc.tcPayFormatCode <> ? and tDPaySelPayCodeRefDDoc.tcPayFormatCode <> "":U
                    then do:                
                        <Q-92 run PayFormatCodebyGroupID (all) (Read) (NoCache)
                           (input ?, (PayFormatCodeID)
                            input tDPaySelPayCodeRefDDoc.tcPayFormatCode, (PayFormatCode)
                            input tDPaySelPayCodeRefDDoc.PayFormatGroup_ID, (PayFormatGroupID)
                            output dataset tqPayFormatCodebyGroupID) in BPaymentFormat>
                        
                        find first tqPayFormatCodebyGroupID no-error.
                        if available tqPayFormatCodebyGroupID
                        then assign tDPaySelPayCodeRefDDoc.PayFormatCode_ID    = tqPayFormatCodebyGroupID.tiPayFormatCode_ID
                                    tDPaySelPayCodeRefDDoc.DPaySelPayCodeValue = '':U.
                        else assign tDPaySelPayCodeRefDDoc.PayFormatCode_ID    = 0
                                    tDPaySelPayCodeRefDDoc.DPaySelPayCodeValue = tDPaySelPayCodeRefDDoc.tcPayFormatCode.
                    end.  /* tDPaySelPayCodeRefDDoc.tcPayFormatCode defined */
                    else do:
                        assign tDPaySelPayCodeRefDDoc.PayFormatCode_ID = 0
                               tDPaySelPayCodeRefDDoc.DPaySelPayCodeValue = "":U.
                    end.  /* tDPaySelPayCodeRefDDoc.tcPayFormatCode not defined */                
                end. /* for each tDPaySelPayCodeRefDDoc */
            end. /* if available tDPaySelPayCodeRefDDoc */
            else do:
            /* headers not set in UI so create them here */
                <Q-71 run PayFormatCodeByDefault (all) (Read) (NoCache)
                   (input tDDocumentStatusChange.tcPayFormatTypeCode, (PayFormatTypeCode)
                    input ?, (PayFormatGroupSequence)
                    input true, (PayFormatGroupIsActive)
                    input true, (PayFormatCodeIsActive)
                    input true, (PayFormatCodeIsDefault)
                    output dataset tqPayFormatCodeByDefault) in BPaymentFormat>
    
                for each tqPayFormatCodeByDefault where
                         tqPayFormatCodeByDefault.tcPayFormatGroupLevel = {&PAYFORMATGROUPLEVEL-HEADER}:    
                    create tDPaySelPayCodeRefDDoc.
                    assign tDPaySelPayCodeRefDDoc.PayFormatGroup_ID           = tqPayFormatCodeByDefault.tiPayFormatGroup_ID
                           tDPaySelPayCodeRefDDoc.PayFormatCode_ID            = tqPayFormatCodeByDefault.tiPayFormatCode_ID
                           tDPaySelPayCodeRefDDoc.tcPayFormatGroupCode        = tqPayFormatCodeByDefault.tcPayFormatGroupCode
                           tDPaySelPayCodeRefDDoc.tcPayFormatGroupDescription = tqPayFormatCodeByDefault.tcPayFormatGroupDescription
                           tDPaySelPayCodeRefDDoc.tcPayFormatCode             = tqPayFormatCodeByDefault.tcPayFormatCode    
                           tDPaySelPayCodeRefDDoc.tcPayFormatCodeDescription  = tqPayFormatCodeByDefault.tcPayFormatCodeDescription
                           tDPaySelPayCodeRefDDoc.tcPayFormatGroupDataType    = tqPayFormatCodeByDefault.tcPayFormatGroupDataType   
                           tDPaySelPayCodeRefDDoc.tcPayFormatGroupInputOption = tqPayFormatCodeByDefault.tcPayFormatGroupInputOption
                           tDPaySelPayCodeRefDDoc.tlPayFormatGroupIsMandatory = tqPayFormatCodeByDefault.tlPayFormatGroupIsMandatory
                           tDPaySelPayCodeRefDDoc.tc_ParentRowid              = tDPaySelRefDDoc.tc_Rowid
                           tDPaySelPayCodeRefDDoc.tc_Rowid                    = string(viPaySelCodeHeaderSequence)
                           tDPaySelPayCodeRefDDoc.tc_status                   = 'N':U
                           viPaySelCodeHeaderSequence                         = viPaySelCodeHeaderSequence - 1.                                   
                end. /* for each tqPayFormatCodeByDefault */                                   
            end. /* else do */
        
        end. /* if not available tDPaySelRefDDoc */   
        /* If the ddocument is already part of a selection then add that selection to
           comma delimited list - if selection has no more documents attached it will
           be deleted in the post save
        */  
        if tDDocument.DPaySel_ID <> ? and tDDocument.DPaySel_ID <> 0
        then do:
            if lookup(string(tDDocument.DPaySel_ID), vcDPaySelRecordsIDChanged, ",":U) = 0
            then do:
                if vcDPaySelRecordsIDChanged <> "":U
                    then assign vcDPaySelRecordsIDChanged = vcDPaySelRecordsIDChanged + chr(4).
                assign vcDPaySelRecordsIDChanged = vcDPaySelRecordsIDChanged + entry(1, string(tDDocument.DPaySel_ID)).
            end. /* if lookup(tDDocument.tc_ParentRowid */
        end. /* if tDDocument.tc_ParentRowid */
        assign         
            tDDocument.tc_ParentRowid = tDPaySelRefDDoc.tc_Rowid
            tDDocument.DDocumentIncassoSelectCode = tDDocumentStatusChange.tcDDocumentIncassoSelectCode.
    end. /* if tDDocumentStatusChange.tcDDocumentIncassoSelectCode <> */
end.

if vlStart3
then do:
    <Q-32 run BankNumberByPayFormatParentObj  (Stop) in BBankNumber >
end. /* if vlStart3 */

if viBBankNumber2ID <> 0 and viBBankNumber2ID <> ?
then do:
    <M-47 run ValidateBCAndAdditionalUpdates  (output viFcReturnSuper (oiReturnStatus)) in BBankNumber>
    /* ========================================================================================================= */
    /* Normally we would here close BBankNumber but we will not do it for performance                            */
    /* reasons as this way the Commit of the transaction does not have to re-open the instance to commit it.     */
    /* And in all other scenario's the instance of the class ill be closed by the de-activiate procedure of the  */
    /* appserver that is executed after each call to the appserver                                               */
    /* ========================================================================================================= */
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper < 0 then return.
end. /* if viBBankNumber2ID <> 0 and viBBankNumber2ID <> ? */

<M-9 run ValidateBC (output viFcReturnSuper (oiReturnStatus)) in BDDocument>

if viFcReturnSuper < 0 or
   oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.

if oiReturnStatus <  0
then return.

<M-10 run AdditionalUpdates (output viFcReturnSuper (oiReturnStatus)) in BDDocument>

if viFcReturnSuper < 0 or
   oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.

if oiReturnStatus < 0
then return.

<M-11 run DataSave (output viFcReturnSuper (oiReturnStatus)) in BDDocument>

if viFcReturnSuper < 0 or
   oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.

if oiReturnStatus < 0
then return.


Sample code: how to call this method through RPCRequestService (QXtend Inbound)

define temp-table ttContext no-undo
    field propertyQualifier as character
    field propertyName as character
    field propertyValue as character
    index entityContext is primary unique
        propertyQualifier
        propertyName
    index propertyQualifier
        propertyQualifier.

define dataset dsContext for ttContext.

define variable vhContextDS as handle no-undo.
define variable vhExceptionDS as handle no-undo.
define variable vhServer as handle no-undo.
define variable vhInputDS as handle no-undo.
define variable vhInputOutputDS as handle no-undo.
define variable vhOutputDS as handle no-undo.
define variable vhParameter as handle no-undo.

/* Create context */
create ttContext.
assign ttContext.propertyName = "programName"
       ttContext.propertyValue = "BDDocument".
create ttContext.
assign ttContext.propertyName = "methodName"
       ttContext.propertyValue = "ApiSetDDocumentStatusChange".
create ttContext.
assign ttContext.propertyName = "applicationId"
       ttContext.propertyValue = "fin".
create ttContext.
assign ttContext.propertyName = "entity"
       ttContext.propertyValue = "1000".
create ttContext.
assign ttContext.propertyName = "userName"
       ttContext.propertyValue = "mfg".
create ttContext.
assign ttContext.propertyName = "password"
       ttContext.propertyValue = "".

/* Create input dataset */
create dataset vhInputDS.
vhInputDS:read-xmlschema("file", "xml/bddocument.apisetddocumentstatuschange.i.xsd", ?).
vhParameter = vhInputDS:get-buffer-handle("tParameterI").
vhParameter:buffer-create().
assign vhParameter::itPostingDate = <parameter value>
       vhParameter::icFileFormat = <parameter value>.

vhParameter = vhInputDS:get-buffer-handle("tDDocumentStatusChange").
vhParameter:buffer-create().
assign vhParameter::<field-name-1> = <field-value-1>
       vhParameter::<field-name-2> = <field-value-2>
       ...

/* Connect the AppServer */
create server vhServer.
vhServer:connect("-URL <appserver-url>").

if not vhServer:connected()
then do:
    message "Could not connect AppServer" view-as alert-box error title "Error".
    return.
end.

/* Run */
assign vhContextDS = dataset dsContext:handle.

run program/rpcrequestservice.p on vhServer
    (input-output dataset-handle vhContextDS by-reference,
           output dataset-handle vhExceptionDS,
     input        dataset-handle vhInputDS by-reference,
     input-output dataset-handle vhInputOutputDS by-reference,
           output dataset-handle vhOutputDS).

/* Handle output however you want, in this example, we dump it to xml */
if valid-handle(vhExceptionDS)
then vhExceptionDS:write-xml("file", "Exceptions.xml", true).

if valid-handle(vhOutputDS)
then vhOutputDS:write-xml("file", "Output.xml", true).

/* Cleanup */
vhServer:disconnect().
assign vhServer = ?.

if valid-handle(vhInputDS)
then delete object vhInputDS.

if valid-handle(vhOutputDS)
then delete object vhOutputDS.

if valid-handle(vhExceptionDS)
then delete object vhExceptionDS.