Отключение проверки полномочий в ABAP программе
Про полномочия в SAP HCM можно говорить много. Тема довольно обширная, и посвятить ей одну заметку, как мне кажется, мало. Поэтому делать этого в настоящий момент не буду.
Тема, про которую пойдет речь в данной заметке, относится к ситуациям, в которых необходимо отключить проверку полномочий (как структурных, так и обычных, также именуемыми general authorizations). Отключение полномочий в ABAP программах производится в тех ее местах, где происходит чтение данных из инфотипов (PA или OM), с последующим выводом на экран результатов выборки. Такая потребность может возникать в ситуациях, в которых у пользователя, например, отсутствуют полномочия на какой-то инфотип, или ему присвоен структурный профиль, в котором отсутствуют объекты, участвующие в выборке отчета. И, как это часто бывает, расширить полномочия ему по каким-то причинам невозможно, а отчет является очень нужным и полезным. Как же быть в такой ситуации?
Исходные данные
Рассмотрим простой пример. Есть пользователь DEMO_USER1 в роли которого присутствует объект полномочий P_ORGIN со следующим наполнением
Помимо объекта полномочий P_ORGIN с доступом к инфотипу 0001 - "Organizational Assignment" в роли присутствует объект полномочий PLOG, в котором содержится несколько инфотипов для объекта O - "Organizational Unit"
Плюс ко всему, ему присвоен структурный профиль полномочий для просмотра только объектов O - "Organizational Unit"
Мягко говоря, полномочия не очень-то уж и "обширные".
Пример программы без отключенной проверки полномочий
Пишем простенькую программу для чтения инфотипа 0002 - "Personal Data" и чтения инфотипа 1000 - "Object" для объекта S - "Position" без отключенной проверки полномочий.
REPORT zdemo_auth.
PARAMETERS: s_pernr TYPE prelp-pernr,
o_objid TYPE plog-objid.
DATA: lt_pa0002 TYPE TABLE OF p0002,
ls_pa0002 TYPE pa0002,
lt_1000 type TABLE OF p1000.
FIELD-SYMBOLS: TYPE p0002.
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = s_pernr
infty = '0002'
begda = '19000101' "sy-datum
endda = '99991231' "sy-datum
TABLES
infty_tab = lt_pa0002
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
clear lt_1000[].
CALL FUNCTION 'RH_READ_INFTY_1000'
EXPORTING
* AUTHORITY = 'DISP'
* WITH_STRU_AUTH = 'X'
PLVAR = '01'
OTYPE = 'S'
OBJID = o_objid
* ISTAT = ' '
* EXTEND = 'X'
* BEGDA = '19000101'
* ENDDA = '99991231'
* CONDITION = '00000'
* SORT = 'X'
TABLES
i1000 = lt_1000
* OBJECTS =
EXCEPTIONS
NOTHING_FOUND = 1
WRONG_CONDITION = 2
WRONG_PARAMETERS = 3
OTHERS = 4
.
IF sy-subrc EQ 0.
READ TABLE lt_pa0002 ASSIGNING WITH KEY pernr = s_pernr.
IF IS ASSIGNED.
WRITE / -pernr .
WRITE / -vorna.
WRITE / -nachn.
ELSE.
WRITE / '2nd select'.
WRITE 'nothing to select!'.
ENDIF.
ENDIF.
WRITE 'nothing to select!'.
Запускаем
При таких исходных данных, таблицы lt_pa0002 и lt_1000 оказались пустыми, что, в общем, логично, исходя из тех полномочий, которые есть у пользователя.
Пример программы с отключенной проверкой полномочий
Теперь пишем программу, в которой проверка полномочий будет отключена. Для этих целей, в самом начале программы необходимо вызвать два функциональных модуля:
REPORT zdemo_auth.
PARAMETERS: s_pernr TYPE prelp-pernr,
o_objid TYPE plog-objid.
DATA: lt_pa0002 TYPE TABLE OF p0002,
ls_pa0002 TYPE pa0002,
lt_1000 TYPE TABLE OF p1000.
FIELD-SYMBOLS: TYPE p0002.
CALL FUNCTION 'RH_AUTHORITY_CHECK_OFF'.
CALL FUNCTION 'HR_READ_INFOTYPE_AUTHC_DISABLE'.
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = s_pernr
infty = '0002'
begda = '19000101' "sy-datum
endda = '99991231' "sy-datum
TABLES
infty_tab = lt_pa0002
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
CLEAR lt_1000[].
CALL FUNCTION 'RH_READ_INFTY_1000'
EXPORTING
* AUTHORITY = 'DISP'
* WITH_STRU_AUTH = 'X'
plvar = '01'
otype = 'S'
objid = o_objid
* ISTAT = ' '
* EXTEND = 'X'
* BEGDA = '19000101'
* ENDDA = '99991231'
* CONDITION = '00000'
* SORT = 'X'
TABLES
i1000 = lt_1000
* OBJECTS =
EXCEPTIONS
nothing_found = 1
wrong_condition = 2
wrong_parameters = 3
OTHERS = 4.
IF sy-subrc EQ 0.
READ TABLE lt_pa0002 ASSIGNING WITH KEY pernr = s_pernr.
IF IS ASSIGNED.
WRITE / -pernr .
WRITE / -vorna.
WRITE / -nachn.
ELSE.
WRITE / '2nd select '.
WRITE 'nothing to select!'.
ENDIF.
ENDIF.
CALL FUNCTION 'RH_AUTHORITY_CHECK_ON'.
N.B. После того, как вы отключили проверку структурных полномочий и получили в ходе выполнения программы необходимые данные, проверку следует включить. Для этого необходимо вызвать ФМ RH_AUTHORITY_CHECK_ON. Для чтения же инфотипов проверку включать не нужно, так как она отключается непосредственно перед самим чтением, и затем будет автоматически активирована.
Тестируем
Как видите, таблицы lt_pa0002 и lt_1000 были заполнены каким-то значениями. Хотя эти же таблицы были пустыми в первой "редакции" программы.
Чтобы убедиться, что проверка полномочий на чтение инфотипов автоматически активируется, запустим следующий вариант программы
REPORT zdemo_auth.
PARAMETERS: s_pernr TYPE prelp-pernr,
o_objid TYPE plog-objid.
DATA: lt_pa0002 TYPE TABLE OF p0002,
ls_pa0002 TYPE pa0002,
lt_1000 TYPE TABLE OF p1000.
FIELD-SYMBOLS: TYPE p0002.
CALL FUNCTION 'RH_AUTHORITY_CHECK_OFF'.
CALL FUNCTION 'HR_READ_INFOTYPE_AUTHC_DISABLE'.
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = s_pernr
infty = '0002'
begda = '19000101' "sy-datum
endda = '99991231' "sy-datum
TABLES
infty_tab = lt_pa0002
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
CLEAR lt_1000[].
CALL FUNCTION 'RH_READ_INFTY_1000'
EXPORTING
* AUTHORITY = 'DISP'
* WITH_STRU_AUTH = 'X'
plvar = '01'
otype = 'S'
objid = o_objid
* ISTAT = ' '
* EXTEND = 'X'
* BEGDA = '19000101'
* ENDDA = '99991231'
* CONDITION = '00000'
* SORT = 'X'
TABLES
i1000 = lt_1000
* OBJECTS =
EXCEPTIONS
nothing_found = 1
wrong_condition = 2
wrong_parameters = 3
OTHERS = 4.
IF sy-subrc EQ 0.
READ TABLE lt_pa0002 ASSIGNING WITH KEY pernr = s_pernr.
IF IS ASSIGNED.
* WRITE / -pernr .
* WRITE / -vorna.
* WRITE / -nachn.
ELSE.
WRITE / '2nd select'.
WRITE 'nothing to select!'.
ENDIF.
ENDIF.
CALL FUNCTION 'RH_AUTHORITY_CHECK_ON'.
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = s_pernr
infty = '0002'
begda = '19000101' "sy-datum
endda = '99991231' "sy-datum
TABLES
infty_tab = lt_pa0002
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
IF lt_pa0002 is INITIAL.
write 'nothing found!'.
ENDIF.
Обратите внимание на таблицу lt_pa0002, которая заполняется в самом начале выполнения программы, когда проверка полномочий отключена. При этом повторный вызов ФМ HR_READ_INFOTYPE возвращает таблицу lt_pa0002 пустой.
Тестируем
P.S. За качество кода, прошу не винить. Я не со зла.