MASS - Расширение транзакции массовых изменений.

Автор Uukrul, Березень 09, 2012, 02:20:37 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Uukrul

Довольно часто, возникает необходимость массового изменения данных для объектов. Например, это технические места или карточки ОС, когда требуется не просто сделать об-новление данных в таблицах системы, что в принципе категорически запрещено, а именно изменить данные, используя стандартные транзакции системы, т.е. чтобы информация об изменениях осталась в журналах обработки и т.д. Стандартно в системе есть хорошая транзакция для таких операций – MASS, которая как бы позволяет выполнять такие опе-рации, описание работы с ней находится, например тут: http://www.sapland.ru/articles/spj/2009/3/Uprostite_razrabotku_ABAP_s_pomoschiyu_instrumenta_massovogo_vedeniya.html,
статья Марка Чалфена, к сожалению доступна только для подписчиков журнала, ну да в принципе там ничего сложного нет, так что можно и само-му разобраться как все работает.  Сам Марк, очень восхищен данной транзакцией, вот его фраза из статьи: «Знали ли Вы, что всего за несколько минут можно изменить исполните-ля, ответственного за 5000 клиентов без написания программы? Известно ли Вам, что ба-зовую дату входящих счетов-фактур можно изменить одновременно для диапазона креди-торов? Когда Вам необходимо внести масштабные изменения в основные данные, Вы обычно пишите собственную программу для этой цели?». Что я могу сказать по этому по-воду, да мы пишем собственную программу, но иногда, прежде чем писать, мы думаем, смотрим и анализируем, а потом уже пишем...

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


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

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

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

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

Uukrul

Когда у меня появилась задача массового изменения карточек ОС, я зная про транзакцию MASS, радостно сказал, что не вопрос, есть стандартная транзакция для такой операции и через минут 30 когда запустил ее, тут же получил от SAP-а и Марка Чалфена, первый привет, транзакция есть, но она не работает для изменений карточек ОС, да и вообще вы-бор объектов, которые могут работать с данной транзакцией, оказался не очень большим. В общем, как обычно задача заключалась в следующем или рисовать все перечисленные выше шаги самому, или как обычно лучше день потерять, но зато потом за 5 минут, куда надо долететь. Решил, что кода написать я всегда успею, мне как индусам за количество строк не платят, поэтому, лучше посмотреть на эту транзакцию внимательно и решить, а нельзя ли добавить к ней новые объекты. К тому же первое же поле данной транзакции, а именно «Тип объекта», навевало на мысль, что свои объекты добавить в данную транзак-цию, наверное, возможно, что в дальнейшем подтвердилось практикой. Пример стандарт-ного списка объектов транзакции MASS, приведен на рисунке MASS-01.png.

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

Uukrul

Для начала определим имя бизнес-объекта для ведения технических мест. На самом деле наличие именно бизнес-объекта не обязательно имя можно добавить любое, система про-сто показывает через код поиска, список данных из таблиц:

  • 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

Теперь нужно добавить имена таблиц и полей, которые можно будет изменять в транзак-ции 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 следующий (система сама генерируют заголовок подпро-граммы):

* 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

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

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

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

Uukrul

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


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

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

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

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

Uukrul

Для возможности запуска транзакции 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

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


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

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

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

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

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

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

Как обычно все одним файлов в формате PDF: "MASS - Массовое ведение данных.pdf"

DEAD_MOROZ

Олег, огромное спасибо.
Очень хорошую работу проделал! :)

Uukrul

Цитата: DEAD_MOROZ від Березень 11, 2012, 02:48:43 ПП
Очень хорошую работу проделал! :)
Ну если еще дожать, то можно объединить ракурсы ведения в настройку: http://sapforum.biz/index.php/topic,1942.0.html и тогда будет совсем все кошерно. Не понимаю почему сам SAP нигде об этом ничего не пишет. Инструмент действительно мощный и удобный. Так сказать тот не частый момент, когда мне самому нравится как это сделано.

Uukrul

Тут спросили про полномочия на ведение данных, что как и т.д. Ну начнем с того что все стандартные полномочия на объекты при вызове BAPI проверяются и работают, так что пользователь изменить к примеру данные карточек ОС, если у него есть только полномочия на ведение технических объектов, не сможет, но возникает вопрос. что он сможет запустить транзакцию и выбрать данные по ОС. Так вот чтобы этого не произошло идем в транзакцию SE93 и создаем свою пользовательскую транзакцию например YIL05, вид транзакции выбираем: "Транзакция с параметрами (транзакция параметров)" и дальше заполняем поля как на рисунке. Все после этого пользователь будет попадать сразу на второй экран транзакции MASS, без возможности выбора объекта для обработки.

Uukrul

Примечание!

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

Uukrul

Примечание 2!

Как оказалось, не показалось, но поля типа CHAR которые больше 80 символов система не дает изменять через MASS, в коде функционального модуля, который формирует каталог полей: MASS_DDIC_CACHE со строки 67 написано следующее:

           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, в котором можно выполнить сброс флажка, например таким образом:

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

Олег, а каким образом заставить работать mass с полями пользователя при изменении позиций PO и реально ли это? Поля расширены в CI_EKPODB.

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


Uukrul

Цитата: SCORPION_Z від Листопад 09, 2016, 02:35:41 ПП
Олег, а каким образом заставить работать mass с полями пользователя при изменении позиций PO и реально ли это? Поля расширены в CI_EKPODB.
Ну воспользоваться не стандартным методом MASS для заказов, а написать свой объект на основе BAPI_PO_CHANGE и там включить поля пользователя через структуры расширений.