Оперативный запрос. Пользовательские поля
Продолжаем раскрывать тему оперативных запросов. Во второй заметке, относящейся к этой животрепещущей теме, поговорим про добавление пользовательских полей в уже настроенный запрос. Устраиваемся поудобнее: Оперативный запрос. Пользовательские поля
0. Intro
В первой заметке, посвященной оперативным запросам, я вкратце описал в каких ситуациях уместно их применение, а также рассмотрел основные моменты, связанные с их созданием и настройкой.
См. заметку Оперативный запрос
В данной заметке я планирую рассмотреть одну полезную, если можно так сказать, опцию _расширения _уже настроенного оперативного запроса. Расширение это заключается в добавлении дополнительного поля. Кроме того, для этого поля возможно «навесить» какую-то логику, используя знакомый всем ABAP. Но об этом я расскажу чуть дальше.
Задача: добавить в уже созданный оперативный запрос, работающий с основными данными по персоналу, поле с наименованием Absence Status, в которое требуется выводить информацию либо по фактическому отсутствию работника, либо по запланированному. Например, если у сотрудника в инфо-типе **2001 **заведено отсутствие, пересекающее текущую дату (sy-datum), необходимо вывести текст вида «Absent from XX.XX.XXXX till XX.XX.XXX», если же в инфо-типе 2001 заведено отсутствие позже текущей даты (sy-datum), необходимо вывести текст вида «Will be Absent from XX.XX.XXXX till XX.XX.XXX». Иначе — ничего не выводить. Ну и конечно же отсутствие не должно быть заблокированным.
1. Исходные данные
Расширять дополнительным полем я буду оперативный запрос, который создан ранее. Напомню, что в запросе выводится основная информация по сотрудникам из выбранной пользователем организационной единицы
Запрос построен на инфо-наборе ZDEMO_INFOSET, в котором используется три инфо-типа:
- 0000 - Actions
- 0001 - Organizational Assignment
- 0002 - Personal Data
Как раз инфо-набор ZDEMO_INFOSET я и буду изменять.
2. Добавление дополнительного поля в инфо-набор
Последовательность добавления дополнительных полей в оперативные запросы следующая:
- Создание/определение дополнительного поля на уровне инфо-набора
- Определение логики для дополнительного поля (то есть создание ABAP-кода для нового поля)
- «Активация» дополнительного поля для последующей возможности его выбора в оперативных запросах
- Генерация инфо-набора
- «Активация» дополнительного поля в оперативном запросе
Создайте поле Absence Status на уровне инфо-набора. Для этого измените существующий инфо-набор с помощью транзакции SQ02
В группе полей Organizational Assignment P0001 кликните правой кнопкой мыши по Additional Fields и выберите Create
Введите техническое наименование нового поля. Я буду использовать наименование Z_ABSENCE. Также активируйте радиокнопку Additional field
Введите дополнительную информацию по создаваемому полю
Сохраните внесенные изменения.
3. Определение логики для дополнительного поля
Раскройте узел Additional fields
Обратите внимание на новое поле, которое было только что добавлено. Кликните по нему правой кнопкой и выберите в меню опцию Field Code
Далее все просто. Перед вами открылся ABAP редактор, в котором необходимо прописать логику, согласно условиям задачи, поставленной перед вами. В моем случае — это задача, описанная в разделе 0. Intro
Ниже приведен код, который, можно сказать, решает выше поставленную задачу. Учитывая, что я не программист, советую вам покрепче пристегнуть свои глазки
DATA lt_result LIKE pa2001.
clear z_absence.
SELECT * FROM pa2001 INTO lt_result
WHERE pernr = p0001-pernr AND sprps <> 'X'
AND endda >= sy-datum.
EXIT.
ENDSELECT.
case lt_result-subty.
when '0100' or '0150'.
IF lt_result-begda > sy-datum.
CONCATENATE 'Will be Absent from&' lt_result-begda+6(2)'.'
lt_result-begda+4(2)'.'lt_result-begda(4)
'&till&' lt_result-endda+6(2) '.'lt_result-endda+4(2)
'.'lt_result-endda(4) INTO z_absence.
TRANSLATE z_absence USING '&'.
ELSE.
CONCATENATE 'Absent from&' lt_result-begda+6(2)'.'
lt_result-begda+4(2)'.'lt_result-begda(4)
'&t&' lt_result-endda+6(2) '.'lt_result-endda+4(2)
'.'lt_result-endda(4) INTO z_absence.
TRANSLATE z_absence USING '&'.
ENDIF.
ENDCASE.
IF z_absence IS INITIAL.
z_absence = ''.
ENDIF.
Обратите внимание на то, что я ищу только два типа отсутствия у работников. А именно: 0100 и 0150. Сгенерируйте инфо-набор нажатием на кнопку
4. Активация дополнительного поля для возможности его выбора в оперативных запросах
Находясь на том же экране нажмите на кнопку
Для этого, выделите новое дополнительное поле из узла Additional Fields и перетащите его на узел Organizational Assignment
Сгенерируйте инфо-набор еще раз.
5. Активация дополнительного поля в оперативном запросе
С помощью транзакции SQ01 выберите запрос, который создан на базе измененного инфо-набора, и нажмите на кнопку
В соответствующей группе полей активируйте свойство Output для созданного дополнительного поля
Запустите отчет
Ниже скриншоты инфо-типа 2001 двух сотрудников, по которым было заполнено нового поле:
Относительно даты запуска отчета (sy-datum = 26.10.2016), у одного из них есть отсутствие вида 0100, пересекающее текущую дату, что подходит под условие задачи, поставленной выше, у второго — отсутствие вида 0150, заведенное позже даты формирования отчета, что также удовлетворяет поставленное условие. У остальных сотрудников в инфо-типе 2001 никаких записей нет, поэтому значения в новом поле для них пустое. Поставленная выше задача успешно решена.
Теперь вы знаете, как можно сделать свои оперативные отчеты еще более гибкими и настраиваемыми. Увлекаться этим, наверное, не стоит, но при определенных обстоятельствах описанная опция расширения оперативных отчетов может быть весьма полезной.