Нет, конечно ))
ну там не фм, а просто кусок кода, который я дописала в уже существующую прогу
есть список сотрудников, для которых надо выяснить начальников - teilnehmer
DATA: BEGIN OF teilnehmer OCCURS 0,
objid TYPE hrp1001-objid,
BEGDA TYPE hrp1001-BEGDA,
ENDDA TYPE hrp1001-ENDDA,
END OF teilnehmer.
там свои типы - но важен фактически только objid или pernr
DATA: l_teaml LIKE zla1_teamleiter_ma,
l_teaml_tab LIKE zla1_teamleiter_ma OCCURS 1 WITH HEADER LINE.
DATA: ls_leading_pos LIKE TABLE OF ls_trainer2,
wa_ls_leading_pos LIKE ls_trainer2,
ls_leading_org LIKE TABLE OF ls_trainer2,
wa_ls_leading_org LIKE ls_trainer2,
wa_ls_leading_org_temp type HROBJID,
ls_leading_org_high LIKE TABLE OF ls_trainer2,
wa_ls_leading_org_high LIKE ls_trainer2.
DATA: tmp_org_leader_tab LIKE OBJEC OCCURS 0 WITH HEADER LINE.
DATA: wa_tmp_org_leader_tab LIKE OBJEC.
*-------------------------------------------------
* Vorgesetzter
CLEAR: l_teaml_tab, l_teaml_tab[].
LOOP AT teilnehmer.
*читаем должности штатные
SELECT sclas sobid FROM hrp1001 INTO TABLE ls_leading_pos
WHERE otype = 'P'
AND objid = teilnehmer-objid
AND SCLAS = 'S'
AND plvar = pchplvar
AND rsign = 'B'
AND relat = '008'
AND begda <= alv_itab-begda
AND endda >= alv_itab-endda.
READ TABLE ls_leading_pos INDEX 1 INTO wa_ls_leading_pos.
*читаем ОргЕд для этой должности
SELECT sclas sobid FROM hrp1001 INTO TABLE ls_leading_org
WHERE otype = 'S'
AND objid = wa_ls_leading_pos-sobid
AND SCLAS = 'O'
AND plvar = pchplvar
AND rsign = 'A'
AND relat = '003'
AND begda <= alv_itab-begda
AND endda >= alv_itab-endda.
READ TABLE ls_leading_org INDEX 1 INTO wa_ls_leading_org.
Move wa_ls_leading_org-sobid to wa_ls_leading_org_temp.
*читаем нача для орг ед
CALL FUNCTION 'HRCM_ORGUNIT_MANAGER_GET'
EXPORTING
PLVAR = pchplvar
OTYPE = 'O'
OBJID = wa_ls_leading_org_temp
BEGDA = alv_itab-begda
ENDDA = alv_itab-endda
* PATH_ID = ' '
TABLES
manager_info_table = tmp_org_leader_tab
EXCEPTIONS
PATH_ERROR = 1
ROOT_ERROR = 2
NOTHING_FOUND = 3
OTHERS = 4
.
IF sy-subrc <> 0.
* если не нашел, поднимаемся вверх по дереву в цикле
PERFORM oben_baum USING wa_ls_leading_org-sobid
CHANGING l_teaml-PERNR.
ELSE.
* передаем значение
READ TABLE tmp_org_leader_tab INDEX 1 INTO wa_tmp_org_leader_tab.
move wa_tmp_org_leader_tab-OBJID to l_teaml-PERNR.
ENDIF.
* это если начальника нет, то убираем
if l_teaml-PERNR <> '00000000'.
Append l_teaml to l_teaml_tab.
endif.
endloop.
clear: teilnehmer, teilnehmer[].
LOOP AT l_teaml_tab.
MOVE l_teaml_tab-pernr TO teilnehmer-objid.
APPEND teilnehmer.
endloop.
* убираем лишних, если у подчиненных одинаковые начи
Sort teilnehmer.
DELETE ADJACENT DUPLICATES FROM teilnehmer.
**----------------------------------
FORM oben_baum USING sobid like hrp1001-sobid
CHANGING pernr type P_PERNR.
* go high
SELECT sclas sobid FROM hrp1001 INTO TABLE ls_leading_org_high
WHERE otype = 'O'
AND objid = sobid
AND SCLAS = 'O'
AND plvar = pchplvar
AND rsign = 'A'
AND relat = '002'
AND begda <= alv_itab-begda
AND endda >= alv_itab-endda.
IF sy-subrc <> 0.
* return '00000000'
pernr = '00000000'.
else.
READ TABLE ls_leading_org_high INDEX 1 INTO wa_ls_leading_org_high.
Move wa_ls_leading_org_high-sobid to wa_ls_leading_org_temp.
CALL FUNCTION 'HRCM_ORGUNIT_MANAGER_GET'
EXPORTING
PLVAR = pchplvar
OTYPE = 'O'
OBJID = wa_ls_leading_org_temp
BEGDA = alv_itab-begda
ENDDA = alv_itab-endda
* PATH_ID = ' '
TABLES
manager_info_table = tmp_org_leader_tab
EXCEPTIONS
PATH_ERROR = 1
ROOT_ERROR = 2
NOTHING_FOUND = 3
OTHERS = 4
.
IF sy-subrc <> 0.
PERFORM oben_baum USING wa_ls_leading_org_high-sobid
CHANGING pernr.
ELSE.
* return true value
READ TABLE tmp_org_leader_tab INDEX 1 INTO wa_tmp_org_leader_tab.
move wa_tmp_org_leader_tab-OBJID to pernr.
endif.
endif.
ENDFORM.
ну вот, не ругайте сильно
