Автор Тема: Выбор ОЗМ в транзакции MIGO по серийным номерам (из проектного)  (Прочитано 21362 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Так сказать свежачок-с... из последнего проектного, привет всем ММ-щикам… а теперь поехали.

В транзакции MIGO поле ввода материала приобрело одну интересную фишку, а именно когда мы вводим в этом поле вместо кода часть наименования материала, то система по нажатию кнопки ввода пытается автоматически найти код материала, краткий текст которого подходит под введенные данные. Если код материал найден только один, то он тут же будет подставлен в поле ввода, а если материалов найдено несколько, то будет выведено диалоговое окно со списком материалов, которые подходят под введенную маску, например, вводим часть имени, например D-Link, рисунок MIGO-01.png, затем нажимаем ввод.

Так как в системе определены несколько различных материалов, в тексте которых есть текст d-link, то будет выведено окно со списком таких материалов, рисунок MIGO-02.png.

В диалоговом окне вбираем необходимый нам код материала и копируем его или сделав на нужной позиции двойной клик мышью или выбрать позицию и нажать кнопку копирования. Код материала и его текст будут перенесены в соответствующие поля ввода.

Лирическое отступление: Рассмотрим общий вариант работы с материалами в системе. Предполагаем, что работа выполняется с материалами относящимся к электронике, такие материалы в системе SAP, обычно характеризуются кодом  материала – это то, что называется основной записью материала (ОЗМ) и серийным номером, т.е. второй идентификатор материала. Такая информация вносится в систему и затем используется при операциях, т.е. пользователь указывает код материала и его серийный номер при любых операциях с этим материалом.

Вроде бы все достаточно логично и удобно, однако, часто коды материалов, которые заведены в систему, не совпадают с кодами материалов производителей, т.е. в компании используется обычно своя кодировка для ОЗМ. Поэтому, при приемке материалов на склад, в компании обычно стараются провести дополнительное штрих-кодирование, путем наклейки на входящие материалы внутренних кодов ОЗМ, для последующего считывания этой информации при работе, так как сканеры штрих-кодов вещь практически обыденная во многих  компаниях. Что же касается серийных номеров, то с ними как раз часто происходит все наоборот, т.е. используются стандартные, определенные производителями оборудования серийные номера, так как уникальность серийного номера в системе проверяется на уровне кода материала, т.е. в общем виде, два разных кода материала могут иметь одинаковые коды серийных номеров.



Теперь вернемся к вводу материалов в позиции документов ММ. Как было описано выше, новая, с версии 4.6, транзакция MIGO, немного упрощает поиск и ввод кода материала в позицию документа. При использовании дополнительного шрих-кодирования для ОЗМ, довольно просто можно отсканировать код материала, он будет подставлен в поле ввода, после чего по нажатию кнопки «Ввод», система заполнит данные материала, как на рисунке MIGO-03.png выше. Большинство сканеров в настоящее время имеют возможность передачи так называемого завершающего символа, например это код #13 т.е. имитация нажатия клавиши «Ввод», поэтому после сканирования система получает так же команду подтверждения ввода данных, что автоматически запускает процесс поиска введенного ОЗМ. Однако, что делать, если мы не используем дополнительное штрих-кодирование входящих материалов, т.е. наклейка внутренних кодов ОЗМ не производится, соответственно мы имеем, только коды серийных номеров производителей, которые подходят для обработки сканерами ввода. Решением задачи обычно становилось написание собственной диалоговой программы, которая принимала на вход сканированные серийные номера, затем к этим номерам определялись коды ОЗМ, с проверкой ситуации, когда найден более чем один код ОЗМ, после чего программно формировался документ движения материала, например, используя пакетный ввод или BAPI-функцию BAPI_GOODSMVT_CREATE. На первый взгляд программа получается не сложной, однако если попытаться ее сделать универсальной, т.е. с возможностью выбора вида движения, операции и т.д., то все это может вылиться в переписывание транзакции MIGO, что согласитесь не очень кошерно и как-то бессмысленно. В общем, немного посмотрев на MIGO, подумалось, а нельзя ли реализовать следующий механизм работы, при котором в поле ввода кода материала сканировался бы код серийного номера, после чего выполняем поиск кода ОЗМ по такой же схеме, как и поиск ОЗМ при вводе части краткого текста. В общем, оказалось, что можно и при этом получилось довольно просто.

И так за поиск кода ОЗМ по части краткого текста отвечает функция: MM_MAKTX_CONVERT которая вызывается внутри транзакции MIGO, при этом она возвращает найденный ОЗМ или если материалов найдено несколько, то выдает окно со списком подходящих кодов материала, рисунок MIGO-02.png выше. В данной функции есть такая вставка как:
Код: You are not allowed to view links. Register or Login
ENHANCEMENT-SECTION MM_MAKTX_CONVERT_03 SPOTS ES_SAPLMM_CONVERSION.
В данной секции используется преобразование кода материала, т.е. код находится следующий:
Код: You are not allowed to view links. Register or Login
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-кода будет немного, но результат получился хороший.
Код: You are not allowed to view links. Register or Login
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.

* Прочитаем значение параметра активации расширенного поиска по серийному номеру
GET PARAMETER ID 'YTSH_MIGO_SERNR_SEL' FIELD ytsh_param_select.
IF ytsh_param_select = abap_true.
  REFRESH lt_hitlist.
  ytsh_sernr = l_maktx.
  REPLACE '*' WITH '%' INTO ytsh_sernr.
  CONCATENATE '%' ytsh_sernr '%' INTO ytsh_sernr.

  SELECT matnr INTO CORRESPONDING FIELDS OF TABLE lt_hitlist
  FROM equi WHERE sernr LIKE ytsh_sernr GROUP BY matnr.

  SORT lt_hitlist BY matnr.
  LOOP AT lt_hitlist.
    SELECT SINGLE maktx INTO (lt_hitlist-maktx)
    FROM makt WHERE spras = i_spras AND
         matnr = lt_hitlist-matnr.
    MODIFY lt_hitlist.
  ENDLOOP. 
DESCRIBE TABLE lt_hitlist LINES l_lines.

  CASE l_lines.
    WHEN 0.
*     Значения не найдены, поискать как код материала
    WHEN 1.
*     Найдено одно значение
      READ TABLE lt_hitlist INDEX 1.
      c_matnr = lt_hitlist-matnr.
      c_maktx = lt_hitlist-maktx.
      EXIT.
    WHEN OTHERS.
*     Найдены несколько значений, показать из в диалоговом окне
      title = text-003.
      REPLACE '&' WITH c_maktx INTO title.
      REFRESH fc.
      fc-fieldname = 'MATNR'. fc-ref_tabname = 'MAKT'. APPEND fc.
      fc-fieldname = 'MAKTX'. fc-ref_tabname = 'MAKT'. APPEND fc.
      CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
        EXPORTING
          i_title     = title
          i_tabname   = 'LT_HITLIST'
          it_fieldcat = fc[]
        IMPORTING
          es_selfield = selection
        TABLES
          t_outtab    = lt_hitlist[].
      READ TABLE lt_hitlist INDEX selection-tabindex.
      IF sy-subrc = 0.
        c_matnr = lt_hitlist-matnr.
        c_maktx = lt_hitlist-maktx.
      ENDIF.
      EXIT.
  ENDCASE.
ENDIF.
ENDENHANCEMENT.
Собственно теперь все работает следующим образом, сканируем серийный номер и если сканер настроен на завершающий символ «Ввод», то автоматически подставляет найденный к серийному номеру код материала или если найдено несколько кодов материала, то выпадет диалоговое окно со списком подходящих ОЗМ для ручного выбор нужно кода. После этого переходим на закладку «Количества» вводим количество отпускаемых материалов, например 5, нажимаем ввод и переходим на закладку ввода серийных номеров (ну если поля завода и склада настроены на автоматическое заполнение, вместе с выбором партии запаса), на закладке серийных номеров снова сканируем первый номер и далее сканируем другие 4. Все документ сформирован, можно выполнять проводку.

Пример когда серийный номер встречается у двух разных материалов приведен на рисунке MIGO-04.png. Как видим, система вывела в диалоговом окне два кода материала для серийного номера 10000599. В заголовке окна указано, что поиск выполнялся для введенного текста 10000599.

При этом если поиск выполнить, например, снова по тексу d-link, то будет получена такая же картинка как показанная выше на рисунке MIGO-02.png, т.е. все работает корректно, а нам не пришлось писать большую программу по облегчению работы сотрудников склада при выдаче материалов.

Примечание: Кстати, если ввести, часть серийного номера, то поиск тоже будет работать, например если указать значение 10, то будет выведен список следующих ОЗМ, рисунок MIGO-05.png.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Ну и по традиции все в одном файле: MIGO - расширенный ввод кодов материала.pdf

Sapforum.Biz