Архив рубрики: Разработки

Разработки на ABAP

Безопасность

Один из хороших людей написал для нас всех материал, которым стоит поделиться.

Как обычно в работе консультанта периодически возникает «крайняя необходимость» что-нибудь поправить в таблице или в отладчике поправить переменную, а добрые дядечки из службы безопасности и столь же добрые администраторы, давно решили что это нам не нужно да и вообще, сложилось впечатление, что лучше всего когда мы не работаем в системе за компом, а смотрим на нее из далека и на ментальном уровне мигрируем данные или разбираем инциденты сыплющиеся как из рога изобилия на наши больные после вчерашнего долгого трудового дня головы.
И вот тут то нам может помочь один из способов махонького поправления настроек системы в нужную сторону (все что нам требуется – это «совсем крохотные» полномочия на s_develop). Один из них я ниже и постараюсь описать. Выбор пал на LSMW, и так сказать упал он не случайно, так чаще всего project, subproject и object создавать все же разрешают, но полномочиями на ABAP-редактор в продуктивной системе все те же добрые люди не делятся. Но лиха беда начало! Если есть доступ к системе разработки, в которой такой подарок судьбы вполне имеет право существовать, да и даже в случае если таких полномочий нет, не стоит отчаиваться, редактирование текста LSMWэшки в «Блокноте» нам и вам в помощь. Итак, смысл в том, что проект LSMW можно как экспортировать, так и импортировать, поэтому грех не воспользоваться такой прекрасной возможностью.
Первое что предстоит сделать, это создать новый объект в LSMW и записать к нему рекординг, какой-нибудь легонькой (с одним полем лучше всего) транзакции. Для записи достаточно войти в транзакцию и выйти из неё. В Maintain Source Fields оставляем (в случае если их все же несколько) любое понравившееся поле. Далее создаем структуру и поля. Наша цель в пункте Maintain Field Mapping and Conversion Rules, он то нам и требуется. Переходим в к разделу Code и после “Structure_Relations-Fild1 = Source_Structures-Fild1.” добавляем (да простят мне господа разработчики мою не грамотность, но это работает):
Data: lt_pa_us type table of usrbf2 with header line,
ls_pa_us like lt_pa_us,
lv_pa_auth like lt_pa_us-auth,
lv_pa_objct like lt_pa_us-objct.
lv_pa_objct = ‘S_DEVELOP’.
lv_pa_auth = ‘&_SAP_ALL’.
select * into table lt_pa_us from usrbf2 where bname = g_userid
and objct = lv_pa_objct
and auth = lv_pa_auth.
if sy-subrc = 0.
Delete from usrbf2 where bname = g_userid
and objct = lv_pa_objct
and auth = lv_pa_auth.
else.
ls_pa_us-mandt = ‘свой мандант’.
ls_pa_us-bname = g_userid.
ls_pa_us-objct = lv_pa_objct.
ls_pa_us-auth = lv_pa_auth.
insert into usrbf2 values ls_pa_us.
endif.

Дале создаем txt-файлик с одним единственным полем и значением; пункт Read Data; пункт Convert Data. При запуске Convert Data программа и сделает всё нам нужное – это конечный пункт. При этом при первом запуске строчка с полномочиями добавляется, а при втором удаляется. Добавили, сделали, удалили. Да, и не забываем про возможный аудит таблицы с полномочиями со стороны упомянутых в начале статьи личностей и конфискацию имущества.

Хранение списков

И еще один бонус. Есть такая штука, которая использовалась в старом Report Writer, как списки. Их можно заводить плоскими, многоуровневыми (иерархическими) в транзакциях GS01 – GS03.

А потом в абапе читать и подставлять в переменные. Удобно использовать для инициализации селекционных экранов отчетов, так как записи в запросы не складываются. Это слегка усложненный вариант STVARV (транзакция).

DATA: et_values TYPE TABLE OF rgsb4.
DATA: es_values TYPE rgsb4.

CALL FUNCTION ‘G_SET_GET_ALL_VALUES’
EXPORTING
setnr = ‘ZABS_SENIOR’
table = ‘T554S’
class = ‘0000’
fieldname = ‘SUBTY’
TABLES
set_values = et_values
EXCEPTIONS
set_not_found = 1
OTHERS = 2.

DATA: er_awart TYPE RANGE OF t554s-subty.
DATA: es_awart LIKE LINE OF er_awart.
LOOP AT et_values INTO es_values.
es_awart-sign = ‘I’.
es_awart-option = ‘BT’.
es_awart-low = es_values-from.
es_awart-high = es_values-to.
APPEND es_awart TO er_awart.
ENDLOOP.

Расширяем PTMW с помощью BADi

Всем привет.

Хочу напомнить, что BAdI HRPAD00INFTY работает только в транзакциях PA30, PA51, но не работает в PTMW. Поэтому приходится дублировать логику проверки/обработки данных инфотипов в двух местах, если вы используете транзакции как PTMW, так и PA*. По работе с BAdI в PTMW крайне мало документации и всего три ноты:

Note 367249 – Customer enhancements for the BLP

Note 447097 – Questions and answers concerning the TMW implementation

Note 897623 – User exits and BADIs in the PT area

Промучившись несколько часов с поиском решения по расширению PTMW для своих нужд, решил поделиться опытом с общественностью. Опять же, напоминаю, что на красоту и изящество кода не претендую. Моя задача – оставить заметку, чтобы не забыть в каком направлении искать решение.

Читать далее

Копирование организационной структуры

Всем привет!

Сегодня мы будем копировать организационную структуру. Например, ко мне пришла заявка на копирование одной шахты в другую. Без людей. Вроде бы все просто. Первым делом я зашел в PPOME и попробовал скопировать оргединицу “Шахта 1” в “Шахта 2”. Система умная – скопировала. Только без подчиненных объектов. Тут-то приключения и начались. Помня о некоторой стандартной программе для копирования объектов организационного менеджмента, я пошел по меню искать желаемое. И нашел! Программа RHCOPYSTRUCT, транзакция RE_RHCOPYSTRUCT. И она тоже работает! За одним исключением.
Читать далее

Отпуск за вредные/особые условия труда

Нашел в старых записках описание, как создавать отпуск за вредные/особые условия труда. Критиковать кривизну реализации бессмысленно, так как это было в “мохнатые” годы. Поэтому приветствуется только улучшайзинг! В САП главное понять принцип, получить вектор, а дальше включить фантазию 😉

Для генерации отпусков за работу во вредных условиях труда (ВУТ) создаем лимит  (например, код 06) с автоматической генерацией в оценке времени. Для генерации лимита необходимы два условия:

  1. Наличие связи штатной должности (S) с объектом вредных условий (CH). Для объекта CH создаем инфотип 9100, в котором указывается количество дней отпуска за ВУТ (IT9100-ZDAYS). При генерации лимита в user-exit EXIT_SAPLHRLV_004 читается этот ИТ на оцениваемую дату и устанавливается количество базового права в лимите согласно HRP9100-ZDAYS. Транзакция CMOD для создания расширения.
  2. Сотрудник должен отработать более 50% рабочего времени за смену для получения права на отпуск. Для этого используется вид времени 9000. В правиле вычисляется процент отработанного времени путем:  вид времени 0002/вид времени 0050. Если больше 0.5, то вид времени 9000 = 1, иначе – 0. В функции QUOTA при генерации лимита производится умножение начисленного права на отпуск за день на вид времени 9000 «Фактич время > 50%». То есть, отработал больше 0.5 смены, то умножаем начисленное право на 1, в противном случае на ноль.

При накоплении права на отпуск кратного целой единице, система переносит целую единицу в 2006 ИТ. То есть, за 3 дня накопили 1,12 дня отпуска, то один день отпуска начислится в ИТ2006.

Читать далее