project QadFinancials > class BExchangeRate > method ValidateComponent

Description

Write here all tests on database update (new / modify / delete) that cannot be coded with a validation mask.
The type of update can be found in tc_status (N/C/D).
If you find incorrect data, you must write an entry in tFcMessages (using SetMessage) and set the return status of this method to either +1 or -1.
Return status +1 = data will still be accepted.
Return status -1 = data will not be accepted.
This method is run from SetPublicTables, before transferring the received data into the class temp-tables.


Parameters


oiReturnStatusoutputinteger


Internal usage


unused


program code (program/bexchangerate.p)

/* ===================== */
/* StopExternalInstances */
/* ===================== */
<M-73 run StopExternalInstances  (output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0
then return.

/* =================================== */
/* fill in the ID's based on the codes */
/* =================================== */
<M-1 run PreValidateComponent  (output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0
then return.

<ANCESTOR-CODE>

/* start queries */
<Q-23 run ExchangeRateTypeByCode  (Start) in BExchangeRateType >

/* ================= */
/* extra validations */
/* ================= */
for each t_sExchangeRate where
         t_sExchangeRate.tc_Status = "N":U or
         t_sExchangeRate.tc_Status = "C":U:
     /* initial the fields that have unknown-value */
     if t_sExchangeRate.ExchangeRate_ID = 0 then assign t_sExchangeRate.ExchangeRate_ID = ?.
     if t_sExchangeRate.ExchangeRateType_ID = 0 then assign t_sExchangeRate.ExchangeRateType_ID = ?.
     if t_sExchangeRate.ToCurrency_ID = 0 then assign t_sExchangeRate.ToCurrency_ID = ?.
     if t_sExchangeRate.ToCurrency_ID = 0 then assign t_sExchangeRate.ToCurrency_ID = ?.

     if t_sExchangeRate.tc_Status = "C":U then do:
        for first t_iExchangeRate
            where t_iExchangeRate.tc_Rowid EQ t_sExchangeRate.tc_Rowid:
            if t_iExchangeRate.tcFromCurrencyCode <> t_sExchangeRate.tcFromCurrencyCode then do:
                assign vcMessage = #T-13'The system cannot change a key field value':30(56474)T-13#
                       oiReturnStatus = -1.
                <M-14 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  t_sExchangeRate.tcFromCurrencyCode (icArguments), 
                    input  'From Currency Code':U (icFieldName), 
                    input  t_sExchangeRate.tcFromCurrencyCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sExchangeRate.tc_Rowid (icRowid), 
                    input  'QadFin-5713':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
                  return.
            end.
            if t_iExchangeRate.tcToCurrencyCode <> t_sExchangeRate.tcToCurrencyCode then do:
                assign vcMessage = #T-15'The system cannot change a key field value':30(56474)T-15#
                       oiReturnStatus = -1.
                <M-16 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  t_sExchangeRate.tcToCurrencyCode (icArguments), 
                    input  'ToCurrencyCode':U (icFieldName), 
                    input  t_sExchangeRate.tcToCurrencyCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  t_sExchangeRate.tc_Rowid (icRowid), 
                    input  'QadFin-5714':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
                  return.
            end. /* end of if */
         end. /* end of for first */
     end. /* end of if status = c */
    

     if t_sExchangeRate.ExchangeRate <= 0 or
        t_sExchangeRate.ExchangeRate = ?
     then do:
         <M-7 run SetMessage
            (input  #T-9'The exchange rate must be a positive value.':150(1881)T-9# (icMessage), 
             input  '':U (icArguments), 
             input  'tExchangeRate.ExchangeRate':U (icFieldName), 
             input  t_sExchangeRate.ExchangeRate (icFieldValue), 
             input  'E':U (icType), 
             input  3 (iiSeverity), 
             input  t_sExchangeRate.tc_Rowid (icRowid), 
             input  'QADFIN-203':U (icFcMsgNumber), 
             input  '' (icFcExplanation), 
             input  '' (icFcIdentification), 
             input  '' (icFcContext), 
             output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
         assign oiReturnStatus = -1.
     end.

     if t_sExchangeRate.ExchangeRateScale <= 0 or
        t_sExchangeRate.ExchangeRate = ?
     then do:
         <M-8 run SetMessage
            (input  #T-10'The exchange rate factor must be a positive value.':150(1882)T-10# (icMessage), 
             input  '':U (icArguments), 
             input  'tExchangeRate.ExchangeRateScale':U (icFieldName), 
             input  t_sExchangeRate.ExchangeRateScale (icFieldValue), 
             input  'E':U (icType), 
             input  3 (iiSeverity), 
             input  t_sExchangeRate.tc_Rowid (icRowid), 
             input  'QADFIN-2445':U (icFcMsgNumber), 
             input  '' (icFcExplanation), 
             input  '' (icFcIdentification), 
             input  '' (icFcContext), 
             output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
         assign oiReturnStatus = -1.
     end.

     if t_sExchangeRate.tcFromCurrencyCode =
        t_sExchangeRate.tcToCurrencyCode
     then do:
         <M-2 run SetMessage
            (input  #T-11'The last currency code must differ from the first one.':150(1883)T-11# (icMessage), 
             input  '':U (icArguments), 
             input  'tExchangeRate.tcToCurrencyCode':U (icFieldName), 
             input  t_sExchangeRate.tcToCurrencyCode (icFieldValue), 
             input  'E':U (icType), 
             input  3 (iiSeverity), 
             input  t_sExchangeRate.tc_Rowid (icRowid), 
             input  'QADFIN-159':U (icFcMsgNumber), 
             input  '' (icFcExplanation), 
             input  '' (icFcIdentification), 
             input  '' (icFcContext), 
             output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
         assign oiReturnStatus = -1.
     end.
     
     /* find whether there is not defined exchange rate with switched From and To currency code */
     if t_sExchangeRate.tcExchangeRateTypeCode <> 'VAT':U
     then do:                    
        assign vlViceVersaExists = false.
        if can-find(first bExchangeRate where bExchangeRate.tc_Status              <> "D":U AND
                                              bExchangeRate.tcFromCurrencyCode     = t_sExchangeRate.tcToCurrencyCode   and
                                              bExchangeRate.tcToCurrencyCode       = t_sExchangeRate.tcFromCurrencyCode and
                                              bExchangeRate.tcExchangeRateTypeCode = t_sExchangeRate.tcExchangeRateTypeCode)
        then assign vlViceVersaExists = true.
        if not vlViceVersaExists
        then do:
            <Q-5 assign vlFcQueryRecordsAvailable = ExchangeRatePrim (NoCache)
               (input ?, (ValidDateFrom)
                input t_sExchangeRate.ToCurrency_ID, (FromCurrencyId)
                input t_sExchangeRate.FromCurrency_ID, (ToCurrencyId)
                input t_sExchangeRate.ExchangeRateType_ID, (ExchangeRateTypeId)
                input ?, (ExchangeRateId)
                input viCompanyId, (CompanyId)
                input ?, (FromCurrencyCode)
                input ?, (ToCurrencyCode)
                input ?, (ExchangeRateTypeCode)) in BExchangeRate >
            if vlFcQueryRecordsAvailable <> false
            then assign vlViceVersaExists = true.
        end.    
        if vlViceVersaExists
        then do:
            assign vcMessage = trim(substitute(#T-12'The system cannot specify this exchange rate because it has already been defined in the opposite direction, that is, from currency &1 to currency &2.':255(1884)T-12#, t_sExchangeRate.tcToCurrencyCode, t_sExchangeRate.tcFromCurrencyCode)).
            <M-6 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tExchangeRate.tcFromCurrencyCode':U (icFieldName), 
                input  t_sExchangeRate.tcFromCurrencyCode (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  t_sExchangeRate.tc_Rowid (icRowid), 
                input  'QADFIN-172':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
            assign oiReturnStatus = -1.
        end. /* end of if vlViceVersaExists */
    end. /* end of if t_sExchangeRate.tcExchangeRateTypeCode <> 'VAT' */
    
    /* The Valid Till Date can only be different from the biggest date when the exchange rate type allows it */
    <Q-29 run ExchangeRateTypeByCode (all) (Read) (NoCache)
           (input t_sExchangeRate.tcExchangeRateTypeCode, (ExchangeRateTypeCode)
            output dataset tqExchangeRateTypeByCode) in BExchangeRateType >
    find first tqExchangeRateTypeByCode no-error.

    if available tqExchangeRateTypeByCode                           and
       tqExchangeRateTypeByCode.tlExchangeRateTypeIsTillDate = true and
       t_sExchangeRate.ExchangeRateValidDateTill             = vtBiggestDate
    then do:
        assign vcDatetemp = <M-87 DisplayDate  (input  t_sExchangeRate.ExchangeRateValidDateTill (itDate)) in BExchangeRate>.
        assign vcMessage      = trim(substitute(#T-30'Valid To Date (&1) can only be different from the 12/31/9999  when the exchange rate type (&2) is defined with Use Validity End Date.':255(999890739)T-30#,
                                vcDatetemp,
                                t_sExchangeRate.tcExchangeRateTypeCode))
               oiReturnStatus = -1.
            <M-18 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tExchangeRate.ExchangeRateValidDateTill':U (icFieldName), 
                input  vcDatetemp (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  t_sExchangeRate.tc_Rowid (icRowid), 
                input  'QadFin-9190':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  '':U (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
    end. /* end of if t_sExchangeRate.ExchangeRateValidDateTill <> ? */

    /* The till date should be always bigger or equal to the valid from date */
    if t_sExchangeRate.ExchangeRateValidDateTill <> ? and
       t_sExchangeRate.ExchangeRateValidDateFrom <> ? and
       t_sExchangeRate.ExchangeRateValidDateTill < t_sExchangeRate.ExchangeRateValidDateFrom
    then do:
        assign vcDatetemp  = <M-81 DisplayDate  (input  t_sExchangeRate.ExchangeRateValidDateTill (itDate)) in BExchangeRate>
               vcDatetemp1 = <M-51 DisplayDate  (input  t_sExchangeRate.ExchangeRateValidDateFrom (itDate)) in BExchangeRate>.
        assign vcMessage      = trim(substitute(#T-31'The Valid To Date (&1) can not be earlier than Valid From date (&2).':255(999890743)T-31#,
                                     vcDatetemp,
                                     vcDatetemp1))
               oiReturnStatus = -1.
        <M-21 run SetMessage
           (input  vcMessage (icMessage), 
            input  '':U (icArguments), 
            input  'tExchangeRate.ExchangeRateValidDateTill':U (icFieldName), 
            input  vcDatetemp (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  t_sExchangeRate.tc_Rowid (icRowid), 
            input  'QadFin-9192':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
    end. /* end of if t_sExchangeRate.ExchangeRateValidDateTill <> ? and */

    /* Check the existence of time gap between exchange rates */
    if available tqExchangeRateTypeByCode and
       tqExchangeRateTypeByCode.tlExchangeRateTypeIsTillDate = true
    then do:
        assign vcMessage = "":U.
        /* check from the t_s table */
        find first btsCheckExchangeRate where 
                   btsCheckExchangeRate.SharedSet_ID               = t_sExchangeRate.SharedSet_ID                   and
                   btsCheckExchangeRate.ExchangeRateType_ID        = t_sExchangeRate.ExchangeRateType_ID            and
                   btsCheckExchangeRate.tc_Rowid                  <> t_sExchangeRate.tc_Rowid                       and
                   btsCheckExchangeRate.FromCurrency_ID            = t_sExchangeRate.FromCurrency_ID                and
                   btsCheckExchangeRate.ToCurrency_ID              = t_sExchangeRate.ToCurrency_ID                  and
                 ((btsCheckExchangeRate.ExchangeRateValidDateFrom <= t_sExchangeRate.ExchangeRateValidDateTill and
                   btsCheckExchangeRate.ExchangeRateValidDateFrom >= t_sExchangeRate.ExchangeRateValidDateFrom)   or
                  (btsCheckExchangeRate.ExchangeRateValidDateTill <= t_sExchangeRate.ExchangeRateValidDateTill and
                   btsCheckExchangeRate.ExchangeRateValidDateTill >= t_sExchangeRate.ExchangeRateValidDateFrom))
                   no-error.
        if available btsCheckExchangeRate
        then do:
            assign vcMessage      = trim(substitute(#T-32'There is an overlap between the validity periods of two consecutive exchanges rates betweeen &1 and &2.  This is not allowed.':255(465941571)T-32#,
                                         t_sExchangeRate.tcFromCurrencyCode,
                                         t_sExchangeRate.tcToCurrencyCode)) + chr(10) +
                                    trim(substitute(#T-94'Check the exchange rates that start from &1 and &2 of type &3.':255(17499124)T-94#,
                                         string(t_sExchangeRate.ExchangeRateValidDateFrom),
                                         string(btsCheckExchangeRate.ExchangeRateValidDateFrom),
                                         t_sExchangeRate.tcExchangeRateTypeCode)).
        end. /* if available btsCheckExchangeRate */
        else do:
            <Q-91 assign vlFcQueryRecordsAvailable = ExchangeRateForCheckOverlap (NoCache)
               (input t_sExchangeRate.SharedSet_ID, (SharedSetId)
                input t_sExchangeRate.ExchangeRateType_ID, (ExchangeRateTypeId)
                input t_sExchangeRate.FromCurrency_ID, (FromCurrencyId)
                input t_sExchangeRate.ToCurrency_ID, (ToCurrencyId)
                input t_sExchangeRate.ExchangeRateValidDateFrom, (ValidDateFrom)
                input t_sExchangeRate.ExchangeRateValidDateTill, (ValidDateTill)
                input t_sExchangeRate.ExchangeRate_ID, (NotExchangeRateId)) in BExchangeRate >
            if vlFcQueryRecordsAvailable <> false
            then do:
                assign vcDatetemp = <M-92 DisplayDate  (input  t_sExchangeRate.ExchangeRateValidDateFrom (itDate)) in BExchangeRate>.
                assign vcMessage = trim(substitute(#T-62'There is an overlap between the validity periods of two consecutive exchanges rates betweeen &1 and &2.  This is not allowed.':255(465941571)T-62#,
                                         t_sExchangeRate.tcFromCurrencyCode,
                                         t_sExchangeRate.tcToCurrencyCode)) + chr(10) +
                                    trim(substitute(#T-60'Check the exchange rate that starts from &1 of type &2.':255(15132487)T-60#,
                                         vcDatetemp,
                                         t_sExchangeRate.tcExchangeRateTypeCode)).
            end. /* if vlFcQueryRecordsAvailable*/
        end. /* else do: */

        if vcMessage <> "":U
        then do:
            assign oiReturnStatus = -1.
            <M-26 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tExchangeRate.ExchangeRateValidDateFrom':U (icFieldName), 
                input  vcDatetemp (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  t_sExchangeRate.tc_Rowid (icRowid), 
                input  'QadFin-9247':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  '':U (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BExchangeRate>
        end. /* end of if vcMessage <> "" */
    end. /* end of if available */
end. /* end of for each */
   
/* stop queries */
<Q-24 run ExchangeRateTypeByCode  (Stop) in BExchangeRateType >