Маска ввода для номера телефона

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

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

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

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

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

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

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

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

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

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

Итак!

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

  1. FUNCTION zconversion_exit_zphon_input.
  2. *"----------------------------------------------------------------------
  3. *"*"Локальный интерфейс:
  4. *" IMPORTING
  5. *" VALUE(INPUT) TYPE CLIKE
  6. *" EXPORTING
  7. *" VALUE(OUTPUT) TYPE CLIKE
  8. *"----------------------------------------------------------------------
  9. *1234567890
  10. *+7(123)456-78-90
  11. *1234567890123456
  12.  
  13. DATA: lv_external(16) TYPE c.
  14.  
  15. lv_external = INPUT.
  16.  
  17. REPLACE ALL occurrences OF '+7' IN lv_external WITH ' '.
  18. REPLACE ALL occurrences OF '-' IN lv_external WITH ' '.
  19. REPLACE ALL occurrences OF '(' IN lv_external WITH ' '.
  20. REPLACE ALL occurrences OF ')' IN lv_external WITH ' '.
  21. REPLACE ALL occurrences OF '_' IN lv_external WITH ' '.
  22.  
  23. IF lv_external CN '1234567890 '.
  24. MESSAGE 'Недопустимые знаки для номера телефона' TYPE 'E'.
  25.  
  26. CONDENSE lv_external NO-GAPS.
  27.  
  28. IF STRLEN( lv_external ) = 6.
  29. CONCATENATE '7172' lv_external INTO lv_external.
  30. IF STRLEN( lv_external ) = 7.
  31. CONCATENATE '727' lv_external INTO lv_external.
  32.  
  33. DATA: lv_zero TYPE i.
  34. lv_zero = 10 - STRLEN( lv_external ).
  35. DO lv_zero TIMES.
  36. CONCATENATE '0' lv_external INTO lv_external.
  37.  
  38. OUTPUT = lv_external(10).
  39.  

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

  1. FUNCTION zconversion_exit_zphon_output.
  2. *"----------------------------------------------------------------------
  3. *"*"Локальный интерфейс:
  4. *" IMPORTING
  5. *" VALUE(INPUT) TYPE CLIKE
  6. *" EXPORTING
  7. *" VALUE(OUTPUT) TYPE CLIKE
  8. *"----------------------------------------------------------------------
  9. *+7(123)456-78-90
  10. *1234567890123456
  11.  
  12. DATA: lv_internal(16) TYPE c.
  13.  
  14. lv_internal = INPUT.
  15.  
  16. IF STRLEN( lv_internal ) = 6.
  17. CONCATENATE '7172' lv_internal INTO lv_internal.
  18. IF STRLEN( lv_internal ) = 7.
  19. CONCATENATE '727' lv_internal INTO lv_internal.
  20.  
  21. CASE lv_internal(3).
  22. WHEN '700' OR '701' OR '702' OR '707' OR '777' OR '727'.
  23. CONCATENATE '+7(' lv_internal(3) ')' lv_internal+3(3) '-' lv_internal+6(2) '-' lv_internal+8(2) INTO OUTPUT.
  24. WHEN OTHERS.
  25. CONCATENATE '+7(' lv_internal(4) ')' lv_internal+4(2) '-' lv_internal+6(2) '-' lv_internal+8(2) INTO OUTPUT.
  26.  

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

image_thumb.png

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

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

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

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

  1. report zivab_test1.
  2. parameters: p_phone type zphone default7011234567.
  3. parameters: p_phone2 type zphone default7779876543.
  4. write: / p_phone.
  5. write: / p_phone using no edit mask.

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

image_thumb1.png

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

image_thumb2.png

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

Комментарии