Очень часто в HR необходимо найти все пересечения ИТ т.е. те периоды в которых данные ТН остаются неизменны. Для этого существует оператор PROVIDE .
PROVIDE FIELDS {*|{comp1 comp2 ...}}
FROM itab1 INTO wa1 VALID flag1
BOUNDS intliml1 AND intlimu1
[WHERE log_exp1]
FIELDS {*|{comp1 comp2 ...}}
FROM itab2 INTO wa2 VALID flag2
BOUNDS intliml2 AND intlimu2
[WHERE log_exp2]
...
BETWEEN extliml AND extlimu
[INCLUDING GAPS].
...
ENDPROVIDE.
FROM itabN - таблицы в которых ищем пересечения
FIELDS {*|{comp1 comp2 ...}} - поля, изменения которых надо учитывать. (например, нас может интересовать только группы сотрудников в ИТ 0001, а остальные нам не важны)
VALID flagN - флаг, который принимает значения abap_true и abap_false в зависимости от того существует запись данной таблицы в данном участке или нет.
INTO wa1 - структура в которую и копируются данные в данном периоде.
BOUNDS - поля периодов в табличке itabN
BETWEEN extliml AND extlimu - подаем границы в которых мы ищем пересечения дат.
Также необходимо:
1. чтобы данные в таблицах itabN не пересекались;
2. данные в таблицах itabN должны быть отсортированы по возрастанию
Иначе дамп.
Но что же делать, если необходимо найти периоды пересечения, например в рамках одного инфо-типа. Можем использовать для получения периодов ФМ 'HR_RU_PROVIDE_PERIODS'.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
REPORT z_test_pau. TABLES pernr. INFOTYPES 0021. START-OF-SELECTION. GET pernr. DATA lt_periods TYPE hrpadru_pskey_t. DATA lt_periods_exit TYPE hrpadru_pskey_t. MOVE-CORRESPONDING p0021[] TO lt_periods. CALL FUNCTION 'HR_RU_PROVIDE_PERIODS' EXPORTING iv_begda = '18000101' iv_endda = '99991231' it_periods = lt_periods IMPORTING et_periods = lt_periods_exit. END-OF-SELECTION. |
Более подробно по F1))