ABAP и маска для ввода

Есть в природе так называемые маски для ввода, но в SAP нет такого понятия.

Вместо этого в ABAP есть такое свойство домена как “Conversion exit” или “Подпрограмма преобразования”.

В чём фикус – признаётся разница между отображением данных и внутренним хранением. Примеры:

  • Внутренний формат хранения даты = YYYYMMDD, но показывается как DD.MM.YYYY
  • Дату можно вводить без разделителей и она преобразовывается к нужному формату
  • Счёт ГК хранится с полным комплектом лидирующих нулей, а показывается без них
  • Счёт ГК можно вводить с лидирующими нулями, которые исчезнут после ввода

 

Для реализации такого поведения требуется два фрагмента кода:

  1. Преобразование из внутреннего формата хранения в формат ввода/вывода
  2. Преобразование из формата ввода/вывода во внутренний формат хранения

 

Для примера разберём алгоритм поведения альфа-преобразования:

  1. Берём INTERNAL (0000101101), убираем оттуда лидирующие нули, кладём в EXTERNAL (101101)
  2. Берём EXTERNAL (101101), если поле содержит только цифры, то сдвигаем все поля вправо, заполняя пустое место символами нулей и кладём в INTERNAL (0000101101)

 

Для полноты демонстрации реализуем кое-что веселее альфа-преобразования – номер телефона:

  • Принимаем следующий  формат вывода: +7(701)123-45-67
  • Принимаем следующий внутренний формат: 10 значащих цифр 7011234567

 

Итак!

1. Функциональный модуль CONVERSION_EXIT_ZPHON_INPUT

 

2. Функциональный модуль CONVERSION_EXIT_ZPHON_OUTPUT

 

3. Создаём домен

Свойства домена

Обратите внимания на разницу между типом поля (10) и длинной вывода (16).

В нашем домене пять знаков подпрограммы (ZPHON) преобразования должны быть равны пяти знакам в именах двух наших функциональных модулей. Это стандартная кодировка:

  • CONVERSION_EXIT_ZZZZZ_INPUT – преобразовывает из внешнего формата во внутренний
  • CONVERSION_EXIT_ZZZZZ_OUTPUT – преобразовывает из внутреннего формата во внешний

 

Для тестирования напишем простую программку:

report zivab_test1.
parameters: p_phone type zphone default ‘7011234567’.
parameters: p_phone2 type zphone default ‘7779876543’.
write: / p_phone.
write: / p_phone using no edit mask.

 

На селективном экране уже видно, что выводимый формат отличается от значений, присвоенных в коде программы:

Переменная на экране

И если запустить, то можно будет увидеть оба варианта первого параметра:

Вывод на экран

Волшебные слова “using no edit mask” предназначены для редкой необходимости вывести именно техническое содержимое поля.

Comment (1)

  1. А еще очень удобно бывает создать conversion exit output и добавить его в field catalog alv. Например интервал времени в секундах – тип int4, а отображается “3 сут. 22 ч. 12 м.”, при этом корректно работает суммирование и в строке сумм также получаем красивый вывод. Спасибо за пост!

Добавить комментарий

Ваш адрес email не будет опубликован.