Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Werwolf от Ноябрь 20, 2008, 09:15:24 am

Название: ФМ для получения курса валюты
Отправлено: Werwolf от Ноябрь 20, 2008, 09:15:24 am
В процессе написания формул для новой калькуляции столкнулся с заморочкой, что стандартные ФМ для получения курса валюты возвращают обратный курс и для того, чтобы получить нормальный курс (например доллара) в рублях нужно разделить 1 на полученный курс. Это неудобство натолкнуло на мысль написать свой ФМ.

PS Это был один из первых опытов, поэтому если у кого появятся предложения и замечания буду рад.

Код: You are not allowed to view links. Register or Login
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  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.
Название: Re: ФМ для получения курса валюты (CONVERT_TO_LOCAL_CURRENCY)
Отправлено: Uukrul от Март 04, 2009, 03:27:03 pm
CONVERT_TO_LOCAL_CURRENCY - Собственно говоря не только получает курс, но и сразу делает пересчет из одной валюты в другую, что наверное полезнее будет, чем просто читать сам курс пересчета.
Код: You are not allowed to view links. Register or Login
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. Вроде как работает  ;)