Macros написал:
hilena написала:
У кого-нибудь считается правильно /890 в таком случае?
Судя по всему причина в особенностях заполнения таблицы ab.
Например у нас в системе в случае регистрации БЛ 20.11.2012-03.12.2012 в декабре имеем следующие записи в ab:
01 0600 20.11.2012 30.11.2012, сплит apznr 01, 0 дней, т.к. запись относится к прошлому периоду
02 0600 01.12.2012 03.12.2012, сплит apznr 01, 3 дня
в form ABS_DAYS_RESULTS
Цикл по ab
проверка на наличии /890 с тем же сплитом apznr в rt.
Если такой записи в rt нет тогда подсчитываем дни иначе не считаем.
Это условие и дает на данном примере ошибку, т.к. на первой записи ab добавляется нулевая запись в RT удовлетворяющая условиям (т.к. у обоих записей apznr 01 ).
Осталось выяснить такое заполнение AB это стандартное поведение системы или особенности местного Z*.
Дополнение: скорее всего это стандартное заполнение AB, т.е. если я прав, то ошибку должны повторить многие установившие ноту.
Code:
*&---------------------------------------------------------------------*
*& Form ABS_DAYS_RESULTS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_APER text
* <--P_RESULTS[] text
*----------------------------------------------------------------------*
form ABS_DAYS_RESULTS using iv_molga
iv_datum
changing cs_results TYPE LINE OF HRPAY99_TAB_OF_RESULTS.
DATA: lt_t7ru554c TYPE TABLE OF t7ru554c.
FIELD-SYMBOLS: <ls_ab> type PC20I,
<ls_rt> type PC207,
<ls_t7ru554c> TYPE t7ru554c.
perform re7ru554c tables lt_t7ru554c using iv_molga '01' iv_datum .
loop at cs_results-inter-ab ASSIGNING <ls_ab>.
LOOP AT lt_t7ru554c ASSIGNING <ls_t7ru554c> WHERE awart = <ls_ab>-awart.
READ TABLE cs_results-inter-rt ASSIGNING <ls_rt> with key lgart = <ls_t7ru554c>-lgart apznr = <ls_ab>-apznr.
if sy-subrc <> 0.
append initial line to cs_results-inter-rt assigning <ls_rt>.
<ls_rt>-abart = <ls_ab>-abart.
<ls_rt>-lgart = <ls_t7ru554c>-lgart.
<ls_rt>-apznr = <ls_ab>-apznr.
<ls_rt>-abznr = <ls_ab>-abznr.
<ls_rt>-anzhl = <ls_ab>-kaltg.
endif.
ENDLOOP.
endloop.
endform. " ABS_DAYS_RESULTS
Для тех кто испытывает проблемы с генераций ВО /890. Проявляется это в том, что /890 появляется не по всем отсутствиям в месяце (если их несколько). Проблема, на мой взгляд в том, что генерация происходит на основе таблицы AB, а проверка для избежания повторной вставки в процедуре ABS_DAYS_RESULTS выполняется по сплиту APZNR, то есть по WPBP
READ TABLE cs_results-inter-rt ASSIGNING <ls_rt> with key lgart = <ls_t7ru554c>-lgart
apznr = <ls_ab>-apznr.
В настоящий момент схема RUS0 устроена так, что для каждого нового сплита AB создается отдельный сплит WPBP. Поэтому проблем в этом коде не возникает. А вот старая схема RU00 работала не так. Там новый сплит по WPBP возникал только по изменению основных данных, отсутствия WPBP не сплитовали.
Например, в месяце расчет по ТН ничего не происходит, но есть два отсутствия. В старой схеме в WPBP только одна запись, и ВО по отсутствию имеют одинаковый сплит по WPBP и разные сплиты по AB. В новой схеме каждый ВО по отсутствию будет иметь свой сплит по WPBP и по AB.
Код ABS_DAYS_RESULTS со старыми расчетами не работает. У нас, например, сейчас работает новая схема, но в прошлом есть года, расчет по которым выполнен старой схемой. И до этих годов можно «дотянуться» заменой годов.
В новой схеме, если вдруг нарушен принцип “новый сплит AB -> новый сплит WPBP”, код ABS_DAYS_RESULTS тоже не работает.
Исправление достаточно простое. Нужно приведенную выше строчку заменить на
READ TABLE cs_results-inter-rt ASSIGNING <ls_rt> with key lgart = <ls_t7ru554c>-lgart a
bznr = <ls_ab>-a
bznr .
После такого исправления код будет работать как для старой, так и для новой схем.
Еще нужно изменить настройку в таблице V_T51AV_B для правил кумуляций IP** и ВО /890 заменить значение в последнем поле «РсчЗП/НплП» («Factoring») c «S» на «N».
Значение «S» воспринимает только одно (первое) значение ВО для сплита APZNR. Другие значения будут отброшены. Значение «N» решает эту проблему.