Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Werwolf от Ноябрь 20, 2008, 09:15:24 am
-
В процессе написания формул для новой калькуляции столкнулся с заморочкой, что стандартные ФМ для получения курса валюты возвращают обратный курс и для того, чтобы получить нормальный курс (например доллара) в рублях нужно разделить 1 на полученный курс. Это неудобство натолкнуло на мысль написать свой ФМ.
PS Это был один из первых опытов, поэтому если у кого появятся предложения и замечания буду рад.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(CLIENT) LIKE SY-MANDT DEFAULT SY-MANDT
*" VALUE(DATE) LIKE SYST-DATUM
*" VALUE(FOREIGN_CURRENCY)
*" VALUE(LOCAL_CURRENCY)
*" VALUE(TYPE_OF_KURS) DEFAULT 'MRUB'
*" EXPORTING
*" REFERENCE(KURS) LIKE TCURR-UKURS
*" REFERENCE(DATE_OF_KURS) TYPE D
*" REFERENCE(ERROR) TYPE C
*" EXCEPTIONS
*" NO_KURS_FOUND
*"----------------------------------------------------------------------
*{ INSERT TSTK902643 1
*Конвертируем дату в удобоваримую для таблицы TCURR
DATA: DATC(8) TYPE C.
DATA: gs_tcurr TYPE tcurr.
DATA: t_gdatu like tcurr-gdatu.
if FOREIGN_CURRENCY ne LOCAL_CURRENCY.
CONVERT DATE date INTO INVERTED-DATE datc.
*Выбираем из таблицы TCURR валютный курс по заданной дате
SELECT SINGLE * FROM tcurr INTO gs_tcurr
WHERE kurst eq Type_of_kurs
AND fcurr eq FOREIGN_CURRENCY
AND tcurr eq LOCAL_CURRENCY
AND gdatu eq datc
.
IF sy-subrc eq 0.
kurs = gs_tcurr-ukurs.
CONVERT INVERTED-DATE gs_tcurr-gdatu INTO DATE date_of_kurs.
else.
*На введенную дату курс не введен, поэтому ищем последний введенный курс
CLEAR t_gdatu.
SELECT min( gdatu ) FROM tcurr INTO t_gdatu
WHERE kurst eq Type_of_kurs
AND fcurr eq FOREIGN_CURRENCY
AND tcurr eq LOCAL_CURRENCY
AND gdatu ge datc
.
IF t_gdatu gt 0.
SELECT SINGLE * FROM tcurr INTO gs_tcurr
WHERE kurst eq Type_of_kurs
AND fcurr eq FOREIGN_CURRENCY
AND tcurr eq LOCAL_CURRENCY
AND gdatu eq t_gdatu
.
IF sy-subrc eq 0.
kurs = gs_tcurr-ukurs.
CONVERT INVERTED-DATE gs_tcurr-gdatu INTO DATE date_of_kurs.
endif.
ENDIF.
ENDIF.
ELSE.
kurs = 1.
endif.
CHECK kurs le 0.
error = 'Курс не найден!'.
*} INSERT
ENDFUNCTION.
-
CONVERT_TO_LOCAL_CURRENCY - Собственно говоря не только получает курс, но и сразу делает пересчет из одной валюты в другую, что наверное полезнее будет, чем просто читать сам курс пересчета.
DATA: l_amounts TYPE mseg-dmbtr,
l_locl_factor(5) TYPE n,
l_forg_factor(5) TYPE n.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = sy-datum
foreign_amount = 100 "Сумма в USD
foreign_currency = 'USD'
local_currency = 'UAH'
type_of_rate = 'M'
read_tcurr = 'X'
IMPORTING
* EXCHANGE_RATE =
foreign_factor = l_forg_factor
local_amount = l_amounts
local_factor = l_locl_factor
* EXCHANGE_RATEX =
* FIXED_RATE =
* DERIVED_RATE_TYPE =
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
no_spread_found = 4
derived_2_times = 5
OTHERS = 6.
l_amounts = l_amounts * l_forg_factor.
Особенностью будет то, что нужно полученный результат умножить на коэффициент foreign_factor. Вроде как работает ;)