Автор Тема: MASS - Расширение транзакции массовых изменений.  (Прочитано 42970 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Довольно часто, возникает необходимость массового изменения данных для объектов. Например, это технические места или карточки ОС, когда требуется не просто сделать об-новление данных в таблицах системы, что в принципе категорически запрещено, а именно изменить данные, используя стандартные транзакции системы, т.е. чтобы информация об изменениях осталась в журналах обработки и т.д. Стандартно в системе есть хорошая транзакция для таких операций – MASS, которая как бы позволяет выполнять такие опе-рации, описание работы с ней находится, например тут: You are not allowed to view links. Register or Login,
статья Марка Чалфена, к сожалению доступна только для подписчиков журнала, ну да в принципе там ничего сложного нет, так что можно и само-му разобраться как все работает.  Сам Марк, очень восхищен данной транзакцией, вот его фраза из статьи: «Знали ли Вы, что всего за несколько минут можно изменить исполните-ля, ответственного за 5000 клиентов без написания программы? Известно ли Вам, что ба-зовую дату входящих счетов-фактур можно изменить одновременно для диапазона креди-торов? Когда Вам необходимо внести масштабные изменения в основные данные, Вы обычно пишите собственную программу для этой цели?». Что я могу сказать по этому по-воду, да мы пишем собственную программу, но иногда, прежде чем писать, мы думаем, смотрим и анализируем, а потом уже пишем...

И так что нужно чтобы написать программу массового обновления данных для любого объекта в системе? Задачи такого рода обычно состоят из следующих шагов:

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

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

Примечание: Конечно, возможна ситуация, когда написание кода по изменению объекта, является само по себе сложной задачей, но в среднем из моей практики, обеспечение диа-лога с пользователем более сложная в реализации задача. Точнее даже скажем так, не сложная, а трудоемкая как по времени, так и по объему написания кода.

И так поехали...

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Когда у меня появилась задача массового изменения карточек ОС, я зная про транзакцию MASS, радостно сказал, что не вопрос, есть стандартная транзакция для такой операции и через минут 30 когда запустил ее, тут же получил от SAP-а и Марка Чалфена, первый привет, транзакция есть, но она не работает для изменений карточек ОС, да и вообще вы-бор объектов, которые могут работать с данной транзакцией, оказался не очень большим. В общем, как обычно задача заключалась в следующем или рисовать все перечисленные выше шаги самому, или как обычно лучше день потерять, но зато потом за 5 минут, куда надо долететь. Решил, что кода написать я всегда успею, мне как индусам за количество строк не платят, поэтому, лучше посмотреть на эту транзакцию внимательно и решить, а нельзя ли добавить к ней новые объекты. К тому же первое же поле данной транзакции, а именно «Тип объекта», навевало на мысль, что свои объекты добавить в данную транзак-цию, наверное, возможно, что в дальнейшем подтвердилось практикой. Пример стандарт-ного списка объектов транзакции MASS, приведен на рисунке MASS-01.png.

В целом задача фактически сводится к написанию обработки изменения данных, т.е. пункт 4, плюс небольшие работы минут на 15,  по настройке транзакции MASS для управ-ления процессом изменений, т.е. мы получаем выигрыш во времени разработки, плюс по-лучаем одинаковый интерфейс работы с массовыми изменениями для конечного пользо-вателя. Для примера сделаем разработку массового изменения технических мест.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Для начала определим имя бизнес-объекта для ведения технических мест. На самом деле наличие именно бизнес-объекта не обязательно имя можно добавить любое, система про-сто показывает через код поиска, список данных из таблиц:
  • MASSFUNC – Массовое изменение: функции для обновления базы данных, тут просто надо добавить свой объект и параметры объекта.
  • MASSNAME – Тексты к объектам массовых изменений. В таблицу нужно доба-вить текст, описывающий добавляемый объект.
Фактически после этого ваш введенный объект изменений будет отображаться для выбора в транзакции MASS. Для ввода требуемых данных, можно воспользоваться ракурсом ве-дения, транзакция SM30: MASSFUNC, в которой добавим наш новый объект по массово-му изменению технических мест.

Примечание: Так как для технических мест есть код бизнес-объекта, то воспользуемся этим именем. Определить имя бизнес объекта, можно используя таблицу TOJTB – Ос-новные данные репозитария бизнес-объектов. Зайти в просмотр данных таблицы и  че-рез код поиска значений к полю NAME можно определить, какие есть бизнес-объекты для технических мест. Как видим в системе существует 4 объекта, возьмем BUS0010, что-бы было похоже на то, что есть в таблицах транзакции MASS. Еще раз напоминаю, что на самом деле никакой связи транзакции MASS с данными бизнес-объектов нет, поэтому будет ли это имя из таблицы TOJTB или же это будет ваше собственное имя, в принци-пе все равно, но в целом для поддержания общих принципов наименования объектов, пра-вильно будет использовать имена стандартных бизнес-объектов из таблицы TOJTB.

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

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

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


Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Теперь нужно добавить имена таблиц и полей, которые можно будет изменять в транзак-ции MASS. В общем виде можно указать все таблицы, в которых хранятся данные техни-ческих места, например это таблицы IFLOT, ILOA и другие, а затем перечислить все по-ля этих таблиц. Однако нужно понимать, что фактически система не даст изменить все поля технического места. Вообще-то зайдите в транзакцию изменения технических мест IL02 и вы определите какие поля можно менять, а какие закрыты от изменений, например код технического места и код балансовой единицы, изменить нельзя, поэтому возьмем од-ну таблицу 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.

Теперь зададим этот ракурс в таблице MASSTAB, через транзакцию ведения SM30. Тип объекта укажем BUS0010, который мы выбрали ранее. В поле имя таблицы зададим имя ракурса YTSH_IFLOTSTRUCT. Далее в поле «Число», укажем например значение 10, данное поле служит для упорядочивания списка таблиц, если например таблиц/сегментов для обновления больше одной, что в нашем примере не актуально, у нас одна таблица. В поле «Таб БД», укажем имя таблицы базы данных, из которой фактически будет идти вы-борка. Для чего требуется указать имя таблицы в колонке «Таб. БД»? Суть заключается в следующем. В поле «Таблица» задаем имя структуры содержащей только поля, разрешен-ные для изменения, которые и предложит транзакция MASS для выбора пользователю. Однако часто ситуация заключается в том, что например мы разрешаем изменять поле се-рийного номера, но вот критерии выбора записей для обработки, в которых будет изме-няться поле серийный номера,  мы хотим например выбирать по полю «вид технического места», при этом самое поле вида технического места, давать изменять не требуется. Вот для этого мы и задали имя основной таблицы базы данных, как IFLOT, что служит для транзакции MASS командой предложить пользователю все поля этой таблицы на селек-ционном экране выбора записей, которые предполагается изменить. Если выборка данных должна выполняться как-то особенно, то в поле «ФМ выбора», нужно задать имя функ-ционального модуля выполняющего выборку данных. В общем случае мне было доста-точно стандартных функций выбора данных. И последнее поле «Без нов. сегментов», в данном поле поставлена галка, суть данного чек-бокса в том, что транзакция MASS по-зволяет не только изменять данные, но и массово создавать новые данные. В данном при-мере создание новых записей технических мест рассматриваться не будет, кому нужно разберетесь, а в данном момент мы просто отключаем закладку создания новых техниче-ских мест, так как не будем использовать эту функциональность. Пример создания записи, рисунок 6: MASS-06.png.

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

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

Транзакция перейдет к экрану выбора технических мест, которые мы хотим изменить. Фактически это уже описание работы с транзакцией MASS. По умолчанию выбор предпо-лагается по ключевым полям, в данном случае это поле кодов технических мест, однако транзакция MASS, разрешает сделать выбор данных, по любым полям которые есть в таб-лице IFLOT, так как мы задали именно эту таблицу в настройке выше. Добавил на экран выбора поля планирующего завода и типа технического места, , рисунок 09: MASS-09.png, затем указал выбрать все технические места, у которых не задан планирующий за-вод после чего нажал F8 – выполнить выбор данных. Система сообщила, сколько записей попадают под указанные критерии и предложила или перейти к обработке изменений в диалоге или же выполнить фоновое изменение данных, используя создание варианта вы-полнения. В данный момент вы будем выполнять все операции в диалоговом режиме, по-этому выберем кнопку, просмотреть все записи. У меня в системе, например, было выбра-но 127 записей без присвоенного планирующего завода.

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

Как видим для поля серийного номера изготовителя были сгенерированы уникальные се-рийные номера.  Пример подпрограммы кодировки для генерации внешних серийных но-меров для транзакции MASS следующий (система сама генерируют заголовок подпро-граммы):
Код: You are not allowed to view links. Register or Login
* X is the value you must return
form GET_NEW_YTSH_IFLOTSTRUCT_SERGE
using segment structure YTSH_IFLOTSTRUCT
changing X.

*-- Добавленный код генерации серийного номера --
DATA: l_guid TYPE SYSUUID_C.

CALL FUNCTION 'ICF_CREATE_GUID'
 IMPORTING
   ID            = l_guid.

x = l_guid.
*-----------------------------------------------

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Все сообщения, возникшие в ходе обновления данных должны быть записаны в журнал обработки и затем транзакция MASS покажет для каждой записи статус обновления или любую другую информацию которая будет записана в журнал. Поэтому надо настроить наш бизнес-объект на управление журналом. Журнал настраивается используя ракурс ве-дения V_BALSUB – Журнал приложений: ракурс для ведения подобъектов. Для этого че-рез транзакцию SM30 выполним ведение ракурса. Появится экрана запроса рабочей об-ласти, рисунок 11: MASS-11.png.

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

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

Оффлайн Uukrul

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


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

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

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

Примечание: Вы не сможете получить журнал обработки до реализации пункта 1.7, т.е. результаты обработки будут видны только после того, как будут написаны объяв-ленные ранее функциональные модули изменения и просмотра объектов.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Для возможности запуска транзакции MASS в тестовом режиме необходимо добавить со-бытие «TEST_MODE_KNOWN», так как описано выше в разделе 1.5, в ракурс ведения MASSAPPEX в имени функционального модуля необходимо указать *, рисунок 15: MASS-16.png. Данное событие, позволит запускать транзакцию массового изменения с признаком тестового режима. Описание параметров будет сделано ниже.

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

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Для технических мест, с версии системы 4.6 есть BAPI функция, которая позволяет изме-нять программно данные технического места: BAPI_FUNCLOC_CHANGE. Если до это-го места особого знания языка ABAP не требовалось, то для реализации данного пункта без знаний ABAP дальше не продвинутся, так как фактически функция Y_TSH_MASS_CHANGE_IFLOT, будет являться окаймляющей функцией вокруг стан-дартной BAPI. Параметры этой функции должны быть заданы по определенной маске, так как ее вызов происходит динамически транзакций MASS для каждой записи отмеченной в этой транзакции для обработки.

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

Код: You are not allowed to view links. Register or Login
FUNCTION y_tsh_mass_change_iflot.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(SELDATA) TYPE  MASS_TABDATA
*"     REFERENCE(TESTMODE) TYPE  XFELD
*"  EXPORTING
*"     VALUE(MSG) TYPE  MASS_MSGS
*"  TABLES
*"      SYTSH_IFLOTSTRUCT STRUCTURE  YTSH_IFLOTSTRUCT OPTIONAL
*"----------------------------------------------------------------------
  DATA: ls_msg LIKE LINE OF msg,
        l_total_line LIKE sy-tabix,
        ls_seldata TYPE mass_wa_tabdata,
        ls_fieldnames TYPE ddobjname.
* Переменные для работы с BAPI: BAPI_FUNCLOC_CHANGE
  DATA: ls_data_general LIKE bapi_itob,
        ls_data_generalx LIKE bapi_itobx,
        ls_data_specific LIKE bapi_itob_fl_only,
        ls_data_specificx LIKE bapi_itob_fl_onlyx,
        ls_return LIKE bapiret2.
* Переменные для заполнения структур BAPI
  DATA: ls_dd04l LIKE dd04l,
        s_source LIKE dd04l-rollname,
        s_dest LIKE dd04l-rollname,
        s_destx LIKE dd04l-rollname.
  FIELD-SYMBOLS: <source>, <dest>, <destx>.

* Прочитаем, если наша таблица в переданных структурах
  READ TABLE seldata INTO ls_seldata WITH KEY tabname-name = 'YTSH_IFLOTSTRUCT'.
  CHECK sy-subrc = 0.
* Количество записей для обработки
  DESCRIBE TABLE sytsh_iflotstruct LINES l_total_line.

* Обработать строки заданных данных
  LOOP AT sytsh_iflotstruct.
*   Индикатор процесса выполнения обновления данных
    PERFORM mass_save_process_indicator USING sy-tabix l_total_line testmode.

*   Имена полей, выбранные для изменения перенести в структуры BAPI
    LOOP AT ls_seldata-fieldnames INTO ls_fieldnames.
      SELECT SINGLE * INTO ls_dd04l
      FROM dd04l WHERE rollname = ls_fieldnames AND
                       as4local = 'A' AND
                       as4vers = space.
      CONCATENATE 'S' ls_seldata-tabname-name '-' ls_fieldnames INTO s_source.
      CONCATENATE 'LS_DATA_GENERAL' '-' ls_dd04l-deffdname INTO s_dest.
      CONCATENATE 'LS_DATA_GENERALX' '-' ls_dd04l-deffdname INTO s_destx.
      ASSIGN: (s_source) TO <source>,
              (s_dest) TO <dest>,
              (s_destx) TO <destx>.
      <dest> = <source>.
      <destx> = 'X'.
      UNASSIGN: <dest>, <source>, <destx>.
    ENDLOOP.

*   Выполнить изменение технического места
    CALL FUNCTION 'BAPI_FUNCLOC_CHANGE'
      EXPORTING
        functlocation  = sytsh_iflotstruct-tplnr
        data_general   = ls_data_general
        data_generalx  = ls_data_generalx
        data_specific  = ls_data_specific
        data_specificx = ls_data_specificx
      IMPORTING
        return         = ls_return.

*   Заполним данные журнала выполнения операции
    CLEAR ls_msg.
    IF ls_return-type <> 'E' AND ls_return-type <> 'A'.
      ls_msg-objkey = sytsh_iflotstruct-tplnr.
      ls_msg-msgty  = 'S'.
      ls_msg-msgid  = 'M&'.
      IF testmode = space. ls_msg-msgno  = '105'. ELSE. ls_msg-msgno  = '117'. ENDIF.
    ELSE.
      ls_msg-objkey = sytsh_iflotstruct-tplnr.
      ls_msg-msgty  = ls_return-type.
      ls_msg-msgid  = ls_return-id.
      ls_msg-msgno  = ls_return-number.
      ls_msg-msgv1  = ls_return-message_v1.
      ls_msg-msgv2  = ls_return-message_v2.
      ls_msg-msgv3  = ls_return-message_v3.
      ls_msg-msgv4  = ls_return-message_v4.
    ENDIF.
    APPEND ls_msg TO msg.

*   Если продуктивный режим и нет ошибки выполнения
    IF testmode = space AND ls_msg-msgty  = 'S'.
      COMMIT WORK.
    ELSE.
      ROLLBACK WORK.
    ENDIF.
  ENDLOOP.
ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  MASS_SAVE_PROCESS_INDICATOR
*&---------------------------------------------------------------------*
*       Индикатор хода выполнения процесса
*----------------------------------------------------------------------*
*      --> P_CURRENT_LINE - Текущая обрабатываемая строка
*      --> P_TOTAL_LINE   - Всего строк в таблице для обработки
*      --> P_TESTMODE     - Продуктивный или тестовый режим запуска
*----------------------------------------------------------------------*
FORM mass_save_process_indicator USING p_current_line
                                       p_total_line
                                       p_testmode.
  DATA: s_tab(6) TYPE c,
        s_line(100) TYPE c,
        percentage TYPE i,
        current_line TYPE i.

  CHECK NOT p_total_line IS INITIAL.

  current_line = p_current_line + 1.
  percentage = ( current_line * 100 ) / p_total_line.
  IF percentage = 0. percentage = 1. ENDIF.
  WRITE: p_current_line TO s_tab LEFT-JUSTIFIED.
  IF p_testmode IS INITIAL.
    CONCATENATE 'Сохранение изменений. Позиция:'(001) s_tab INTO s_line.
  ELSE.
    CONCATENATE 'Тестовый режим. Позиция:'(002) s_tab INTO s_line.
  ENDIF.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = percentage
      text       = s_line.
ENDFORM.                    " MASS_SAVE_PROCESS_INDICATOR

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Переменная журнала ls_msg-objkey должна содержать ключ обрабатываемого объекта. В дальнейшем, при вызов функций просмотра или изменения, этот ключ будет передаваться в заданные вами функциональные модули, что бы вы смогли перейти к выдранному поль-зователем объекту. Для просмотра объекта мы объявляли функцию Y_TSH_MASS_VIEW_IFLOT, рисунок 21: FNMASS-02.png

Сам текст модуля очень простой:
Код: You are not allowed to view links. Register or Login
FUNCTION y_tsh_mass_view_iflot.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(RECORD) OPTIONAL
*"     VALUE(TABLE) LIKE  DCOBJDEF-NAME OPTIONAL
*"     VALUE(KEY) OPTIONAL
*"----------------------------------------------------------------------
  SET PARAMETER ID: 'IFL' FIELD key,
                    'ISR' FIELD space.
  CALL TRANSACTION 'IL03'AND SKIP FIRST SCREEN.
ENDFUNCTION.

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

Текст функционального модуля практически такой же, как и при просмотре, отличается только код транзакции:
Код: You are not allowed to view links. Register or Login
FUNCTION y_tsh_mass_edit_iflot.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(RECORD) OPTIONAL
*"     VALUE(TABLE) LIKE  DCOBJDEF-NAME OPTIONAL
*"     VALUE(KEY) OPTIONAL
*"----------------------------------------------------------------------
  SET PARAMETER ID: 'IFL' FIELD key,
                    'ISR' FIELD space.
  CALL TRANSACTION 'IL02'AND SKIP FIRST SCREEN.
ENDFUNCTION.

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

Оффлайн Uukrul

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

Оффлайн DEAD_MOROZ

  • Newbie
  • *
  • Сообщений: 63
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Олег, огромное спасибо.
Очень хорошую работу проделал! :)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Очень хорошую работу проделал! :)
Ну если еще дожать, то можно объединить ракурсы ведения в настройку: You are not allowed to view links. Register or Login и тогда будет совсем все кошерно. Не понимаю почему сам SAP нигде об этом ничего не пишет. Инструмент действительно мощный и удобный. Так сказать тот не частый момент, когда мне самому нравится как это сделано.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Тут спросили про полномочия на ведение данных, что как и т.д. Ну начнем с того что все стандартные полномочия на объекты при вызове BAPI проверяются и работают, так что пользователь изменить к примеру данные карточек ОС, если у него есть только полномочия на ведение технических объектов, не сможет, но возникает вопрос. что он сможет запустить транзакцию и выбрать данные по ОС. Так вот чтобы этого не произошло идем в транзакцию SE93 и создаем свою пользовательскую транзакцию например YIL05, вид транзакции выбираем: "Транзакция с параметрами (транзакция параметров)" и дальше заполняем поля как на рисунке. Все после этого пользователь будет попадать сразу на второй экран транзакции MASS, без возможности выбора объекта для обработки.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: MASS - Расширение транзакции массовых изменений.
« Ответ #13 : Ноябрь 05, 2013, 09:59:31 pm »
Примечание!

Пришлось тут делать комбинированную настройку для объекта, когда изменяется сам объект + статусы, причем хотелось это сделать в рамках одного объекта изменения (для статусов использовалась стандартная техника ведения статусов объекта). В общем  для корректной работы нужно объявлять не ракурс на таблицу а просто сделать в словаре таблицу данных, включить в нее перечень необходимых полей = поля объекта + поля статуса, проставить ключевые поля, добавить так же технические поля, если нужно (их потом можно исключить в событиях DISPLAY_OBJECT и LIMIT_FIELDS, написав соответствующие реализации). Основное это именно возможность указания ключевых полей, что нельзя сделать при создании ракурса данных.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: MASS - Расширение транзакции массовых изменений.
« Ответ #14 : Ноябрь 06, 2013, 12:39:10 pm »
Примечание 2!

Как оказалось, не показалось, но поля типа CHAR которые больше 80 символов система не дает изменять через MASS, в коде функционального модуля, который формирует каталог полей: MASS_DDIC_CACHE со строки 67 написано следующее:
Код: You are not allowed to view links. Register or Login
           if lt_dfies-outputlen > 80.                  "note 894143
             read table fieldinfo_tab assigning <fieldinfo_line>
                index sy-tabix.                         "note 894143
               if sy-subrc eq 0.                        "note 894143
                <fieldinfo_line>-displ_only = 'X'.      "note 894143
               endif.                                   "note 894143
           endif.                                       "note 894143
в общем если строки больше 80 символов, то присвоить им флажок только для просмотра. Однако, не все так плохо как оказалось, можно добавить событие LIMIT_FIELDS в ракурсе ведения MASSAPPEX. Далее реализовать функциональный модуль поддержки, который выполняет обработку каталога полей MASS, в котором можно выполнить сброс флажка, например таким образом:
Код: You are not allowed to view links. Register or Login
FUNCTION z_iaa_mass_limit_fields.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  TABLES
*"      ALL_FIELDS TYPE  MASS_ALLFIELDS OPTIONAL
*"----------------------------------------------------------------------
* Для полей которые больше 80 символов выполнить сброс флага
* только для просмотра, чтобы разрешить модификацию таких полей
  LOOP AT all_fields WHERE leng > 80.
    all_fields-displ_only = space.
    MODIFY all_fields.
  ENDLOOP.
ENDFUNCTION.

Оффлайн SCORPION_Z

  • Newbie
  • *
  • Сообщений: 14
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: MASS - Расширение транзакции массовых изменений.
« Ответ #15 : Ноябрь 09, 2016, 02:35:41 pm »
Олег, а каким образом заставить работать mass с полями пользователя при изменении позиций PO и реально ли это? Поля расширены в CI_EKPODB.

По интерфейсу оболочка MASS_CHANGE_PURCHASE_ORD_BAPI, вызывает ФМ BAPI_PO_CHANGE, но не работает с Customer's Own Fields (Import Parameters)

You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: MASS - Расширение транзакции массовых изменений.
« Ответ #16 : Ноябрь 09, 2016, 08:21:32 pm »
You are not allowed to view links. Register or Login
Олег, а каким образом заставить работать mass с полями пользователя при изменении позиций PO и реально ли это? Поля расширены в CI_EKPODB.
Ну воспользоваться не стандартным методом MASS для заказов, а написать свой объект на основе BAPI_PO_CHANGE и там включить поля пользователя через структуры расширений.

Sapforum.Biz

Re: MASS - Расширение транзакции массовых изменений.
« Ответ #16 : Ноябрь 09, 2016, 08:21:32 pm »