Меню

Упростите разработку ABAP с помощью инструмента массового ведения

|

Используйте стандартную транзакцию SAP для внесения массовых изменений в поля основных данных и бухгалтерские документы. Это позволит исключить необходимость разовой разработки ABAP, сократить внутренние расходы и получить Вашей организации передовой опыт.

Знали ли Вы, что всего за несколько минут можно изменить исполнителя, ответственного за 5000 клиентов без написания программы? Известно ли Вам, что базовую дату входящих счетов-фактур можно изменить одновременно для диапазона кредиторов? Когда Вам необходимо внести масштабные изменения в основные данные, Вы обычно пишите собственную программу для этой цели?

Как правило, при решении этих задач с помощью ABAP написанные программы используются один раз. А это лишняя трата время на ABAP-разработку и при апгрейде возникает еще одна программа, которую нужно протестировать.

Я расскажу о том, как использовать транзакцию MASS, какие объекты основных данных можно использовать и как спланировать задание массового обновления. Кроме того, я опишу способы одновременного изменения больших объемов финансовых переменных данных при помощи типичных кодов транзакций просмотра отдельных позиций. А начнем мы с обсуждения параметров данных в задании.

Количество записей

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

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

Оформите подписку sappro и получите полный доступ к материалам SAPPRO

У вас уже есть подписка?

Войти

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

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

Дмитрий Бондарев

  |  07 июля 2010, 18:07

Отличная статья с описанием конкретных рецептов использования продукта. Если все статьи будут сделаны на таком уровне, то это будет просто здорово!

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

Кирилл Сатарин

  |  07 июля 2010, 20:39

Ясная статья о работе с инструментами массового изменения основных данных и данных документов.
Может быть очень полезна, в случае если подобная необходимость возникнет.
В статье все понятно и четко, по данному описанию массовое изменение данных может выполнить любой.

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

Светлана Ситоленко

  |  24 июля 2010, 21:22

Спасибо, за подробное описание данной транзакции.

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

Андрей Топоров

  |  29 июля 2010, 16:47

Статья написана и переведена отлично. Есть незначительная опечатка в тексте "...либо произвести платеж ранее срок, если год кредитора заканчивается.". Функционал транзакции MASS мне хорошо знаком. Приятно было освежить уже знакомую информацию и узнать что-то новое из раздела "Внесение массовых изменений в данные позиций". Было бы интересно если автор поделился опытом предоставления полномочий MASS "суперпользователям" и показал бы возможность ограничения функционала MASS для конечного пользователя.

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

Даниил Гришин

  |  31 июля 2010, 18:22

Полезно было просмотреть. Аналогичное есть в MM (по материалам тр. MM17) и PS (тр.CNMASS).

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

Олег Точенюк

  |  21 ноября 2011, 22:23

Полезно было просмотреть. Аналогичное есть в MM (по материалам тр. MM17) и PS (тр.CNMASS).

Вообще-то MM17 это обычная транзакция параметров вокруг MASS, так что один фиг, что использовать:

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

Олег Точенюк

  |  21 ноября 2011, 22:26

Статья написана и переведена отлично. Есть незначительная опечатка в тексте "...либо произвести платеж ранее срок, если год кредитора заканчивается.". Функционал транзакции MASS мне хорошо знаком. Приятно было освежить уже знакомую информацию и узнать что-то новое из раздела "Внесение массовых изменений в данные позиций". Было бы интересно если автор поделился опытом предоставления полномочий MASS "суперпользователям" и показал бы возможность ограничения функционала MASS для конечного пользователя.

Что хотим конкретно ограничивать? В конечном итоге работают функции BAPI со всеми стандартными проверками объектов полномочий, так что если доступа у пользователя нет на вид материала, то и изменить его не получится.

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

Александр Дублин

  |  18 апреля 2012, 12:03

Использование  транзакции MASS  для большого перечня объектов в системе прекрасно описано в статье Олега Точенюка sapland.ru/articles/stats

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

Олег Точенюк

  |  20 июня 2012, 11:52

Подключение новых типов объектов, доступных для транзакции MASS – массового изменения данных в SAP ERP

Аннотация к комментарию

Используя предложенные в комментарии к статье пошаговые инструкции, вы сможете сэкономить порядка 80% времени при решении задач массового изменения данных, а также сможете создавать унифицированный интерфейс для работы с изменениями любых типов объектов системы конечным пользователем.


Довольно часто возникает необходимость массового изменения данных в SAP ERP. Например, это данные технических мест или данные карточек ОС. Делать обновление данных в таблицах системы «вручную» категорически запрещено, допустимо только изменение данных с использованием стандартных транзакций системы так, чтобы информация об изменениях осталась в журналах обработки и т.д.

Компания SAP предоставляет программные интерфейсы в виде функций BAPI, которые позволяют выполнять изменения объектов путём написания собственной Z-программы массовой обработки данных. Разработка Z-программы такого рода обычно состоит из следующих шагов:

  1. Запрос параметров выбора объектов для обработки, т.е. получение у пользователя информации о том, какие данные требуется массового обработать/изменить.
  2. Выбрать требуемые данные, показать списком текущие значения полей объектов, которые будем изменять.
  3. Запросить у пользователя, какие значения полей и по каким условиям требуется изменить и на какие значения выполнить изменения.
  4. Выполнить изменения согласно заданным пользователем параметрам.
  5. Показать журнал обработки объектов.

Если теперь перевести эти соображения на язык программы, то скорее всего самой сложной частью работ будет обработка диалога с пользователем, так как шаг 4, при наличии соответствующих BAPI-функций (в крайнем случае, можно использовать пакетный ввод) занимает в среднем около 20% от всей разработки. Используя предложенные ниже инструкции, вы сможете сэкономить порядка 80% времени при решении задач массового изменения данных, также получите унифицированный интерфейс для работы с изменениями любых объектов системы конечным пользователем.

В системе SAP ERP есть хорошая транзакция для выполнения массового изменения данных – MASS, которая позволяет это выполнять такие операции. Описание работы с транзакцией MASS приведено в комментируемой статье.

Когда у меня появилась задача массового изменения карточек ОС (Основных средств), я попытался использовать транзакцию MASS, но обнаружил, что она не работает с типом объекта «Техническое место». В стандартной системе перечень типов объектов, с которыми работает данная транзакция невелик. Стандартный список объектов транзакции MASS, приведен на рисунке MASS-01.png.

Я задался целью расширить список типов объектов, данных которых можно массово изменять с помощью данной транзакции, объектом «Техническое место». В данной статье описывается методика (пошаговое руководство) такого расширения.

Рис 1. MASS-01.png: Стандартный список объектов транзакции MASS

1. Добавление нового объекта

Нужно задать имя бизнес-объекта для объекта «Техническое место». Имя можно добавить любое. Существующие в системе имена типов объектов, используемых в транзакции MASS, можно увидеть через код поиска в таблицах:

  • MASSFUNC (Массовое изменение: функции для обновления базы данных, сюда следует свой тип объекта и его параметры).
  • MASSNAME (Тексты к объектам массовых изменений, сюда следует добавить текст, описывающий добавляемый объект).

После добавления в эти таблицы «вашего типа объекта» он будет отображаться для выбора в транзакции MASS. Для ввода требуемых данных можно воспользоваться ракурсом ведения, транзакция SM30: MASSFUNC, в которой добавим наш новый тип объекта – «Техническое место».

Примечание
Так как для объектов «Техническое место» в системе есть код бизнес-объекта, то воспользуемся существующим именем. Определить имя бизнес объекта, можно используя таблицу TOJTB – Основные данные репозитария бизнес-объектов. Для этого нужно зайти в просмотр данных таблицы и через код поиска значений к полю NAME можно определить, какие есть бизнес-объекты для технических мест. Как видим, в системе существует 4 типа объекта (см. Рис. 2: MASS-02.png), мы возьмём BUS0010, чтобы было похоже на то, что есть в таблицах транзакции MASS. Еще раз напоминаю, что на самом деле никакой связи транзакции MASS с данными бизнес-объектов нет, поэтому будет ли это имя из таблицы TOJTB или же это будет ваше собственное имя, в принципе все равно, но в целом для поддержания общих принципов наименования объектов, правильно будет использовать имена стандартных бизнес-объектов из таблицы TOJTB.

Рис 2. MASS-02.png: Выбор типа объекта

Добавим в ракурсе ведения MASSFUNC, следующие данные, Рис. 3: MASS-03.png.

Рис 3. MASS-03.png: Добавление данных в в ракурсе ведения MASSFUNC

Имя объекта берем из таблицы TOJTB, указав в комментарии, что это объект массового изменения для технических мест, далее имя функции: Y_TSH_MASS_CHANGE_IFLOT, этой функции еще не существует, это ваше пользовательское имя функции, которую будет вызывать транзакция MASS, для физического изменения технических мест в базе данных. О реализации функции будет рассказано ниже. Пока просто «придумаем» имя, правила наименования пользовательских объектов разработки стандартные, я назвал функциональный модуль, начиная с буквы Y_. Сохраним данные: система запросит имя транспорта для переноса. Создадим запрос, в который будем записывать, как данные настройки, так и программный код, который создадим позже.

Если теперь зайти в транзакцию MASS, то на первом экране в списке выбора появится наш объект ведения данных для технических мест. Правда пока ничего еще не работает, так что, переходить к ведению данных еще рано, хотя если и перейти, то закладки выбора данных будут пустыми. Как видим, объект уже выбирается и транзакция MASS, что-то уже об этом объекте знает, Рис. 4: MASS-04.png.

Рис 4. MASS-04.png: транзакция MASS

2. Определение изменяемых таблиц и полей

Теперь добавим имена таблиц и полей, которые можно будет изменять в транзакции MASS. В общем виде можно указать все таблицы, в которых хранятся данные технических места, например, это таблицы IFLOT, ILOA и другие, а затем перечислить все поля этих таблиц. Однако нужно понимать, что фактически система не даст изменить все поля технического места. Если вы зайдёте в транзакцию изменения технических мест IL02, то сможете определить: какие поля можно менять, а какие закрыты от изменений, (например, код технического места и код балансовой единицы, изменить нельзя).

Мы будем добавлять для возможности использования в транзакции MASS таблицу IFLOT и следующие поля этой таблицы:

MAPAR – Номер детали производителя

IWERK – Завод, планирующий ТОРО

EQART – Вид технического объекта

INVNR – Инвентарный номер

GROES – Величина/размер

BRGEW – Вес брутто

GEWEI – Единица измерения веса

ANSDT – Дата покупки

SERGE – Серийный номер изготовителя

Есть несколько вариантов определения возможности изменения данных транзакцией MASS. Первый вариант: перечислить таблицы и поля в «ручном режиме»; второй вариант: указать «использовать все поля», а затем написать специальный функциональный модуль, который удалит из полного списка те поля, которые нельзя изменять; третий вариант: сделать структуру/ракурс, в который включить только поля, разрешенные для изменения. Какой вариант выбрать? Если предполагается разрешить пользователю для изменения 2 – 5 полей из 59, которые есть в таблице IFLOT, тогда, вероятно, проще выбрать вариант 1 или вариант 3. Если - 50 полей из 59, то вариант 2 будет оптимальным, т.е. даем изменять все поля, и пишем модуль, который исключит из этого списка 9 полей, запрещенных к изменению.

Имена таблиц требуется задать в таблице MASSTAB, а поля, если нужно, в таблице MASSFLDLST. Если выбран вариант ведения 2, то для данной таблицы также есть ракурс ведения. Какие внести данные, можно легко определить: в таблице MASSFLDLST всего три поля. Для нашего примера предпочтителен вариант 3, т.е. необходимо создать ракурс ведения таблицы IFLOT, в который включить только разрешённые к изменениям поля, перечисленные выше. Как было сказано, для задания значений у таблиц существуют ракурсы ведения, с такими же точно именами, как и у таблиц.

Итак, сначала идем в создание ракурса ведения для таблицы IFLOT, транзакция SE11 - создать ракурс. Создаём ракурс YTSH_IFLOTSTRUCT – Ведение технических мест для транзакции MASS - ракурс только для чтения таблицы IFLOT, Рис. 5: MASS-05.png. Кроме полей, предназначенных для изменения в транзакции MASS, в ракурс требуется включить также ключевые поля таблицы IFLOT.

Рис 5. MASS-05.png: ракурс YTSH_IFLOTSTRUCT

Теперь укажем этот ракурс в таблице MASSTAB через транзакцию ведения SM30. Тип объекта укажем BUS0010, который мы выбрали ранее. В поле имя таблицы зададим имя ракурса YTSH_IFLOTSTRUCT. Далее в поле «Число» укажем, например, значение 10. Данное поле служит для упорядочивания списка таблиц: если, например, таблиц/сегментов для обновления больше одной (что в нашем примере неактуально, так как у нас всего одна таблица). В поле «Таб БД» укажем имя таблицы базы данных, из которой фактически будет идти выборка. Для чего требуется указать имя таблицы в колонке «Таб. БД»? Суть заключается в следующем: в поле «Таблица» задаём имя структуры, содержащей только поля, разрешенные для изменения, которые и предложит транзакция MASS для выбора пользователю.

Однако часто ситуация заключается в том, что, например, мы разрешаем изменять поле «Серийный номер», при этом критерием выбора записей для обработки, в которых будет изменяться, является значение поля «Вид технического места», при этом не должно быть разрешено изменять это поле. Мы задали имя основной таблицы базы данных - IFLOT, что служит для транзакции MASS командой предложить пользователю все поля этой таблицы на селекционном экране выбора записей, которые предполагается изменить. Если выборка данных должна выполняться как-то особенно, то в поле «ФМ выбора», нужно задать имя функционального модуля выполняющего выборку данных. В общем случае достаточно стандартных функций выбора данных. И последнее, поле «Без нов. сегментов», в котором поставлена галка, представляет чек-бокса определяющий то, что транзакция MASS позволяет не только изменять данные, но и массово создавать новые данные. В рассматриваемом примере создание новых записей технических мест рассматриваться не будет, по этому мы отключили закладку создания новых технических мест (так как не будем использовать эту функциональность). Пример создания записи, Рис. 6: MASS-06.png.

Рис 6. MASS-06.png: Пример создания записи

Теперь, если перейти в транзакцию MASS, то картина будет более интересной, Рис. 7, MASS-07.png. Как видим, теперь транзакция MASS знает нашу структуру и поля, которые мы хотим разрешить изменять. Кроме этого программа уже умеет искать поля, используя кнопки поиска (справа от списка полей). Поиск может идти как по названию, так и техническому имени поля. Конечно, в данном случае, это не очень важно, так как набор полей для изменения ограничен, однако, если полей в списке много, то такая возможность не является лишней.

Рис 7. MASS-07.png: Транзакция MASS

Фактически, в данный момент мы должны выбрать нашу таблицу, она одна в списке и выбрать поля которые хотим изменить: можно выбрать как весь набор полей, так и отдельные поля, например, пусть это будет поле «Планирующий завод» и «Дата покупки». Для выбора выделим эти поля в таблице, нажав кнопки выбора слева от каждого поля, после чего можно нажать кнопку выполнить вверху экрана, Рис. 8: MASS-08.png.

Рис 8. MASS-08.png: транзакция MASS, выбор полей для изменения

Транзакция перейдет к экрану выбора технических мест, которые мы хотим изменить. Фактически, это уже описание работы с транзакцией MASS. По умолчанию, выбор предполагается по ключевым полям, в данном случае – это поле кодов технических мест. Однако транзакция MASS разрешает сделать выбор данных по любым полям, которые есть в таблице IFLOT, так как мы задали именно эту таблицу в настройке выше. Добавим на экран выбора поля: «планирующий завод» и «тип технического места», Рис. 9: MASS-09.png.

Затем укажем – выбрать все технические места, у которых не задан планирующий завод, после чего нажмём F8 – выполнить выбор данных. Система сообщит, сколько записей попадают под указанные критерии и предложит: или перейти к обработке изменений в диалоге, или выполнить фоновое изменение данных, используя создание варианта выполнения. В данный момент мы будем выполнять все операции в диалоговом режиме, поэтому выберем кнопку «Просмотреть все записи». В тестовой системе было выбрано 127 записей без присвоенного планирующего завода.

Рис 9. MASS-09.png: транзакция MASS, выбор полей для изменения

Описание работы с транзакцией MASS выходит за рамки данной статьи, поэтому, что и как можно задавать на экране ввода значений определяйте экспериментальным путем или прочитайте статью, на которую была дана ссылка вначале (возможно, что-то найдется в документации SAP). В примере мы задали «установить завод 1000», а для формирования серийного номера изготовителя задали кодировку на языке ABAP, т.е. фактически там идет генерация GUID-а, после чего нажал кнопку  – копирования значений в поля и система показала какими значениями, будет выполнено заполнение полей, Рис. 10: MASS-10.png.

Рис 10. MASS-10.png

Как видим, для поля серийного номера изготовителя были сгенерированы уникальные серийные номера. Пример подпрограммы кодировки для генерации внешних серийных номеров для транзакции MASS следующий (система сама генерируют заголовок подпрограммы):

Для обновления данных следует нажать кнопку сохранения результата. Однако пока еще не готова реализация собственно самого функционального модуля Y_TSH_MASS_CHANGE_IFLOT, который выполнит обновление данных на основании заполненных пользователями критериям. Фактически, не более чем за 15-20 минут мы создали диалоговую транзакцию для массового изменения необходимых нам данных с гибким вводом. Реализация, функции изменения данных объекта, будет рассмотрена ниже.

3. Настройка журнала обработки данных

Все сообщения, возникшие в ходе обновления данных, должны быть записаны в журнал обработки данных (далее журнал) и затем транзакция MASS покажет для каждой записи статус обновления или любую другую информацию, которая будет записана в журнал. Поэтому надо настроить наш бизнес-объект на управление журналом. Журнал настраивается с помощью ракурса ведения V_BALSUB – Журнал приложений: ракурс для ведения подобъектов. Для этого через транзакцию SM30 выполним ведение ракурса, появится экран запроса рабочей области, Рис. 11: MASS-11.png.

Рис 11. MASS-11.png: транзакция SM30 – экран запроса рабочей области

Имя рабочей области MASS, как и у транзакции ведения данных, поэтому введем код области и перейдем на следующий экран ведения данных, где добавим новую запись, Рис. 12: MASS-12.png (нужно ввести только имя объекта и текст описания).

Рис 12. MASS-12.png: ввод имени объекта и текста описания

Сохраним значения в запрос, фактически еще одни шаг по настройке транзакции MASS выполнен.

4. Настройка операций просмотра данных журнала

Эта настройка необязательна, но если необходимо, чтобы массовое ведение выглядело как в стандарте, то её лучше сделать. Назначение настройки заключается в том, что она обеспечивает переход из журнала транзакции MASS в просмотр или изменение обрабатываемых объектов (в нашем примере - технических мест). Если данную настройку не сделать, то журнал обработки будет выглядеть следующим образом, Рис. 13: MASS-13.png.

Рис 13. MASS-13.png: вид журнала обработки без настройки

Мы видим на панели инструментов только кнопку просмотра подробного текста к сообщениям об обработке. На рисунке отображён результата попытки присвоить значение поля «завод», равное 1200, для двух объектов. Система не разрешила выполнить такую операцию и сообщила причину.

Перейдём к ведению ракурса MASSAPPEX, в который добавим имена двух функциональных модулей, один для просмотра данных объекта (технического места), а другой для изменения. Как только такие данные будут добавлены, транзакция MASS выведет на панели инструментов две кнопки, для просмотра и изменения объектов из журнала, Рис. 14: MASS-14.png.

Рис 14. MASS-14.png: ведение ракурса MASSAPPEX

В поле CHAR20 имена событий, которые можно выбрать. Имена функциональных модулей, как и в случае с модулем обновления данных, пока только задаем, а их реализация будет описана ниже. Сохраняем данные, если теперь выполнить запуск массового изменения, то в журнале обработки появятся две кнопки, просмотра и изменения обрабатываемых объектов, Рис. 15: MASS-15.png.

Рис 15. MASS-15.png: вид журнала обработки с настройкой

Примечание
Вы не сможете получить журнал обработки до реализации пункта «Реализация функции обновления данных Y_TSH_MASS_CHANGE_IFLOT», т.е. результаты обработки будут видны только после того, как будут написаны объявленные ранее функциональные модули изменения и просмотра объектов.

5. Настройка возможности тестового запуска массового обновления

Для возможности запуска транзакции MASS в тестовом режиме необходимо добавить событие «TEST_MODE_KNOWN», так как описано в предыдущем разделе, в ракурс ведения MASSAPPEX в имени функционального модуля необходимо указать *, Рис. 16: MASS-16.png. Данное событие, позволит запускать транзакцию массового изменения с признаком тестового режима. Описание параметров будет сделано ниже.

Рис 16. MASS-16.png: настройка тестового запуска

После добавления этого события, если перейти в режим обработки данных транзакции MASS, на экране обновления данных на панели инструментов появится кнопка запуска транзакции в тестовом режиме, Рис. 17: MASS-17.png.

Рис 17. MASS-17.png: режим обработки данных

Если выполнить транзакцию в тестовом режиме, то в журнале появится сообщение, что изменения не сохранены, Рис. 18: MASS-18.png. Необходимо всегда обращать внимание на режим запуска транзакции MASS: тестовый или продуктивный, в функции Y_TSH_MASS_CHANGE_IFLOT, когда будете выполнять ее реализацию.

Рис 18. MASS-18.png: выполнение транзакции в тестовом режиме

6. Реализация функции обновления данных Y_TSH_MASS_CHANGE_IFLOT

Для типов объектов «техническое место», начиная с версии системы 4.6, существует BAPI функция, которая позволяет изменять программно данные технического места: BAPI_FUNCLOC_CHANGE. Если до этого места особого знания языка ABAP не требовалось, то реализация данного пункта невозможна без знаний ABAP, так как функция Y_TSH_MASS_CHANGE_IFLOT будет являться окаймляющей функцией вокруг стандартной BAPI. Параметры этой функции должны быть заданы по определенной маске, так как её вызов происходит динамически транзакций MASS для каждой записи отмеченной в этой транзакции для обработки.

На Рис. 19: FNMASS-01.png представлены входные и выходные параметры функционального модуля Y_TSH_MASS_CHANGE_IFLOT, который надо создать.

Рис 19. FNMASS-01.png: входные и выходные параметры функционального модуля Y_TSH_MASS_CHANGE_IFLOT

Внимание
Обратите внимание на то, что имена параметров и типы должны быть заданы в таком же виде, как показано на Рис. 20: FNMASS-01.png, кроме закладки «Таблицы», правила формирования имен которой, будут описаны отдельно.
  • SELDATA – Таблица, содержащая заголовок объекта и параметры обработки, с которым работает транзакция MASS. Тип переменной MASS_TABDATA. Таблица должна быть отмечена как переменные значения, чек-бокс в соответствующей колонке.
  • TESTMODE – Параметр, определяющий вариант выполнения транзакции MASS, если в данном поле стоит значение «X», значит выполнение запущено в тестовом режиме и вам не нужно выполнять COMMIT WORK, в противном случае, требуется выполнить изменения так как это продуктивный прогон операции. Тип параметра XFELD.
  • MSG – Таблица сообщений, в которую вы должны вернуть для каждой обрабатываемой строки результат обработки. Данные этой таблицы будут выведены как журнал выполнения изменений. Тип параметра MASS_MSGS. При задании данного типа, система скажет, что пул типов не включен в группу функций. Для решения этой проблемы перейдите в TOP-инклуд группы функций, в которой вы создаете функциональный модуль и вставьте там строку, которая определяет общий пул типов транзакции MASS:
  • TYPE-POOLS: mass.
  • Таблица SYTSH_IFLOTSTRUCT – Имя таблицы, в которую система передаст данные с экрана изменений транзакции MASS. Имя данной переменной должно быть сформировано по следующей маске S + <Имя таблицы/ракурса заданного при формировании сегментов из MASSTAB-TABNAME>, в данном случае это будет имя созданного ракурса, который содержит все поля, разрешенные к изменениям, ну а тип переменной будет это имя нашего ракурса. Если таблиц с полями для изменений было определено несколько, то они должны быть все перечислены на закладке таблиц с параметром – «не обязательно» в соответствующей колонке.

Сам текст функционального модуля, реализующего обновление технических мест, представлен ниже. Обратите внимание на параметры заполнения журнала транзакции MASS, особенно на формирование ключа объекта. В данном случае ключ формируется очень просто, так как это код технического места. Например, если бы это были изменения карточек ОС, то там ключ объекта должен был бы быть как соединение трех полей: <Код БЕ> + <Номер карточки ОС> + <Субномер карточки ОС>, т.е. ключ должен однозначно определять обрабатываемую запись.

7. Реализация функций просмотра и изменения объектов из журнала обработки

Переменная журнала ls_msg-objkey должна содержать ключ обрабатываемого объекта. В дальнейшем, при вызове функций просмотра или изменения этот ключ будет передаваться в заданные вами функциональные модули, чтобы вы смогли перейти к выдранному пользователем объекту. Для просмотра объекта мы объявляли функцию Y_TSH_MASS_VIEW_IFLOT, Рис. 20: FNMASS-02.png

Рис 20. FNMASS-02.png

Сам текст модуля очень простой:

Аналогично выполняется объявление функционального модуля для изменений обрабатываемых объектов Y_TSH_MASS_EDIT_IFLOT, Рис. 21: FNMASS-03.png

Рис 21. FNMASS-03.png

Текст функционального модуля практически такой же, как и при просмотре, отличается только код транзакции:

Итак, фактически за три часа рабочего времени была создана настройка и разработка для массового изменения технических мест, при этом, если нужно добавить какие-то дополнительные поля для обработки, то их просто нужно внести в ракурс ведения YTSH_IFLOTSTRUCT, конечно при условии, что эти переменные находятся только в таблице IFLOT. Функциональный модуль изменения технических мест, написан так, что корректно будет обрабатывать такие добавления.

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

Дмитрий Ложкин

  |  21 июня 2012, 11:30

Подключение новых типов объектов, доступных для транзакции MASS – массового изменения данных в SAP ERP

Аннотация к комментарию

Используя предложенные в комментарии к статье пошаговые инструкции, вы сможете сэкономить порядка 80% времени при решении задач массового изменения данных, а также сможете создавать унифицированный интерфейс для работы с изменениями любых типов объектов системы конечным пользователем.


Довольно часто возникает необходимость массового изменения данных в SAP ERP. Например, это данные технических мест или данные карточек ОС. Делать обновление данных в таблицах системы «вручную» категорически запрещено, допустимо только изменение данных с использованием стандартных транзакций системы так, чтобы информация об изменениях осталась в журналах обработки и т.д.

Компания SAP предоставляет программные интерфейсы в виде функций BAPI, которые позволяют выполнять изменения объектов путём написания собственной Z-программы массовой обработки данных. Разработка Z-программы такого рода обычно состоит из следующих шагов:

  1. Запрос параметров выбора объектов для обработки, т.е. получение у пользователя информации о том, какие данные требуется массового обработать/изменить.
  2. Выбрать требуемые данные, показать списком текущие значения полей объектов, которые будем изменять.
  3. Запросить у пользователя, какие значения полей и по каким условиям требуется изменить и на какие значения выполнить изменения.
  4. Выполнить изменения согласно заданным пользователем параметрам.
  5. Показать журнал обработки объектов.

Если теперь перевести эти соображения на язык программы, то скорее всего самой сложной частью работ будет обработка диалога с пользователем, так как шаг 4, при наличии соответствующих BAPI-функций (в крайнем случае, можно использовать пакетный ввод) занимает в среднем около 20% от всей разработки. Используя предложенные ниже инструкции, вы сможете сэкономить порядка 80% времени при решении задач массового изменения данных, также получите унифицированный интерфейс для работы с изменениями любых объектов системы конечным пользователем.

В системе SAP ERP есть хорошая транзакция для выполнения массового изменения данных – MASS, которая позволяет это выполнять такие операции. Описание работы с транзакцией MASS приведено в комментируемой статье.

Когда у меня появилась задача массового изменения карточек ОС (Основных средств), я попытался использовать транзакцию MASS, но обнаружил, что она не работает с типом объекта «Техническое место». В стандартной системе перечень типов объектов, с которыми работает данная транзакция невелик. Стандартный список объектов транзакции MASS, приведен на рисунке MASS-01.png.

Я задался целью расширить список типов объектов, данных которых можно массово изменять с помощью данной транзакции, объектом «Техническое место». В данной статье описывается методика (пошаговое руководство) такого расширения.

Рис 1. MASS-01.png: Стандартный список объектов транзакции MASS

1. Добавление нового объекта

Нужно задать имя бизнес-объекта для объекта «Техническое место». Имя можно добавить любое. Существующие в системе имена типов объектов, используемых в транзакции MASS, можно увидеть через код поиска в таблицах:

  • MASSFUNC (Массовое изменение: функции для обновления базы данных, сюда следует свой тип объекта и его параметры).
  • MASSNAME (Тексты к объектам массовых изменений, сюда следует добавить текст, описывающий добавляемый объект).

После добавления в эти таблицы «вашего типа объекта» он будет отображаться для выбора в транзакции MASS. Для ввода требуемых данных можно воспользоваться ракурсом ведения, транзакция SM30: MASSFUNC, в которой добавим наш новый тип объекта – «Техническое место».

Примечание
Так как для объектов «Техническое место» в системе есть код бизнес-объекта, то воспользуемся существующим именем. Определить имя бизнес объекта, можно используя таблицу TOJTB – Основные данные репозитария бизнес-объектов. Для этого нужно зайти в просмотр данных таблицы и через код поиска значений к полю NAME можно определить, какие есть бизнес-объекты для технических мест. Как видим, в системе существует 4 типа объекта (см. Рис. 2: MASS-02.png), мы возьмём BUS0010, чтобы было похоже на то, что есть в таблицах транзакции MASS. Еще раз напоминаю, что на самом деле никакой связи транзакции MASS с данными бизнес-объектов нет, поэтому будет ли это имя из таблицы TOJTB или же это будет ваше собственное имя, в принципе все равно, но в целом для поддержания общих принципов наименования объектов, правильно будет использовать имена стандартных бизнес-объектов из таблицы TOJTB.

Рис 2. MASS-02.png: Выбор типа объекта

Добавим в ракурсе ведения MASSFUNC, следующие данные, Рис. 3: MASS-03.png.

Рис 3. MASS-03.png: Добавление данных в в ракурсе ведения MASSFUNC

Имя объекта берем из таблицы TOJTB, указав в комментарии, что это объект массового изменения для технических мест, далее имя функции: Y_TSH_MASS_CHANGE_IFLOT, этой функции еще не существует, это ваше пользовательское имя функции, которую будет вызывать транзакция MASS, для физического изменения технических мест в базе данных. О реализации функции будет рассказано ниже. Пока просто «придумаем» имя, правила наименования пользовательских объектов разработки стандартные, я назвал функциональный модуль, начиная с буквы Y_. Сохраним данные: система запросит имя транспорта для переноса. Создадим запрос, в который будем записывать, как данные настройки, так и программный код, который создадим позже.

Если теперь зайти в транзакцию MASS, то на первом экране в списке выбора появится наш объект ведения данных для технических мест. Правда пока ничего еще не работает, так что, переходить к ведению данных еще рано, хотя если и перейти, то закладки выбора данных будут пустыми. Как видим, объект уже выбирается и транзакция MASS, что-то уже об этом объекте знает, Рис. 4: MASS-04.png.

Рис 4. MASS-04.png: транзакция MASS

2. Определение изменяемых таблиц и полей

Теперь добавим имена таблиц и полей, которые можно будет изменять в транзакции MASS. В общем виде можно указать все таблицы, в которых хранятся данные технических места, например, это таблицы IFLOT, ILOA и другие, а затем перечислить все поля этих таблиц. Однако нужно понимать, что фактически система не даст изменить все поля технического места. Если вы зайдёте в транзакцию изменения технических мест IL02, то сможете определить: какие поля можно менять, а какие закрыты от изменений, (например, код технического места и код балансовой единицы, изменить нельзя).

Мы будем добавлять для возможности использования в транзакции MASS таблицу IFLOT и следующие поля этой таблицы:

MAPAR – Номер детали производителя

IWERK – Завод, планирующий ТОРО

EQART – Вид технического объекта

INVNR – Инвентарный номер

GROES – Величина/размер

BRGEW – Вес брутто

GEWEI – Единица измерения веса

ANSDT – Дата покупки

SERGE – Серийный номер изготовителя

Есть несколько вариантов определения возможности изменения данных транзакцией MASS. Первый вариант: перечислить таблицы и поля в «ручном режиме»; второй вариант: указать «использовать все поля», а затем написать специальный функциональный модуль, который удалит из полного списка те поля, которые нельзя изменять; третий вариант: сделать структуру/ракурс, в который включить только поля, разрешенные для изменения. Какой вариант выбрать? Если предполагается разрешить пользователю для изменения 2 – 5 полей из 59, которые есть в таблице IFLOT, тогда, вероятно, проще выбрать вариант 1 или вариант 3. Если - 50 полей из 59, то вариант 2 будет оптимальным, т.е. даем изменять все поля, и пишем модуль, который исключит из этого списка 9 полей, запрещенных к изменению.

Имена таблиц требуется задать в таблице MASSTAB, а поля, если нужно, в таблице MASSFLDLST. Если выбран вариант ведения 2, то для данной таблицы также есть ракурс ведения. Какие внести данные, можно легко определить: в таблице MASSFLDLST всего три поля. Для нашего примера предпочтителен вариант 3, т.е. необходимо создать ракурс ведения таблицы IFLOT, в который включить только разрешённые к изменениям поля, перечисленные выше. Как было сказано, для задания значений у таблиц существуют ракурсы ведения, с такими же точно именами, как и у таблиц.

Итак, сначала идем в создание ракурса ведения для таблицы IFLOT, транзакция SE11 - создать ракурс. Создаём ракурс YTSH_IFLOTSTRUCT – Ведение технических мест для транзакции MASS - ракурс только для чтения таблицы IFLOT, Рис. 5: MASS-05.png. Кроме полей, предназначенных для изменения в транзакции MASS, в ракурс требуется включить также ключевые поля таблицы IFLOT.

Рис 5. MASS-05.png: ракурс YTSH_IFLOTSTRUCT

Теперь укажем этот ракурс в таблице MASSTAB через транзакцию ведения SM30. Тип объекта укажем BUS0010, который мы выбрали ранее. В поле имя таблицы зададим имя ракурса YTSH_IFLOTSTRUCT. Далее в поле «Число» укажем, например, значение 10. Данное поле служит для упорядочивания списка таблиц: если, например, таблиц/сегментов для обновления больше одной (что в нашем примере неактуально, так как у нас всего одна таблица). В поле «Таб БД» укажем имя таблицы базы данных, из которой фактически будет идти выборка. Для чего требуется указать имя таблицы в колонке «Таб. БД»? Суть заключается в следующем: в поле «Таблица» задаём имя структуры, содержащей только поля, разрешенные для изменения, которые и предложит транзакция MASS для выбора пользователю.

Однако часто ситуация заключается в том, что, например, мы разрешаем изменять поле «Серийный номер», при этом критерием выбора записей для обработки, в которых будет изменяться, является значение поля «Вид технического места», при этом не должно быть разрешено изменять это поле. Мы задали имя основной таблицы базы данных - IFLOT, что служит для транзакции MASS командой предложить пользователю все поля этой таблицы на селекционном экране выбора записей, которые предполагается изменить. Если выборка данных должна выполняться как-то особенно, то в поле «ФМ выбора», нужно задать имя функционального модуля выполняющего выборку данных. В общем случае достаточно стандартных функций выбора данных. И последнее, поле «Без нов. сегментов», в котором поставлена галка, представляет чек-бокса определяющий то, что транзакция MASS позволяет не только изменять данные, но и массово создавать новые данные. В рассматриваемом примере создание новых записей технических мест рассматриваться не будет, по этому мы отключили закладку создания новых технических мест (так как не будем использовать эту функциональность). Пример создания записи, Рис. 6: MASS-06.png.

Рис 6. MASS-06.png: Пример создания записи

Теперь, если перейти в транзакцию MASS, то картина будет более интересной, Рис. 7, MASS-07.png. Как видим, теперь транзакция MASS знает нашу структуру и поля, которые мы хотим разрешить изменять. Кроме этого программа уже умеет искать поля, используя кнопки поиска (справа от списка полей). Поиск может идти как по названию, так и техническому имени поля. Конечно, в данном случае, это не очень важно, так как набор полей для изменения ограничен, однако, если полей в списке много, то такая возможность не является лишней.

Рис 7. MASS-07.png: Транзакция MASS

Фактически, в данный момент мы должны выбрать нашу таблицу, она одна в списке и выбрать поля которые хотим изменить: можно выбрать как весь набор полей, так и отдельные поля, например, пусть это будет поле «Планирующий завод» и «Дата покупки». Для выбора выделим эти поля в таблице, нажав кнопки выбора слева от каждого поля, после чего можно нажать кнопку выполнить вверху экрана, Рис. 8: MASS-08.png.

Рис 8. MASS-08.png: транзакция MASS, выбор полей для изменения

Транзакция перейдет к экрану выбора технических мест, которые мы хотим изменить. Фактически, это уже описание работы с транзакцией MASS. По умолчанию, выбор предполагается по ключевым полям, в данном случае – это поле кодов технических мест. Однако транзакция MASS разрешает сделать выбор данных по любым полям, которые есть в таблице IFLOT, так как мы задали именно эту таблицу в настройке выше. Добавим на экран выбора поля: «планирующий завод» и «тип технического места», Рис. 9: MASS-09.png.

Затем укажем – выбрать все технические места, у которых не задан планирующий завод, после чего нажмём F8 – выполнить выбор данных. Система сообщит, сколько записей попадают под указанные критерии и предложит: или перейти к обработке изменений в диалоге, или выполнить фоновое изменение данных, используя создание варианта выполнения. В данный момент мы будем выполнять все операции в диалоговом режиме, поэтому выберем кнопку «Просмотреть все записи». В тестовой системе было выбрано 127 записей без присвоенного планирующего завода.

Рис 9. MASS-09.png: транзакция MASS, выбор полей для изменения

Описание работы с транзакцией MASS выходит за рамки данной статьи, поэтому, что и как можно задавать на экране ввода значений определяйте экспериментальным путем или прочитайте статью, на которую была дана ссылка вначале (возможно, что-то найдется в документации SAP). В примере мы задали «установить завод 1000», а для формирования серийного номера изготовителя задали кодировку на языке ABAP, т.е. фактически там идет генерация GUID-а, после чего нажал кнопку  – копирования значений в поля и система показала какими значениями, будет выполнено заполнение полей, Рис. 10: MASS-10.png.

Рис 10. MASS-10.png

Как видим, для поля серийного номера изготовителя были сгенерированы уникальные серийные номера. Пример подпрограммы кодировки для генерации внешних серийных номеров для транзакции MASS следующий (система сама генерируют заголовок подпрограммы):

Для обновления данных следует нажать кнопку сохранения результата. Однако пока еще не готова реализация собственно самого функционального модуля Y_TSH_MASS_CHANGE_IFLOT, который выполнит обновление данных на основании заполненных пользователями критериям. Фактически, не более чем за 15-20 минут мы создали диалоговую транзакцию для массового изменения необходимых нам данных с гибким вводом. Реализация, функции изменения данных объекта, будет рассмотрена ниже.

3. Настройка журнала обработки данных

Все сообщения, возникшие в ходе обновления данных, должны быть записаны в журнал обработки данных (далее журнал) и затем транзакция MASS покажет для каждой записи статус обновления или любую другую информацию, которая будет записана в журнал. Поэтому надо настроить наш бизнес-объект на управление журналом. Журнал настраивается с помощью ракурса ведения V_BALSUB – Журнал приложений: ракурс для ведения подобъектов. Для этого через транзакцию SM30 выполним ведение ракурса, появится экран запроса рабочей области, Рис. 11: MASS-11.png.

Рис 11. MASS-11.png: транзакция SM30 – экран запроса рабочей области

Имя рабочей области MASS, как и у транзакции ведения данных, поэтому введем код области и перейдем на следующий экран ведения данных, где добавим новую запись, Рис. 12: MASS-12.png (нужно ввести только имя объекта и текст описания).

Рис 12. MASS-12.png: ввод имени объекта и текста описания

Сохраним значения в запрос, фактически еще одни шаг по настройке транзакции MASS выполнен.

4. Настройка операций просмотра данных журнала

Эта настройка необязательна, но если необходимо, чтобы массовое ведение выглядело как в стандарте, то её лучше сделать. Назначение настройки заключается в том, что она обеспечивает переход из журнала транзакции MASS в просмотр или изменение обрабатываемых объектов (в нашем примере - технических мест). Если данную настройку не сделать, то журнал обработки будет выглядеть следующим образом, Рис. 13: MASS-13.png.

Рис 13. MASS-13.png: вид журнала обработки без настройки

Мы видим на панели инструментов только кнопку просмотра подробного текста к сообщениям об обработке. На рисунке отображён результата попытки присвоить значение поля «завод», равное 1200, для двух объектов. Система не разрешила выполнить такую операцию и сообщила причину.

Перейдём к ведению ракурса MASSAPPEX, в который добавим имена двух функциональных модулей, один для просмотра данных объекта (технического места), а другой для изменения. Как только такие данные будут добавлены, транзакция MASS выведет на панели инструментов две кнопки, для просмотра и изменения объектов из журнала, Рис. 14: MASS-14.png.

Рис 14. MASS-14.png: ведение ракурса MASSAPPEX

В поле CHAR20 имена событий, которые можно выбрать. Имена функциональных модулей, как и в случае с модулем обновления данных, пока только задаем, а их реализация будет описана ниже. Сохраняем данные, если теперь выполнить запуск массового изменения, то в журнале обработки появятся две кнопки, просмотра и изменения обрабатываемых объектов, Рис. 15: MASS-15.png.

Рис 15. MASS-15.png: вид журнала обработки с настройкой

Примечание
Вы не сможете получить журнал обработки до реализации пункта «Реализация функции обновления данных Y_TSH_MASS_CHANGE_IFLOT», т.е. результаты обработки будут видны только после того, как будут написаны объявленные ранее функциональные модули изменения и просмотра объектов.

5. Настройка возможности тестового запуска массового обновления

Для возможности запуска транзакции MASS в тестовом режиме необходимо добавить событие «TEST_MODE_KNOWN», так как описано в предыдущем разделе, в ракурс ведения MASSAPPEX в имени функционального модуля необходимо указать *, Рис. 16: MASS-16.png. Данное событие, позволит запускать транзакцию массового изменения с признаком тестового режима. Описание параметров будет сделано ниже.

Рис 16. MASS-16.png: настройка тестового запуска

После добавления этого события, если перейти в режим обработки данных транзакции MASS, на экране обновления данных на панели инструментов появится кнопка запуска транзакции в тестовом режиме, Рис. 17: MASS-17.png.

Рис 17. MASS-17.png: режим обработки данных

Если выполнить транзакцию в тестовом режиме, то в журнале появится сообщение, что изменения не сохранены, Рис. 18: MASS-18.png. Необходимо всегда обращать внимание на режим запуска транзакции MASS: тестовый или продуктивный, в функции Y_TSH_MASS_CHANGE_IFLOT, когда будете выполнять ее реализацию.

Рис 18. MASS-18.png: выполнение транзакции в тестовом режиме

6. Реализация функции обновления данных Y_TSH_MASS_CHANGE_IFLOT

Для типов объектов «техническое место», начиная с версии системы 4.6, существует BAPI функция, которая позволяет изменять программно данные технического места: BAPI_FUNCLOC_CHANGE. Если до этого места особого знания языка ABAP не требовалось, то реализация данного пункта невозможна без знаний ABAP, так как функция Y_TSH_MASS_CHANGE_IFLOT будет являться окаймляющей функцией вокруг стандартной BAPI. Параметры этой функции должны быть заданы по определенной маске, так как её вызов происходит динамически транзакций MASS для каждой записи отмеченной в этой транзакции для обработки.

На Рис. 19: FNMASS-01.png представлены входные и выходные параметры функционального модуля Y_TSH_MASS_CHANGE_IFLOT, который надо создать.

Рис 19. FNMASS-01.png: входные и выходные параметры функционального модуля Y_TSH_MASS_CHANGE_IFLOT

Внимание
Обратите внимание на то, что имена параметров и типы должны быть заданы в таком же виде, как показано на Рис. 20: FNMASS-01.png, кроме закладки «Таблицы», правила формирования имен которой, будут описаны отдельно.
  • SELDATA – Таблица, содержащая заголовок объекта и параметры обработки, с которым работает транзакция MASS. Тип переменной MASS_TABDATA. Таблица должна быть отмечена как переменные значения, чек-бокс в соответствующей колонке.
  • TESTMODE – Параметр, определяющий вариант выполнения транзакции MASS, если в данном поле стоит значение «X», значит выполнение запущено в тестовом режиме и вам не нужно выполнять COMMIT WORK, в противном случае, требуется выполнить изменения так как это продуктивный прогон операции. Тип параметра XFELD.
  • MSG – Таблица сообщений, в которую вы должны вернуть для каждой обрабатываемой строки результат обработки. Данные этой таблицы будут выведены как журнал выполнения изменений. Тип параметра MASS_MSGS. При задании данного типа, система скажет, что пул типов не включен в группу функций. Для решения этой проблемы перейдите в TOP-инклуд группы функций, в которой вы создаете функциональный модуль и вставьте там строку, которая определяет общий пул типов транзакции MASS:
  • TYPE-POOLS: mass.
  • Таблица SYTSH_IFLOTSTRUCT – Имя таблицы, в которую система передаст данные с экрана изменений транзакции MASS. Имя данной переменной должно быть сформировано по следующей маске S + <Имя таблицы/ракурса заданного при формировании сегментов из MASSTAB-TABNAME>, в данном случае это будет имя созданного ракурса, который содержит все поля, разрешенные к изменениям, ну а тип переменной будет это имя нашего ракурса. Если таблиц с полями для изменений было определено несколько, то они должны быть все перечислены на закладке таблиц с параметром – «не обязательно» в соответствующей колонке.

Сам текст функционального модуля, реализующего обновление технических мест, представлен ниже. Обратите внимание на параметры заполнения журнала транзакции MASS, особенно на формирование ключа объекта. В данном случае ключ формируется очень просто, так как это код технического места. Например, если бы это были изменения карточек ОС, то там ключ объекта должен был бы быть как соединение трех полей: <Код БЕ> + <Номер карточки ОС> + <Субномер карточки ОС>, т.е. ключ должен однозначно определять обрабатываемую запись.

7. Реализация функций просмотра и изменения объектов из журнала обработки

Переменная журнала ls_msg-objkey должна содержать ключ обрабатываемого объекта. В дальнейшем, при вызове функций просмотра или изменения этот ключ будет передаваться в заданные вами функциональные модули, чтобы вы смогли перейти к выдранному пользователем объекту. Для просмотра объекта мы объявляли функцию Y_TSH_MASS_VIEW_IFLOT, Рис. 20: FNMASS-02.png

Рис 20. FNMASS-02.png

Сам текст модуля очень простой:

Аналогично выполняется объявление функционального модуля для изменений обрабатываемых объектов Y_TSH_MASS_EDIT_IFLOT, Рис. 21: FNMASS-03.png

Рис 21. FNMASS-03.png

Текст функционального модуля практически такой же, как и при просмотре, отличается только код транзакции:

Итак, фактически за три часа рабочего времени была создана настройка и разработка для массового изменения технических мест, при этом, если нужно добавить какие-то дополнительные поля для обработки, то их просто нужно внести в ракурс ведения YTSH_IFLOTSTRUCT, конечно при условии, что эти переменные находятся только в таблице IFLOT. Функциональный модуль изменения технических мест, написан так, что корректно будет обрабатывать такие добавления.

Очень полезное описание как работать с mass в случае отсутствия нужного объекта в этой транзакции. Как раз не хватало этого функционала. Спасибо.

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

Ирина Гасанова

  |  16 февраля 2015, 13:49

Подключение новых типов объектов, доступных для транзакции MASS – массового изменения данных в SAP ERP

Аннотация к комментарию

Используя предложенные в комментарии к статье пошаговые инструкции, вы сможете сэкономить порядка 80% времени при решении задач массового изменения данных, а также сможете создавать унифицированный интерфейс для работы с изменениями любых типов объектов системы конечным пользователем.


Довольно часто возникает необходимость массового изменения данных в SAP ERP. Например, это данные технических мест или данные карточек ОС. Делать обновление данных в таблицах системы «вручную» категорически запрещено, допустимо только изменение данных с использованием стандартных транзакций системы так, чтобы информация об изменениях осталась в журналах обработки и т.д.

Компания SAP предоставляет программные интерфейсы в виде функций BAPI, которые позволяют выполнять изменения объектов путём написания собственной Z-программы массовой обработки данных. Разработка Z-программы такого рода обычно состоит из следующих шагов:

  1. Запрос параметров выбора объектов для обработки, т.е. получение у пользователя информации о том, какие данные требуется массового обработать/изменить.
  2. Выбрать требуемые данные, показать списком текущие значения полей объектов, которые будем изменять.
  3. Запросить у пользователя, какие значения полей и по каким условиям требуется изменить и на какие значения выполнить изменения.
  4. Выполнить изменения согласно заданным пользователем параметрам.
  5. Показать журнал обработки объектов.

Если теперь перевести эти соображения на язык программы, то скорее всего самой сложной частью работ будет обработка диалога с пользователем, так как шаг 4, при наличии соответствующих BAPI-функций (в крайнем случае, можно использовать пакетный ввод) занимает в среднем около 20% от всей разработки. Используя предложенные ниже инструкции, вы сможете сэкономить порядка 80% времени при решении задач массового изменения данных, также получите унифицированный интерфейс для работы с изменениями любых объектов системы конечным пользователем.

В системе SAP ERP есть хорошая транзакция для выполнения массового изменения данных – MASS, которая позволяет это выполнять такие операции. Описание работы с транзакцией MASS приведено в комментируемой статье.

Когда у меня появилась задача массового изменения карточек ОС (Основных средств), я попытался использовать транзакцию MASS, но обнаружил, что она не работает с типом объекта «Техническое место». В стандартной системе перечень типов объектов, с которыми работает данная транзакция невелик. Стандартный список объектов транзакции MASS, приведен на рисунке MASS-01.png.

Я задался целью расширить список типов объектов, данных которых можно массово изменять с помощью данной транзакции, объектом «Техническое место». В данной статье описывается методика (пошаговое руководство) такого расширения.

Рис 1. MASS-01.png: Стандартный список объектов транзакции MASS

1. Добавление нового объекта

Нужно задать имя бизнес-объекта для объекта «Техническое место». Имя можно добавить любое. Существующие в системе имена типов объектов, используемых в транзакции MASS, можно увидеть через код поиска в таблицах:

  • MASSFUNC (Массовое изменение: функции для обновления базы данных, сюда следует свой тип объекта и его параметры).
  • MASSNAME (Тексты к объектам массовых изменений, сюда следует добавить текст, описывающий добавляемый объект).

После добавления в эти таблицы «вашего типа объекта» он будет отображаться для выбора в транзакции MASS. Для ввода требуемых данных можно воспользоваться ракурсом ведения, транзакция SM30: MASSFUNC, в которой добавим наш новый тип объекта – «Техническое место».

Примечание
Так как для объектов «Техническое место» в системе есть код бизнес-объекта, то воспользуемся существующим именем. Определить имя бизнес объекта, можно используя таблицу TOJTB – Основные данные репозитария бизнес-объектов. Для этого нужно зайти в просмотр данных таблицы и через код поиска значений к полю NAME можно определить, какие есть бизнес-объекты для технических мест. Как видим, в системе существует 4 типа объекта (см. Рис. 2: MASS-02.png), мы возьмём BUS0010, чтобы было похоже на то, что есть в таблицах транзакции MASS. Еще раз напоминаю, что на самом деле никакой связи транзакции MASS с данными бизнес-объектов нет, поэтому будет ли это имя из таблицы TOJTB или же это будет ваше собственное имя, в принципе все равно, но в целом для поддержания общих принципов наименования объектов, правильно будет использовать имена стандартных бизнес-объектов из таблицы TOJTB.

Рис 2. MASS-02.png: Выбор типа объекта

Добавим в ракурсе ведения MASSFUNC, следующие данные, Рис. 3: MASS-03.png.

Рис 3. MASS-03.png: Добавление данных в в ракурсе ведения MASSFUNC

Имя объекта берем из таблицы TOJTB, указав в комментарии, что это объект массового изменения для технических мест, далее имя функции: Y_TSH_MASS_CHANGE_IFLOT, этой функции еще не существует, это ваше пользовательское имя функции, которую будет вызывать транзакция MASS, для физического изменения технических мест в базе данных. О реализации функции будет рассказано ниже. Пока просто «придумаем» имя, правила наименования пользовательских объектов разработки стандартные, я назвал функциональный модуль, начиная с буквы Y_. Сохраним данные: система запросит имя транспорта для переноса. Создадим запрос, в который будем записывать, как данные настройки, так и программный код, который создадим позже.

Если теперь зайти в транзакцию MASS, то на первом экране в списке выбора появится наш объект ведения данных для технических мест. Правда пока ничего еще не работает, так что, переходить к ведению данных еще рано, хотя если и перейти, то закладки выбора данных будут пустыми. Как видим, объект уже выбирается и транзакция MASS, что-то уже об этом объекте знает, Рис. 4: MASS-04.png.

Рис 4. MASS-04.png: транзакция MASS

2. Определение изменяемых таблиц и полей

Теперь добавим имена таблиц и полей, которые можно будет изменять в транзакции MASS. В общем виде можно указать все таблицы, в которых хранятся данные технических места, например, это таблицы IFLOT, ILOA и другие, а затем перечислить все поля этих таблиц. Однако нужно понимать, что фактически система не даст изменить все поля технического места. Если вы зайдёте в транзакцию изменения технических мест IL02, то сможете определить: какие поля можно менять, а какие закрыты от изменений, (например, код технического места и код балансовой единицы, изменить нельзя).

Мы будем добавлять для возможности использования в транзакции MASS таблицу IFLOT и следующие поля этой таблицы:

MAPAR – Номер детали производителя

IWERK – Завод, планирующий ТОРО

EQART – Вид технического объекта

INVNR – Инвентарный номер

GROES – Величина/размер

BRGEW – Вес брутто

GEWEI – Единица измерения веса

ANSDT – Дата покупки

SERGE – Серийный номер изготовителя

Есть несколько вариантов определения возможности изменения данных транзакцией MASS. Первый вариант: перечислить таблицы и поля в «ручном режиме»; второй вариант: указать «использовать все поля», а затем написать специальный функциональный модуль, который удалит из полного списка те поля, которые нельзя изменять; третий вариант: сделать структуру/ракурс, в который включить только поля, разрешенные для изменения. Какой вариант выбрать? Если предполагается разрешить пользователю для изменения 2 – 5 полей из 59, которые есть в таблице IFLOT, тогда, вероятно, проще выбрать вариант 1 или вариант 3. Если - 50 полей из 59, то вариант 2 будет оптимальным, т.е. даем изменять все поля, и пишем модуль, который исключит из этого списка 9 полей, запрещенных к изменению.

Имена таблиц требуется задать в таблице MASSTAB, а поля, если нужно, в таблице MASSFLDLST. Если выбран вариант ведения 2, то для данной таблицы также есть ракурс ведения. Какие внести данные, можно легко определить: в таблице MASSFLDLST всего три поля. Для нашего примера предпочтителен вариант 3, т.е. необходимо создать ракурс ведения таблицы IFLOT, в который включить только разрешённые к изменениям поля, перечисленные выше. Как было сказано, для задания значений у таблиц существуют ракурсы ведения, с такими же точно именами, как и у таблиц.

Итак, сначала идем в создание ракурса ведения для таблицы IFLOT, транзакция SE11 - создать ракурс. Создаём ракурс YTSH_IFLOTSTRUCT – Ведение технических мест для транзакции MASS - ракурс только для чтения таблицы IFLOT, Рис. 5: MASS-05.png. Кроме полей, предназначенных для изменения в транзакции MASS, в ракурс требуется включить также ключевые поля таблицы IFLOT.

Рис 5. MASS-05.png: ракурс YTSH_IFLOTSTRUCT

Теперь укажем этот ракурс в таблице MASSTAB через транзакцию ведения SM30. Тип объекта укажем BUS0010, который мы выбрали ранее. В поле имя таблицы зададим имя ракурса YTSH_IFLOTSTRUCT. Далее в поле «Число» укажем, например, значение 10. Данное поле служит для упорядочивания списка таблиц: если, например, таблиц/сегментов для обновления больше одной (что в нашем примере неактуально, так как у нас всего одна таблица). В поле «Таб БД» укажем имя таблицы базы данных, из которой фактически будет идти выборка. Для чего требуется указать имя таблицы в колонке «Таб. БД»? Суть заключается в следующем: в поле «Таблица» задаём имя структуры, содержащей только поля, разрешенные для изменения, которые и предложит транзакция MASS для выбора пользователю.

Однако часто ситуация заключается в том, что, например, мы разрешаем изменять поле «Серийный номер», при этом критерием выбора записей для обработки, в которых будет изменяться, является значение поля «Вид технического места», при этом не должно быть разрешено изменять это поле. Мы задали имя основной таблицы базы данных - IFLOT, что служит для транзакции MASS командой предложить пользователю все поля этой таблицы на селекционном экране выбора записей, которые предполагается изменить. Если выборка данных должна выполняться как-то особенно, то в поле «ФМ выбора», нужно задать имя функционального модуля выполняющего выборку данных. В общем случае достаточно стандартных функций выбора данных. И последнее, поле «Без нов. сегментов», в котором поставлена галка, представляет чек-бокса определяющий то, что транзакция MASS позволяет не только изменять данные, но и массово создавать новые данные. В рассматриваемом примере создание новых записей технических мест рассматриваться не будет, по этому мы отключили закладку создания новых технических мест (так как не будем использовать эту функциональность). Пример создания записи, Рис. 6: MASS-06.png.

Рис 6. MASS-06.png: Пример создания записи

Теперь, если перейти в транзакцию MASS, то картина будет более интересной, Рис. 7, MASS-07.png. Как видим, теперь транзакция MASS знает нашу структуру и поля, которые мы хотим разрешить изменять. Кроме этого программа уже умеет искать поля, используя кнопки поиска (справа от списка полей). Поиск может идти как по названию, так и техническому имени поля. Конечно, в данном случае, это не очень важно, так как набор полей для изменения ограничен, однако, если полей в списке много, то такая возможность не является лишней.

Рис 7. MASS-07.png: Транзакция MASS

Фактически, в данный момент мы должны выбрать нашу таблицу, она одна в списке и выбрать поля которые хотим изменить: можно выбрать как весь набор полей, так и отдельные поля, например, пусть это будет поле «Планирующий завод» и «Дата покупки». Для выбора выделим эти поля в таблице, нажав кнопки выбора слева от каждого поля, после чего можно нажать кнопку выполнить вверху экрана, Рис. 8: MASS-08.png.

Рис 8. MASS-08.png: транзакция MASS, выбор полей для изменения

Транзакция перейдет к экрану выбора технических мест, которые мы хотим изменить. Фактически, это уже описание работы с транзакцией MASS. По умолчанию, выбор предполагается по ключевым полям, в данном случае – это поле кодов технических мест. Однако транзакция MASS разрешает сделать выбор данных по любым полям, которые есть в таблице IFLOT, так как мы задали именно эту таблицу в настройке выше. Добавим на экран выбора поля: «планирующий завод» и «тип технического места», Рис. 9: MASS-09.png.

Затем укажем – выбрать все технические места, у которых не задан планирующий завод, после чего нажмём F8 – выполнить выбор данных. Система сообщит, сколько записей попадают под указанные критерии и предложит: или перейти к обработке изменений в диалоге, или выполнить фоновое изменение данных, используя создание варианта выполнения. В данный момент мы будем выполнять все операции в диалоговом режиме, поэтому выберем кнопку «Просмотреть все записи». В тестовой системе было выбрано 127 записей без присвоенного планирующего завода.

Рис 9. MASS-09.png: транзакция MASS, выбор полей для изменения

Описание работы с транзакцией MASS выходит за рамки данной статьи, поэтому, что и как можно задавать на экране ввода значений определяйте экспериментальным путем или прочитайте статью, на которую была дана ссылка вначале (возможно, что-то найдется в документации SAP). В примере мы задали «установить завод 1000», а для формирования серийного номера изготовителя задали кодировку на языке ABAP, т.е. фактически там идет генерация GUID-а, после чего нажал кнопку  – копирования значений в поля и система показала какими значениями, будет выполнено заполнение полей, Рис. 10: MASS-10.png.

Рис 10. MASS-10.png

Как видим, для поля серийного номера изготовителя были сгенерированы уникальные серийные номера. Пример подпрограммы кодировки для генерации внешних серийных номеров для транзакции MASS следующий (система сама генерируют заголовок подпрограммы):

Для обновления данных следует нажать кнопку сохранения результата. Однако пока еще не готова реализация собственно самого функционального модуля Y_TSH_MASS_CHANGE_IFLOT, который выполнит обновление данных на основании заполненных пользователями критериям. Фактически, не более чем за 15-20 минут мы создали диалоговую транзакцию для массового изменения необходимых нам данных с гибким вводом. Реализация, функции изменения данных объекта, будет рассмотрена ниже.

3. Настройка журнала обработки данных

Все сообщения, возникшие в ходе обновления данных, должны быть записаны в журнал обработки данных (далее журнал) и затем транзакция MASS покажет для каждой записи статус обновления или любую другую информацию, которая будет записана в журнал. Поэтому надо настроить наш бизнес-объект на управление журналом. Журнал настраивается с помощью ракурса ведения V_BALSUB – Журнал приложений: ракурс для ведения подобъектов. Для этого через транзакцию SM30 выполним ведение ракурса, появится экран запроса рабочей области, Рис. 11: MASS-11.png.

Рис 11. MASS-11.png: транзакция SM30 – экран запроса рабочей области

Имя рабочей области MASS, как и у транзакции ведения данных, поэтому введем код области и перейдем на следующий экран ведения данных, где добавим новую запись, Рис. 12: MASS-12.png (нужно ввести только имя объекта и текст описания).

Рис 12. MASS-12.png: ввод имени объекта и текста описания

Сохраним значения в запрос, фактически еще одни шаг по настройке транзакции MASS выполнен.

4. Настройка операций просмотра данных журнала

Эта настройка необязательна, но если необходимо, чтобы массовое ведение выглядело как в стандарте, то её лучше сделать. Назначение настройки заключается в том, что она обеспечивает переход из журнала транзакции MASS в просмотр или изменение обрабатываемых объектов (в нашем примере - технических мест). Если данную настройку не сделать, то журнал обработки будет выглядеть следующим образом, Рис. 13: MASS-13.png.

Рис 13. MASS-13.png: вид журнала обработки без настройки

Мы видим на панели инструментов только кнопку просмотра подробного текста к сообщениям об обработке. На рисунке отображён результата попытки присвоить значение поля «завод», равное 1200, для двух объектов. Система не разрешила выполнить такую операцию и сообщила причину.

Перейдём к ведению ракурса MASSAPPEX, в который добавим имена двух функциональных модулей, один для просмотра данных объекта (технического места), а другой для изменения. Как только такие данные будут добавлены, транзакция MASS выведет на панели инструментов две кнопки, для просмотра и изменения объектов из журнала, Рис. 14: MASS-14.png.

Рис 14. MASS-14.png: ведение ракурса MASSAPPEX

В поле CHAR20 имена событий, которые можно выбрать. Имена функциональных модулей, как и в случае с модулем обновления данных, пока только задаем, а их реализация будет описана ниже. Сохраняем данные, если теперь выполнить запуск массового изменения, то в журнале обработки появятся две кнопки, просмотра и изменения обрабатываемых объектов, Рис. 15: MASS-15.png.

Рис 15. MASS-15.png: вид журнала обработки с настройкой

Примечание
Вы не сможете получить журнал обработки до реализации пункта «Реализация функции обновления данных Y_TSH_MASS_CHANGE_IFLOT», т.е. результаты обработки будут видны только после того, как будут написаны объявленные ранее функциональные модули изменения и просмотра объектов.

5. Настройка возможности тестового запуска массового обновления

Для возможности запуска транзакции MASS в тестовом режиме необходимо добавить событие «TEST_MODE_KNOWN», так как описано в предыдущем разделе, в ракурс ведения MASSAPPEX в имени функционального модуля необходимо указать *, Рис. 16: MASS-16.png. Данное событие, позволит запускать транзакцию массового изменения с признаком тестового режима. Описание параметров будет сделано ниже.

Рис 16. MASS-16.png: настройка тестового запуска

После добавления этого события, если перейти в режим обработки данных транзакции MASS, на экране обновления данных на панели инструментов появится кнопка запуска транзакции в тестовом режиме, Рис. 17: MASS-17.png.

Рис 17. MASS-17.png: режим обработки данных

Если выполнить транзакцию в тестовом режиме, то в журнале появится сообщение, что изменения не сохранены, Рис. 18: MASS-18.png. Необходимо всегда обращать внимание на режим запуска транзакции MASS: тестовый или продуктивный, в функции Y_TSH_MASS_CHANGE_IFLOT, когда будете выполнять ее реализацию.

Рис 18. MASS-18.png: выполнение транзакции в тестовом режиме

6. Реализация функции обновления данных Y_TSH_MASS_CHANGE_IFLOT

Для типов объектов «техническое место», начиная с версии системы 4.6, существует BAPI функция, которая позволяет изменять программно данные технического места: BAPI_FUNCLOC_CHANGE. Если до этого места особого знания языка ABAP не требовалось, то реализация данного пункта невозможна без знаний ABAP, так как функция Y_TSH_MASS_CHANGE_IFLOT будет являться окаймляющей функцией вокруг стандартной BAPI. Параметры этой функции должны быть заданы по определенной маске, так как её вызов происходит динамически транзакций MASS для каждой записи отмеченной в этой транзакции для обработки.

На Рис. 19: FNMASS-01.png представлены входные и выходные параметры функционального модуля Y_TSH_MASS_CHANGE_IFLOT, который надо создать.

Рис 19. FNMASS-01.png: входные и выходные параметры функционального модуля Y_TSH_MASS_CHANGE_IFLOT

Внимание
Обратите внимание на то, что имена параметров и типы должны быть заданы в таком же виде, как показано на Рис. 20: FNMASS-01.png, кроме закладки «Таблицы», правила формирования имен которой, будут описаны отдельно.
  • SELDATA – Таблица, содержащая заголовок объекта и параметры обработки, с которым работает транзакция MASS. Тип переменной MASS_TABDATA. Таблица должна быть отмечена как переменные значения, чек-бокс в соответствующей колонке.
  • TESTMODE – Параметр, определяющий вариант выполнения транзакции MASS, если в данном поле стоит значение «X», значит выполнение запущено в тестовом режиме и вам не нужно выполнять COMMIT WORK, в противном случае, требуется выполнить изменения так как это продуктивный прогон операции. Тип параметра XFELD.
  • MSG – Таблица сообщений, в которую вы должны вернуть для каждой обрабатываемой строки результат обработки. Данные этой таблицы будут выведены как журнал выполнения изменений. Тип параметра MASS_MSGS. При задании данного типа, система скажет, что пул типов не включен в группу функций. Для решения этой проблемы перейдите в TOP-инклуд группы функций, в которой вы создаете функциональный модуль и вставьте там строку, которая определяет общий пул типов транзакции MASS:
  • TYPE-POOLS: mass.
  • Таблица SYTSH_IFLOTSTRUCT – Имя таблицы, в которую система передаст данные с экрана изменений транзакции MASS. Имя данной переменной должно быть сформировано по следующей маске S + <Имя таблицы/ракурса заданного при формировании сегментов из MASSTAB-TABNAME>, в данном случае это будет имя созданного ракурса, который содержит все поля, разрешенные к изменениям, ну а тип переменной будет это имя нашего ракурса. Если таблиц с полями для изменений было определено несколько, то они должны быть все перечислены на закладке таблиц с параметром – «не обязательно» в соответствующей колонке.

Сам текст функционального модуля, реализующего обновление технических мест, представлен ниже. Обратите внимание на параметры заполнения журнала транзакции MASS, особенно на формирование ключа объекта. В данном случае ключ формируется очень просто, так как это код технического места. Например, если бы это были изменения карточек ОС, то там ключ объекта должен был бы быть как соединение трех полей: <Код БЕ> + <Номер карточки ОС> + <Субномер карточки ОС>, т.е. ключ должен однозначно определять обрабатываемую запись.

7. Реализация функций просмотра и изменения объектов из журнала обработки

Переменная журнала ls_msg-objkey должна содержать ключ обрабатываемого объекта. В дальнейшем, при вызове функций просмотра или изменения этот ключ будет передаваться в заданные вами функциональные модули, чтобы вы смогли перейти к выдранному пользователем объекту. Для просмотра объекта мы объявляли функцию Y_TSH_MASS_VIEW_IFLOT, Рис. 20: FNMASS-02.png

Рис 20. FNMASS-02.png

Сам текст модуля очень простой:

Аналогично выполняется объявление функционального модуля для изменений обрабатываемых объектов Y_TSH_MASS_EDIT_IFLOT, Рис. 21: FNMASS-03.png

Рис 21. FNMASS-03.png

Текст функционального модуля практически такой же, как и при просмотре, отличается только код транзакции:

Итак, фактически за три часа рабочего времени была создана настройка и разработка для массового изменения технических мест, при этом, если нужно добавить какие-то дополнительные поля для обработки, то их просто нужно внести в ракурс ведения YTSH_IFLOTSTRUCT, конечно при условии, что эти переменные находятся только в таблице IFLOT. Функциональный модуль изменения технических мест, написан так, что корректно будет обрабатывать такие добавления.

Столкнулась с проблемой редактирования в MM17 добавленного поля (поле неактивно). Поле Z*. Где искать корень проблемы?