Автор Тема: ФМ для получения курса валюты  (Прочитано 13063 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Werwolf

  • Newbie
  • *
  • Сообщений: 1
  • Репутация: +0/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
ФМ для получения курса валюты
« : Ноябрь 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.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
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. Вроде как работает  ;)

Sapforum.Biz