Krem написал(а):
Я так понимаю сап никак это не реализовал, и если у нас межрасчет отпуска в марте, то будет считать по старому коэффициенту, так как правила расчета действуют с 02.04.2014, кто как с этим боролся у себя?
Натыкался я на эту ошибку, и разбирался с ней. Опишу разбор, сами решайте, что с ним делать.
В такой ситуации с отпуском будет заполнено поле SPPE2 с ссылкой на другой месяц - расчет марта, отпуск ссылается на апрель. RUAVE выделяет такие отсутствия и делает для них отдельный прогон расчета среднего. В журнале такой прогон обозначен фразой типа
Code:
> Расчет средней ставки на 02.04.2014 для отсутствия 0101 02.04.2014
За выполнение этого прогона отвечает процедура ruave_sppe2_calculation, которая работает в функции RUAVE.
Этот отдельный прогон выполняется с эмуляцией расчета месяца, указанного в SPPE2. В нашем случае, идет расчет марта, а прогон будет выполнятся как будто выполняется расчет апреля. Для этого происходит переопредление внутренних переменных, в частности в ruave_sppe2_calculation есть следующие строки
Code:
"start average calculation for absence on date SPPE2
aper-begda = aper-pbegd = <ls_p2001>-sppe2.
PERFORM last_day_in_month(sapfp500) USING aper-begda
aper-endda.
aper-pendd = aper-endda.
Структура aper описывает период расчета, происходит подмена периода.
Далее происходит подготовка к запуску итерации расчета среднего (функция averages_processing). Первым делом необходимо считать правила расчета среднего для нашего ВО.
Code:
IF as-parm1 EQ 'BEG'.
* read wagetype to be valuated with averages
PERFORM read_it_for_averages TABLES it
av_it
avrules
i51av_p.
CHECK NOT av_it[] IS INITIAL.
В read_it_for_averages происходит вызов ФМ HRPY_AVERA_GET_AVRULES, который вернет список правил расчета среднего для нашего ВО
Code:
FORM READ_IT_FOR_AVERAGES TABLES R_IT STRUCTURE PC207
R_AV_IT STRUCTURE PC207
R_AVRULES STRUCTURE T51AV_A
R_I51AV_P STRUCTURE T51AV_P.
CALL FUNCTION 'HRPY_AVERA_GET_AVRULES'
EXPORTING
MOLGA = CALCMOLGA
TABLES
IT = R_IT
AV_IT = R_AV_IT
I51AV_P = R_I51AV_P
AVRULES = R_AVRULES
WPBP = WPBP
EXCEPTIONS
NO_AVERAGE_CALCULATION = 1
ERROR_IN_WPBP = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. "READ_IT_FOR_AVERAGES
Считывает он эти правила с привязкой по датам из WPBP, а вот WPBP мы как раз и не подменили, там как и был, находится март. Поэтому для нашего отпуска считаются правила расчета среднего, действовавших в марте.
Если в том месте, где переопределяется aper, также переопределить и WPBP (ну и восстановить затем в исходное состояние, как и aper, то определение правил среднего происходит правильно.