Итак, есть боевая задача. Нужно сделать динамическое мероприятие для отслеживания изменения грейда сотрудника при переводе. Если грейд поменялся, то для назначения новой программы ДМС (Добровольное Медицинское Страхование) нужно создать управляющую запись в определенном инфотипе.

Грейд по стандарту хранится на уровне штатной должности/должности в инфотипе 1050 «Результаты оценки должностей». Подтип это метод оценки. Например, HAY, PWC, Watson Wyatt или внутренняя оценка компании.

Динамические мероприятия настраиваются в табличке T588Z.

Для анализа изменения грейда на штатной должности при переводе сотрудника на другую позицию мы делаем подобное динамическое мероприятие для инфотипа 0001 «Организационное присвоение»:

0001 06 700 * *—- СОЗДАЕМ ИТ0378 ДЛЯ ЛЬГОТ
0001 06 701 P T001P-MOLGA=’33’
0001 06 710 P PSPAR-MASSN=’A9′
0001 06 730 F CHECK_GRADE_CHANGE(ZHR_DYNACT)
0001 06 740 P RP50D-FLAG1=’X’
0001 06 750 I INS,0378,CHNG,,(P0001-BEGDA),(P0001-ENDDA)/D

В строчке 710 проверяем на нужный нам код мероприятия (В моем примере перевод это A9). Пишем маленькую процедуру в своей программе. У меня это процелура CHECK_GRADE_CHANGE в программе ZHR_DYNACT. Если грейд изменился, то создаем запись инфотипа 0378 с даты перевода с подтипом CHNG «Перевод». Вот и все.

Вот примерный код:

*&---------------------------------------------------------------------*
*& Form check_grade_change
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM check_grade_change.
* Проверяем, изменился ли грейд сотрудника при переводе
DATA:
lt_old_p1050 TYPE TABLE OF p1050 WITH HEADER LINE,
lt_new_p1050 TYPE TABLE OF p1050 WITH HEADER LINE,
p_old_p0001 LIKE p0001.

rp50d-flag1 = ‘ ‘. » Если Х, то грейд изменился.

CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn
EXPORTING
prelp = csave
IMPORTING
pnnnn = p_old_p0001.

CALL FUNCTION ‘RH_READ_INFTY’
EXPORTING
plvar = ’01’
otype = ‘S’
objid = p0001-plans
infty = ‘1050’
begda = p0001-begda
endda = p0001-endda
TABLES
innnn = lt_new_p1050
EXCEPTIONS
OTHERS = 6.

IF sy-subrc <> 0.
EXIT.
ENDIF.

CALL FUNCTION ‘RH_READ_INFTY’
EXPORTING
plvar = ’01’
otype = ‘S’
objid = p_old_p0001-plans
infty = ‘1050’
endda = p0001-begda» begda = p0001-endda
TABLES
innnn = lt_old_p1050
EXCEPTIONS
OTHERS = 6.

IF sy-subrc <> 0.
EXIT.
ENDIF.

IF lt_old_p1050 IS INITIAL.
EXIT.
ENDIF.

LOOP AT lt_old_p1050.
EXIT.
ENDLOOP.

LOOP AT lt_new_p1050.
EXIT.
ENDLOOP.

IF ( lt_old_p1050-evpts NE lt_new_p1050-evpts )
OR ( lt_old_p1050-evgrd NE lt_new_p1050-evgrd ).
rp50d-flag1 = ‘X’.
ENDIF.
ENDFORM. «check_grade_change