Меню

Методика легкого создания «тяжелых» документов материала в MIGO

Методика создания функции массовой загрузки данных документа движения материалов из файла в транзакцию MIGO с использованием буфера обмена

Оглавление

Общие положения

Обоснование выбора решения

Порядок работы

Создание шаблона документа материала

Создание документа материала по шаблону с данными из буфера обмена

Реализация расширения транзакции MIGO

Создать Тип данных ZSMM_MIGO_FIELDS

Создать Тип таблицы ZTMM_MIGO_FIELDS

Создать таблицу ZMM_CLPFRM

Ведение настроек буфера обмена

Создать класс ZCL_MM_MIGO_BUFFER

Создание расширения метода загрузки предварительно сохраненного документа

Описание алгоритма

Общие положения

В процессе работы с модулем SAP MM управление материальными потоками для выполнения функций некоторых бизнес процессов требуется регулярно вводить документы материала с большим количеством позиций и атрибутов. Например, данные из филиалов, не оборудованных рабочими местами в системе, или данные от подрядчиков, использующих давальческие материалы. В системе SAP ERP предусмотрены различные механизмы для массовой обработки данных, такие как транзакция MASS, создание документов со ссылкой на предшествующий документ с копированием позиций, индустриальные решения для массового ведения, пакетный ввод, электронный обмен данными. Через буфер обмена транзакция MIGO позволяет вставить ограниченное размером экрана количество строк. Специализированная функция вставки данных из буфера обмена позволит создавать документы материала с большим количеством позиций, использовать встроенные инструменты стандартной транзакции редактирования и проверки правильности ввода. Приведенный ниже пример реализован в системе SAP S/4HANA 1709.

Обоснование выбора решения

Общепринятой практикой для создания документов материала с большим количеством позиций является разработка отдельной программы для чтения данных из файла и запуска BAPI для проводки. Достоинством такого подхода является высокая скорость работы и простота использования, но при условии корректности данных в файле. В том случае, когда данные готовятся множеством сотрудников, не обладающих достаточным опытом работы с электронными таблицами, велика вероятность возникновения ошибок. Например, лишние пробелы в строках, символы из национальных раскладок клавиатуры или неподдерживаемые десятичные разделители могут препятствовать корректной загрузке. Возникающие в таких случаях сообщения об ошибках, как правило, не понятны пользователям и, таким образом, для исправления вводимых данных требуется техническая поддержка консультантов. Обычно для упрощения разработки подобных приложений не прибегают к созданию функций просмотра и проверки загруженных данных. Оценить правильность документа можно только после его создания и, в случае обнаруженных недостатков, потребуется выполнить сторнирование. Использование стандартной транзакции MIGO для множественного ввода данных из файла позволяет использовать все существующие возможности для просмотра, редактирования и проверки данных до проводки. Таким образом, предлагаемое решение позволяет получить повышение эффективности работы на предприятиях со множеством пользователей, создающих документы материала на основании больших объемов малоформализованных данных.  

Порядок работы

Создание шаблона документа материала

В транзакции MIGO cоздать новый документ материала, содержащий одну позицию. Выбрать операцию, ссылочный документ, вид движения. В данных единственной позиции указать необходимые атрибуты, например завод, склад, вид оценки, МВЗ и так далее, которые будут одинаковыми для всех строк документа. Введенный документ сохранить в виде шаблона путем нажатия на кнопку «Сохранить временно», показанную на Рис. 1.

Рис. 1 Временное сохранение документа.

В поле Примечание ввести краткое описание создаваемого шаблона. Если необходимо использовать документ многократно можно установить индикатор «Ссылка», приведенный на Рис. 2. В этом случае, временно сохраненный документ не будет автоматически удален после использования.

Рис. 2 Опции сохраняемого шаблона.

Создание документа материала по шаблону с данными из буфера обмена

Далее создать новый документ. В буфер обмена cкопировать из Excel список позиций – кодов материалов с атрибутами в зависимости от вида движения предварительно сохраненного документа в формате, определенном в настроечной таблице. Пример содержимого буфера обмена приведен в Таблице 1.

Таблица 1 Содержимое буфера обмена.

В окне «Обзор, Мои документы» транзакции MIGO дважды щелкнуть левой кнопкой мыши на предварительно сохраненном документе. Расположение элемента управления показано на Рис. 3.

Рис. 3 Запуск заполнения документа из буфера обмена.

На основании предварительно сохраненного документа, создается новый документ, содержащий позиции с материалами и соответствующими атрибутами из буфера обмена. Если какой-либо из столбцов не должен быть заполнен, необходимо скопировать пустые поля в буфер обмена. Структура буфера всегда должна содержать заданное в настроечной таблице для вида движения количество столбцов. Все данные, такие как завод, склад, вид оценки и прочее, заполненные в позиции предварительно сохраненного документа, копируются в каждую позицию нового документа. Полученную заготовку документа можно дополнить данными, отредактировать и затем выполнить проводку. Временно сохраненный документ, не отмеченный индикатором «Ссылка», автоматически удаляется из списка «Мои документы» окна «Обзор» транзакции MIGO. Результат создания документа и вставки данных из буфера обмена показан на Рис. 4.

Рис. 4 Результат вставки данных.

Реализация расширения транзакции MIGO

Программа транзакции MIGO имеет закрытую архитектуру и не содержит необходимых возможностей для модификаций в виде BADI или USER EXIT. Необходимые доработки можно реализовать с помощью расширения метода predocument_load в Include LMIGOKP3. Ниже приведены шаги по созданию объектов словаря данных и программных компонентов.

Шаг 1. Создать Тип данных ZSMM_MIGO_FIELDS

В транзакции SE11 создать тип данных ZSMM_MIGO_FIELDS. Выбрать опцию Структура. Ввести следующие данные:

Краткое описание - Migo поля буфера обмена.

На вкладке Компоненты ввести данные из Таблицы 2 Компоненты структуры ZSMM_MIGO_FIELDS.

Таблица 2 Компоненты структуры ZSMM_MIGO_FIELDS.

На вкладке Поля валюты/количества ввести данные из Таблицы 3 Поля валюты/количества структуры ZSMM_MIGO_FIELDS.

Таблица 3 Поля валюты/количества структуры ZSMM_MIGO_FIELDS.

Сохранить изменения и активировать объект.

Шаг 2. Создать Тип таблицы ZTMM_MIGO_FIELDS

В транзакции SE11 создать тип данных ZЕMM_MIGO_FIELDS. Выбрать опцию Тип таблицы. Ввести следующие данные:

Краткое описание - Migo поля буфера обмена.

Тип строки - ZSMM_MIGO_FIELDS.

Сохранить введенные данные и активировать объект.

Шаг 3. Создать таблицу ZMM_CLPFRM

В транзакции SE11 создать Таблицу базы данных ZMM_CLPFRM. Вставить краткое описание Migo формат буфера обмена. На вкладке Поставка и ведение указать С в поле Класс поставки и X Просмотр/ведение разрешены в поле Ведение разр. Дан./ракурса табл. 

На вкладке Поля ввести данные из Таблицы 4:

Таблица 4 Поля таблицы ZMM_CLPFRM.

Нажать кнопку Технические параметры настройки. Установить следующие значения:

Вид данных - APPL2.

Категория размера - 0

Выбрать в меню Дополнительная информация -> Категория расширений и установить значение Без возможности расширения.

Сохранить введенные значения и активировать объект.

Шаг 4. Ведение настроек буфера обмена

В транзакции SM30 выполнить ведение таблицы ZMM_CLPFRM Формат буфера обмена для MIGO. Необходимо определить формат буфера обмена для сочетания вида движения и индикатора особого запаса. Пример настроек для видов движения, не определенных явным образом состоит из кода материала и количества. Для 301 ВД определены два поля – код материала и номер партии. При ведении таблицы допустимо использовать только имена полей структуры ZSMM_MIGO_FIELDS. Для удобства ведения можно создать домен и определить список возможных значений. Пример настройки формата буфера обмена приведен на Рис. 5.

Рис 5. Настройка формата буфера обмена.

Шаг 5.  Создать класс ZCL_MM_MIGO_BUFFER

В транзакции SE24 создать класс\интерфейс ZCL_MM_MIGO_BUFFER. Ввести:

Описание - MIGO Интеграция с буфером обмена.

СоздИнстанции - 2 Общее.

Тип класса - Обычный ABAP-класс.

Выбрать пакет, например, $TMP и сохранить определение класса.

Нажать кнопку  На базе исходного текста и вставить код приведенный в Листинге 1. Сохранить введенный код и активировать.

class ZCL_MM_MIGO_BUFFER definition
  public
  final
  create public .
public section.
  types:
    begin of ty_s_matnr,
           matnr type matnr,
           maktx type maktx,
         end of ty_s_matnr .
  types:
    ty_t_matnr type standard table of ty_s_matnr .
  class-methods FILL_ITEMS_FROM_CLIPBOARD
    importing
      !IS_GOITEM type GOITEM
    returning
      value(RT_ITEMS) type ZTMM_MIGO_FIELDS.
  class-methods FILL_GOITEM_FROM_ITEMS
    importing
      !IV_TABIX type SYTABIX
      !IS_GOITEM type GOITEM
      !IS_ITEM type ZSMM_MIGO_FIELDS
      !IT_MATNR type TY_T_MATNR
      !IS_MATNR type TY_S_MATNR
    returning
      value(RS_GOITEM) type GOITEM .
protected section.
private section.
ENDCLASS.
CLASS ZCL_MM_MIGO_BUFFER IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_MM_MIGO_BUFFER=>FILL_GOITEM_FROM_ITEMS
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_TABIX                       TYPE        SYTABIX
* | [--->] IS_GOITEM                      TYPE        GOITEM
* | [--->] IS_ITEM                        TYPE        ZSMM_MIGO_FIELDS
* | [--->] IT_MATNR                       TYPE        TY_T_MATNR
* | [--->] IS_MATNR                       TYPE        TY_S_MATNR
* | [<-()] RS_GOITEM                      TYPE        GOITEM
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method fill_goitem_from_items.
    rs_goitem = is_goitem.
    rs_goitem-zeile = iv_tabix.
    rs_goitem-global_counter = iv_tabix.
    rs_goitem-matnr = is_matnr-matnr.
    rs_goitem-maktx = is_matnr-maktx.
    rs_goitem-exbwr = is_item-exbwr.
    rs_goitem-erfmg = is_item-erfmg.

    if is_item-ummat is not initial.
      read table it_matnr with key matnr = is_item-ummat
                        assigning field-symbol(<ls_matnr>).
      if sy-subrc = 0.
        rs_goitem-ummat = <ls_matnr>-matnr.
        rs_goitem-ummaktx = <ls_matnr>-maktx.
      endif.
    endif.

    if is_item-mat_pspnr is not initial.
      rs_goitem-mat_pspnr = is_item-mat_pspnr.
    endif.
    if is_item-ummat_pspnr is not initial.
      rs_goitem-ummat_pspnr = is_item-ummat_pspnr.
    endif.
    if is_item-erfme is not initial.
      rs_goitem-erfme = is_item-erfme.
    endif.
    if is_item-konto is not initial.
      rs_goitem-konto = is_item-konto.
    endif.
    if is_item-kostl is not initial.
      rs_goitem-kostl = is_item-kostl.
    endif.
    if is_item-lgort is not initial.
      rs_goitem-lgort = is_item-lgort.
    endif.
    if is_item-charg is not initial.
      rs_goitem-charg = is_item-charg.
    endif.
    if is_item-werks is not initial.
      rs_goitem-werks = is_item-werks.
      rs_goitem-name1 = is_item-name1.
    endif.
  endmethod.

 

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_MM_MIGO_BUFFER=>FILL_ITEMS_FROM_CLIPBOARD
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_GOITEM                      TYPE        GOITEM
* | [<-()] RT_ITEMS                       TYPE        ZTMM_MIGO_FIELDS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method fill_items_from_clipboard.
    types: begin of ty_s_clip,
             line(255) type c,
           end of ty_s_clip,
           begin of ty_s_fields_value,
             name(15)  type c,
             value(35) type c,
           end of ty_s_fields_value.
    data: lt_clip         type table of ty_s_clip,
          lt_fields_value type table of ty_s_fields_value,
          ls_item         type zsmm_migo_fields.
    data: lv_value(35) type c,
          lv_count     type i, lv_c type i.
    field-symbols: <lv> type any.
    call method cl_gui_frontend_services=>clipboard_import
      importing
        data       = lt_clip
      exceptions
        cntl_error = 1
        others     = 4.
    check lt_clip[] is not initial.
    select num, name into table @data(lt_fields)
      from zmm_clpfrm
      where bwart = @is_goitem-bwart

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти

Обсуждения Количество комментариев1

Комментарий от  

Денис Рязанов

  |  05 июля 2024, 13:13

А зачем такие сложности с расширение стандартной программы?
Можно:
- расширить заголовок в MIGO, сделать кнопку.
- по кнопке считать буфер
- в методе MB_MIGO_BADI~LINE_MODIFY создать новые строки.