Добрый день, коллеги.
Недавно мне потребовалось найти ФМ для склонения единиц измерения
в зависимости от количества.
Например, {1 год; 2 года; 10 лет}{1 месяц; 2 месяца; 10 месяцев} и т.д.
В теме
http://sapboard.ru/forum/viewtopic.php?f=13&t=83467 было что-то похожее, но суть не та.
На scn аналогах ничего предложено не было.
Предлагаю свой вариант реализации на основе согласования:
Code:
FUNCTION Z_AMOUNT_IN_WORDS.
*"--------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(IV_NUM) TYPE INT4
*" VALUE(IV_NOMINATIVE) TYPE ZMO_HCM0633_NOMINATIVE
*" VALUE(IV_GENITIVE) TYPE ZMO_HCM0633_GENITIVE
*" VALUE(IV_GENITIVE_PL) TYPE ZMO_HCM0633_ABLATIVE
*" EXPORTING
*" REFERENCE(EV_STR) TYPE STRING
*" REFERENCE(EV_WORD) TYPE STRING
*"--------------------------------------------------------------------
*& Разработчик Абрамов В.В.
*& Дата создания 17.04.2014
*& Краткое описание Согласование единиц изм. с кол-вом
*&---------------------------------------------------------------------*
DATA: lv_n TYPE i.
DATA: lv_n1 TYPE i.
DATA: lv_char40 TYPE char40.
CLEAR:
ev_str,
ev_word.
lv_char40 = iv_num.
CONDENSE lv_char40.
lv_n = abs( iv_num ) MOD 100 .
lv_n1 = lv_n MOD 10.
IF lv_n > 10 AND lv_n < 20.
CONCATENATE lv_char40 iv_genitive_pl
INTO ev_str SEPARATED BY space.
ev_word = iv_genitive_pl.
RETURN.
ENDIF.
IF lv_n1 > 1 AND lv_n1 < 5.
CONCATENATE lv_char40 iv_genitive
INTO ev_str SEPARATED BY space.
ev_word = iv_genitive.
RETURN.
ENDIF.
IF lv_n1 = 1.
CONCATENATE lv_char40 iv_nominative
INTO ev_str SEPARATED BY space.
ev_word = iv_nominative.
RETURN.
ENDIF.
CONCATENATE lv_char40 iv_genitive_pl
INTO ev_str SEPARATED BY space.
ev_word = iv_genitive_pl.
RETURN.
ENDFUNCTION.
Тестовый пример:
Code:
REPORT Z_AMOUNT_IN_WORDS.
DATA: lv_str TYPE string,
lv_word TYPE string.
DATA: lv_i TYPE i.
DO 101 TIMES.
CALL FUNCTION 'Z_AMOUNT_IN_WORDS'
EXPORTING
iv_num = lv_i
iv_nominative = 'Год'
iv_genitive_pl = 'Лет'
iv_genitive = 'Года'
IMPORTING
ev_str = lv_str
ev_word = lv_word.
WRITE: / lv_str .
ADD 1 TO lv_i.
ENDDO.
CLEAR: lv_i.
DO 13 TIMES.
CALL FUNCTION 'Z_AMOUNT_IN_WORDS'
EXPORTING
iv_num = lv_i
iv_nominative = 'Месяц'
iv_genitive = 'Месяца'
iv_genitive_pl = 'Месяцев'
IMPORTING
ev_str = lv_str
ev_word = lv_word.
WRITE: / lv_str .
ADD 1 TO lv_i.
ENDDO.
CLEAR: lv_i.
DO 32 TIMES.
CALL FUNCTION 'Z_AMOUNT_IN_WORDS'
EXPORTING
iv_num = lv_i
iv_nominative = 'День'
iv_genitive = 'Дня'
iv_genitive_pl = 'Дней'
IMPORTING
ev_str = lv_str
ev_word = lv_word.
WRITE: / lv_str .
ADD 1 TO lv_i.
ENDDO.
Буду рад, если кому-нибудь пригодиться.