Текущее время: Пт, апр 19 2024, 06:28

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: ФМ: склонение единиц измерения в зависимости от количества
СообщениеДобавлено: Вт, май 13 2014, 13:27 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, окт 31 2008, 15:58
Сообщения: 70
Добрый день, коллеги.
Недавно мне потребовалось найти ФМ для склонения единиц измерения
в зависимости от количества.

Например, {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.


Буду рад, если кому-нибудь пригодиться.

_________________
С Уважением, Абрамов Виктор.
The devil is in the detail.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ: склонение единиц измерения в зависимости от количества
СообщениеДобавлено: Чт, сен 15 2016, 20:43 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
Автор молодец.
В сап абапе и джаве используется ICU4c который всё это умеет делать но к сожалению скомпилирована очень древняя версия, стандартом не использовать.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ: склонение единиц измерения в зависимости от количества
СообщениеДобавлено: Чт, сен 15 2016, 20:50 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
чтобы не быть голословным вот пример ICU4c версии 57:

шаблон = "{total, plural, =0{Нет данных в сообщении загрузки} other{" +
"{good, plural, =0{Нет успешных инвестиционных проектов} =1{Один инвестиционный проект успешно} one{{good, number} инвестиционный проект успешно} =2{Два инвестиционных проекта успешно} few{{good, number} инвестиционных проекта успешно} many{{good, number} инвестиционных проектов успешно} other{{good, number} инвестиционные проекты} }" +
"{bad, plural, =0{} one{ и адын с ошибкой} other{ и {bad, number} с ошибкой} } " +
"{total, plural, one{загружен} other{загружено}} в SAP MDM " +
"за {seconds, duration} {seconds, plural, one{секунду} two{секунды} few{секунды} other{секунд} }" +
"}}";


результат:
0 0 Нет данных в сообщении загрузки
0 1 Нет успешных инвестиционных проектов и адын с ошибкой загружен в SAP MDM за 0 секунд
1 0 Один инвестиционный проект успешно загружен в SAP MDM за 2 секунды
1 1 Один инвестиционный проект успешно и адын с ошибкой загружено в SAP MDM за 3 секунды
10 10 10 инвестиционных проектов успешно и 10 с ошибкой загружено в SAP MDM за 4 секунды
0 29 Нет успешных инвестиционных проектов и 29 с ошибкой загружено в SAP MDM за 890 секунд
1 28 Один инвестиционный проект успешно и 28 с ошибкой загружено в SAP MDM за 475 секунд
2 27 Два инвестиционных проекта успешно и 27 с ошибкой загружено в SAP MDM за 189 секунд
3 26 3 инвестиционных проекта успешно и 26 с ошибкой загружено в SAP MDM за 642 секунды
4 25 4 инвестиционных проекта успешно и 25 с ошибкой загружено в SAP MDM за 408 секунд
5 24 5 инвестиционных проектов успешно и 24 с ошибкой загружено в SAP MDM за 902 секунды
6 23 6 инвестиционных проектов успешно и 23 с ошибкой загружено в SAP MDM за 625 секунд
7 22 7 инвестиционных проектов успешно и 22 с ошибкой загружено в SAP MDM за 866 секунд
8 21 8 инвестиционных проектов успешно и адын с ошибкой загружено в SAP MDM за 670 секунд
9 20 9 инвестиционных проектов успешно и 20 с ошибкой загружено в SAP MDM за 442 секунды
10 19 10 инвестиционных проектов успешно и 19 с ошибкой загружено в SAP MDM за 358 секунд
11 18 11 инвестиционных проектов успешно и 18 с ошибкой загружено в SAP MDM за 272 секунды
12 17 12 инвестиционных проектов успешно и 17 с ошибкой загружено в SAP MDM за 229 секунд
13 16 13 инвестиционных проектов успешно и 16 с ошибкой загружено в SAP MDM за 500 секунд
14 15 14 инвестиционных проектов успешно и 15 с ошибкой загружено в SAP MDM за 183 секунды
15 14 15 инвестиционных проектов успешно и 14 с ошибкой загружено в SAP MDM за 724 секунды
16 13 16 инвестиционных проектов успешно и 13 с ошибкой загружено в SAP MDM за 939 секунд
17 12 17 инвестиционных проектов успешно и 12 с ошибкой загружено в SAP MDM за 859 секунд
18 11 18 инвестиционных проектов успешно и 11 с ошибкой загружено в SAP MDM за 738 секунд
19 10 19 инвестиционных проектов успешно и 10 с ошибкой загружено в SAP MDM за 796 секунд
20 9 20 инвестиционных проектов успешно и 9 с ошибкой загружено в SAP MDM за 571 секунду
21 8 21 инвестиционный проект успешно и 8 с ошибкой загружено в SAP MDM за 795 секунд
22 7 22 инвестиционных проекта успешно и 7 с ошибкой загружено в SAP MDM за 995 секунд
23 6 23 инвестиционных проекта успешно и 6 с ошибкой загружено в SAP MDM за 408 секунд
24 5 24 инвестиционных проекта успешно и 5 с ошибкой загружено в SAP MDM за 517 секунд
25 4 25 инвестиционных проектов успешно и 4 с ошибкой загружено в SAP MDM за 194 секунды
26 3 26 инвестиционных проектов успешно и 3 с ошибкой загружено в SAP MDM за 609 секунд
27 2 27 инвестиционных проектов успешно и 2 с ошибкой загружено в SAP MDM за 100 секунд
28 1 28 инвестиционных проектов успешно и адын с ошибкой загружено в SAP MDM за 708 секунд
29 0 29 инвестиционных проектов успешно загружено в SAP MDM за 125 секунд

На входе кроме шаблона ещё словарь {"good": число, "bad":число, "seconds":число}.

Это всё в стандарте ICU, не надо писать велосипедов и в принципе рано или поздно в САПе обновят версию и можно будет использовать.
Для склонения фамилий конечно правила придётся либо генерировать из другого инструмента либо использовать коммерческие решения.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ: склонение единиц измерения в зависимости от количества
СообщениеДобавлено: Чт, сен 15 2016, 20:53 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
Ещё поясню, что ICU написан под тыщи языков и помимо склонений там есть и суммы прописью, и часть ЕИ (времени), и всё это постоянно патчится и развивается.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB