Для отмены РИ можно использовать расширение QEVA0008 в CMOD. Там же есть пример кода - LXQEVF10. Просто копипастим его в инклуд и все готово. В транзакции можем вызвать пользовательскую функцию из меню:
Читать далее «QA12 и QA14 отмена разрешения об использовании»Рубрика: ABAP
Найти пересечения периодов. Оператор PROVIDE
Очень часто в HR необходимо найти все пересечения ИТ т.е. те периоды в которых данные ТН остаются неизменны. Для этого существует оператор PROVIDE .
PROVIDE FIELDS {*|{comp1 comp2 ...}}
FROM itab1 INTO wa1 VALID flag1
BOUNDS intliml1 AND intlimu1
[WHERE log_exp1]
FIELDS {*|{comp1 comp2 ...}}
FROM itab2 INTO wa2 VALID flag2
BOUNDS intliml2 AND intlimu2
[WHERE log_exp2]
...
BETWEEN extliml AND extlimu
[INCLUDING GAPS].
...
ENDPROVIDE.
Совместно используемые объекты ABAP Shared Object
В ABAP существует инструмент, позволяющий создавать объекты в Общей памяти.
Общая память - это область памяти на сервере приложений, к которой обращаются все программы написанные на ABAP данного сервера. Существует возможность создавать экземпляры объектов в общей памяти и обращаться к ним из разных программ.
Помните, что объекты общей памяти существуют до тех пор, пока существует экземпляр SAP. Любые действия по перезапуску сервера, обновлению системы и т.д. могут удалить экземпляр. Кроме того, любое изменение корневого класса требует удаления и обновления существующих объектов памяти.
Транзакция SHMA - работа с областями Общей памяти.
Читать далее «Совместно используемые объекты ABAP Shared Object»
Сравнение версий объекта в разных системах
Столкнулся с тем, что не все знают как это делать. Ну, что же, возможно, кому-то пригодится.
- Заходим в наш объект, например, в программу в SE38
2. Попадаем на вкладку с версиями. Здесь мы можем Сравнивать версии объекты, восстанавливать прошлые.
Для того чтобы произвести сравнение с другой системой нужно нажать кнопку "Remote-сравнение"
3. В открывшемся окошке выбираем целевую систему из списка
Далее откроется окно с выбором версий в целевой системе. Выбираем нужную и еще раз жмем "Remote-сравнение"
4. Получаем примерно такую штуку
Как видно, смотреть различия не очень удобно, но если нажать кнопку "В 1 столбец\Параллельно" все будет в более удобном виде
Дамп по тайм ауту
Если программа вываливается по тайм ауту, то один из способов устранения проблемы( считаем, что оптимизация не возможна) является использование ФМ TH_REDISPATCH .
Также можно изменить параметр 'rdisp/max_wprun_time' в транзакции RZ11. Параметр применяется без перезагрузке сервера.
Пробежать по одинаковым столбцам структуры. Оператор DO – VARYING
Порой возникает необходимость пробежаться по повторяющимся столбцам структуры. Особенно часто эта необходимость бывает при обработке ИТ 0008 и 0041. В таком случае можем использовать оператор DO - VARYING
Для разработчиков в HR это довольно привычный оператор, в других модулях используются гораздо реже. Собственно поэтому и делаю заметку, может быть для кого-нибудь будет полезным.
Много писать не буду, вот пример кода:
1 2 3 4 5 6 7 |
DO 12 TIMES VARYING lv_type FROM ls_p0041-dar01 NEXT ls_p0041-dar02 VARYING lv_date FROM ls_p0041-dat01 NEXT ls_p0041-dat02. " тут делаем что нам надо ENDDO. |
Остальное легко найдете в справке.
Ошибка в отладчике при одинаковом наименовании глобальных и локальных переменных.
Сегодня прилетел дамп по одной старой разработке. Собственно ошибка была понятна по описанию, суть не в ней. Но чтобы убедиться точно, в правильности выводов по ошибке, решил поставить точку в коде недалеко от строки дампа и посмотреть что да как.
Каково же было мое удивление, что находясь внутри цикла LOOP AT gt_data ASSIGNING <fs_data>. Field-symbol в отладчике отображался как еще не присвоенный, при этом было видно, что на самом деле с ним было все в порядке. Т.е. проблема была именно в отладчике и именно с <fs_data>. Остальные Field-symbol работали корректно, инклуд активировался без ошибок.
Читать далее «Ошибка в отладчике при одинаковом наименовании глобальных и локальных переменных.»
Пустая таблица в FOR ALL ENTRIES IN
Не все знают и не все помнят, что случается когда таблица указанная в FOR ALL ENTRIES IN окажется пустой. А этот момент очень важно учитывать, как в целях корректной выборки данных, так и в целях оптимизации. Собственно, вся информация есть в справке, но кто ее читает))
JOIN Трех таблиц. Небольшая особенность
Предположим, что нужно выбрать данные из таблицы 1 и дополнить их данными из таблиц 2 и 3. Причем таблица 3 относиться к таблице 2.
Прикинув получаем вот такой запрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
"Запрос 1 SELECT mspr~matnr, mspr~charg, vepo~vemng, vepo~venum, vepo~altme, vepo~wdatu, vepo~vbeln FROM mspr LEFT JOIN vepo ON vepo~matnr = mspr~matnr AND vepo~werks = mspr~werks AND vepo~lgort = mspr~lgort AND vepo~charg = mspr~charg LEFT JOIN vekp ON vekp~venum = vepo~venum INTO TABLE @DATA(ltd_result_1) WHERE mspr~matnr = '000000001300000160' AND mspr~lgort = '6101' AND mspr~werks = '3100' . |
Получаем вот такую выборку:
Как видно из выборки, для строки 8 мы не нашли запись в таблице VEPO. Но так как у нас LEFT JOIN она все равно попала в выборку.
Теперь, допустим, нам необходимо немного ограничить выборку из таблицы VEPO и мы делаем INNER JOIN таблиц VEPO И VEKP. При этом, казалось бы строка 8 должна остаться в выборке т.к. соединение таблиц MSPR и VEPO осталось без изменений и в данном случае, что там у нас случилось с VEPO, вообще не должно играть роли. Однако это не так. Как мы видим в результате, запись с пустым не найденным VEPO не выбралась.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
"Запрос 2 SELECT mspr~matnr, mspr~charg, vepo~vemng, vepo~venum, vepo~altme, vepo~wdatu, vepo~vbeln FROM mspr LEFT JOIN vepo ON vepo~matnr = mspr~matnr AND vepo~werks = mspr~werks AND vepo~lgort = mspr~lgort AND vepo~charg = mspr~charg INNER JOIN vekp ON vekp~venum = vepo~venum INTO TABLE @DATA(ltd_result_2) WHERE mspr~matnr = '000000001300000160' AND mspr~lgort = '6101' AND mspr~werks = '3100' . |
AMC – ABAP Messaging Channels
ABAP Messaging Channels - метод связи между ABAP программами с помощью сообщений.
Каналы обмена сообщениями ABAP реализованы в виде объектов репозитория, к которым можно обращаться в программах отправителя и получателя с использованием интерфейса на основе классов (API). Классы и интерфейсы API используют соглашение об именах CL_AMC _... и IF_AMC _... соответственно.
Любой объект данных может быть отправлен путем сериализации в XML отправителем и десериализации получателем.
Длина сообщений, которые могут быть отправлены ограничена примерно 30000 байтами. Символьные строки преобразуются в формат UTF-8.