Текущее время: Чт, апр 18 2024, 21:58

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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