You are on page 1of 3

Описание проблемы:

В отчете HRULT61 Поле «Должность» не заполняется.

Анализ проблемы:
При увольнении сотрудника текущая запись в ИТ0001 копируется с даты первого дня
увольнения. При этом поле PLANS (штатная должность) устанавливается в значение
‘99999999’.
Выбор данных из ИТ0001 производиться в классе CL_HRPAYRU_PERSON, метод
READ_ORG_POS:

CALL FUNCTION 'HR_99S_DAQ_GET_INFOTYPE'


EXPORTING
im_pernr = a_pernr
im_begda = a_begda
im_endda = a_endda
im_infty = '0001'
IMPORTING
ex_tab_infty = lt_0001.
PROVIDE FIELDS orgeh persk plans otype stell bukrs werks btrtl persg
FROM lt_0001
INTO ls_0001
VALID l_fl
BOUNDS begda AND endda
BETWEEN a_begda AND a_endda .
INSERT INITIAL LINE INTO TABLE at_orgpos ASSIGNING <ls_orgpos>.
MOVE-CORRESPONDING ls_0001 TO <ls_orgpos>-orgdat.
<ls_orgpos>-orgdat-pernr = a_pernr.
<ls_orgpos>-begda = ls_0001-begda.
<ls_orgpos>-endda = ls_0001-endda.
ENDPROVIDE.
Поля - a_begda и a_endda содержат диапазон дат, введенный на селекционном экране
отчета.

Далее, в методе GET_ORGTXT происходит считывание текста штатной должности.


l oop at at_o rgpos ass ign ing <ls_o rgpos> where
begda le l _ondate
and endda ge l _ondate .
........

<ls_orgpos>-orgdat-ondat = l_ondate.
call function 'HR_RU_GET_ORGTEXTS'
exporting
pruorgdata = <ls_orgpos>-orgdat
sprsl = sy-langu
importing
pruorgtext = <ls_orgpos>-orgtxt
changing
cc_longname_o = ec_longname_o
cc_longname_c = ec_longname_c
cc_longname_s = ec_longname_s.
es_orgtxt = <ls_orgpos>-orgtxt.

........

endloop.

Поле l_ondate = a_endda.


Например, для табельного номера 24445:
Дата увольнения: 05.02.2008.
Период на селекционом экране: 01.01.2008 - 29.02.2008
ИТ0001 содержит следующие поля:

PERNR ENDDA BEGDA PLANS


24445 20080204 20080101 10007112
24445 99991231 20080205 99999999

При вызове метода CL_HRPAYRU_PERSON->READ_ORG_POS в таблицу


CL_HRPAYRU_PERSON->AT_ORGPOS попадают следующие значения:
a_begda = 20080101
a_endda = 20080229

BEGDA ENDDA ORGDAT-PLANS


1 20080101 20080204 10007112
2 20080205 20080229 99999999

Т.е. запись с пустой штатной должность, тоже используется для дальнейшей обработки.

В дальнейшем при вызове метода CL_HRPAYRU_PERSON-> GET_ORGTXT


происходит обработка таблицы AT_ORGPOS и считывание названия штатной должности.
l_ondate = 20080229

l oop at at_o rgpos ass ign ing <ls_o rgpos> where


begda le l_ondate
endda ge l_ondate.
and

Легко можно заметить, что в этом цикле выбирается только последняя запись таблицы
AT_ORGPOS с пустым кодом штатной должности.

Чтобы исправить проблему, скорректируем ИТ0001 – сдвинем последнюю запись с пусть


кодом штатной должности на 1 день в будущее.

PERNR ENDDA BEGDA PLANS


2008020 2008010
24445 5 1 10007112
9999123 2008020
24445 1 6 99999999

А период выбора данных ограничим днем увольнения:


Период на селекционом экране: 01.01.2008 - 05.02.2008

При вызове метода CL_HRPAYRU_PERSON->READ_ORG_POS в таблицу


CL_HRPAYRU_PERSON->AT_ORGPOS попадают следующие значения:
a_begda = 20080101
a_endda = 20080205

BEGDA ENDDA ORGDAT-PLANS


1 20080101 20080205 10007112

Т.е. запись с пустым кодом штатной должности отсеивается.


В этом случае отчет выводит штатную должность.