MIGO: выбор кода материала по серийному номеру
В статье приведено описание реализации в транзакции MIGO механизма работы, при котором в поле ввода кода материала сканировался (вводился) бы серийный номер; после чего система выполняет поиск кода материала (ОЗМ) по такой же схеме, как и поиск ОЗМ при вводе части краткого текста наименования.
В транзакции MIGO процедура ввода значения в поле «Материал» позволяет вводить (вместо кода) часть краткого текста наименования материала. Система, по нажатию кнопки ввода, попытается автоматически найти код материала, краткий текст наименования которого контекстно совпадает с введёнными данными. Если найден только один соответствующий код материал, то он будет автоматически «подставлен» в поле ввода, а если будет найдено несколько подходящих материалов, то на экране появится диалоговое окно со списком материалов, которые подходят под введённую маску. Например, вводим часть имени (краткого текста наименования) «d-link», Рис.1, затем нажимаем ввод.
Рис.1.
Так как в системе определены несколько различных материалов, в кратком тексте наименования которых есть текст «d-link», то будет выведено окно со списком таких материалов, Рис.2.
Рис.2.
В диалоговом окне выбираем нужный нам код материала и копируем его: или сделав на нужной позиции двойной клик мышью, или выбрав позицию и нажав кнопку копирования. Код материала и краткий текст его наименования будут перенесены в соответствующие поля ввода.
Рис.3.
При использовании шрих-кодирования отсканированный код материала (ОЗМ) подставляется в поле ввода, после чего по нажатию кнопки «Ввод» система заполнит данные материала, как на Рис.3. Большинство сканеров в настоящее время имеют возможность передачи так называемого завершающего символа, например, это код #13, т.е. имитация нажатия клавиши «Ввод». Поэтому после сканирования система получает так же команду подтверждения ввода данных, что автоматически запускает процесс поиска заданного ОЗМ. Однако, что делать, если мы не используем дополнительное штрих-кодирование входящих материалов, т.е. наклейка внутренних кодов ОЗМ не производится, соответственно для идентификации материалов мы имеем только серийные номера производителей (которые подходят для обработки сканерами ввода). Однако, у различных материалов серийные номера могут совпадать.
Решением задачи определения кода материала по серийному номеру обычно становилось написание собственной диалоговой программы, которая принимала на вход сканированные серийные номера, затем к этим номерам определялись коды ОЗМ, с проверкой ситуации, когда найден более чем один код ОЗМ. После этого «программно формировался» документ движения материала, например, с использованием пакетного ввода или BAPI-функции BAPI_GOODSMVT_CREATE. На первый взгляд, программа получается несложной, однако, если попытаться её сделать универсальной, т.е. с возможностью выбора вида движения, операции и т.д., то это может вылиться в переписывание транзакции MIGO.
Я задался вопросом, нельзя ли реализовать в транзакции MIGO механизм работы, при котором в поле ввода кода материала сканировался (вводился) бы серийный номер. После этого система выполняла бы поиск кода материала (ОЗМ) по такой же схеме, как и поиск ОЗМ при вводе части краткого текста наименования. Оказалось, что это возможно и довольно просто реализовать.
Итак, за поиск кода ОЗМ по части краткого текста наименования материала отвечает функция: MM_MAKTX_CONVERT, которая вызывается внутри транзакции MIGO, при этом она возвращает найденный ОЗМ или, если материалов найдено несколько, выдаёт окно со списком «подходящих» кодов материала, Рис.2 выше. В этой функции есть такая вставка как:
ENHANCEMENT-SECTION MM_MAKTX_CONVERT_03 SPOTS ES_SAPLMM_CONVERSION.
В этой секции используется следующий программный код для преобразования кода материала:
ENHANCEMENT-SECTION MM_MAKTX_CONVERT_03 SPOTS ES_SAPLMM_CONVERSION.
l_matnr = l_maktx.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = l_matnr
IMPORTING
output = l_matnr.
END-ENHANCEMENT-SECTION.
Мы сделаем замену данной секции на свой код, скопировав сам вызов, а далее допишем пару десятков строк кода, реализующих поиск кода ОЗМ по введенному серийному номеру. Так как мне хотелось оставить возможность стандартного поиска, то я сделал включение вызова поиска по серийному номеру, если в параметрах пользователя указана параметр YTSH_MIGO_SERNR_SEL и его значение равно «Х», в противном случае, будет использоваться стандартный поиск ОЗМ.
Иными словами я реализовал следующий механизм: поиск выполняется по серийному номеру; если код материала найден, то он возвращается транзакцию MIGO; если найдено несколько кодов ОЗМ, то они будут предложены для выбора.
Если же ничего не будет найдено, то система будет считать, что это было сканирование не серийного номера, а сканирование кода ОЗМ и передаст управление стандартному поиску, который уже попробует сам определиться с кодом ОЗМ. Если и стандартный поиск ничего не найдёт, то будет выдано стандартное сообщение, что данные не найдены. ABAP-кода немного, но результат получился хороший.
ENHANCEMENT 1 YTSH_MIGO_MM_MAKTX_CONVERT. "active version
* Оставляем стандартный вызов преобразования
l_matnr = l_maktx.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = l_matnr
IMPORTING
output = l_matnr.
* ------------------------------------------------
* Код выполняющий поиск ОЗМ по серийному номеру
* ------------------------------------------------
DATA: ytsh_param_select(1) TYPE c,
ytsh_sernr LIKE equi-sernr.
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти