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
| oiReturnStatus | output | integer | |
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 >