function znf_get_obj_from_hier .
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(L_NODENAME) TYPE RSSHNODENAME
*" REFERENCE(L_HIENM) TYPE RSHIENM
*" EXPORTING
*" REFERENCE(E_T_RSNODES) TYPE RSHI_T_HIENODE
*"----------------------------------------------------------------------
*"----------------------------------------------------------------------
*" Note:
*" В главное программе группы функций не забыть объявить:
*" type-pools: rshi, rsd, rsdm, rssm.
*"----------------------------------------------------------------------
*-----------------------------------------------------------------------
data:
l_t_rsnodes type rshi_t_hienode,
wa_rsnodes like line of l_t_rsnodes,
wa_rshiedirkey type rshi_s_rshiedirkey,
l_t_rshiedir type rssh_t_hiedir,
wa_rshiedir like line of l_t_rshiedir,
l_nodeid type rshienodid,
l_tlevel type rstlevel.
data:
lr_parentid type range of rsparent,
wa_parentid like line of lr_parentid,
lr_nodeid type range of rshienodid,
wa_nodeid like line of lr_nodeid.
*-----------------------------------------------------------------------
* Получаем табличку с нашей иерархией
select single *
from rshiedir
into wa_rshiedir
where hienm = l_hienm
and objvers = 'A'.
if sy-subrc = 0.
wa_rshiedirkey-hieid = wa_rshiedir-hieid.
wa_rshiedirkey-objvers = 'A'.
endif.
call function 'RSSH_HIERARCHY_READ'
exporting
i_rshiedirkey = wa_rshiedirkey
importing
e_t_rsnodes = l_t_rsnodes
exceptions
invalid_hierarchy = 1
name_error = 2
iobj_not_found = 3
others = 4.
if sy-subrc = 0.
* Получаем строку корневой ноды
loop at l_t_rsnodes into wa_rsnodes
where nodename = l_nodename
and link is initial. " Чтобы не попасть на ссылочный узел.
" Да, знаю, однозначность, как по NODEID, мы не получим,
" но пользователи обещали все узловые ноды называть уникально.
l_nodeid = wa_rsnodes-nodeid.
l_tlevel = wa_rsnodes-tlevel.
endloop.
* Удаляем лишние ноды, которые находятся сверху.
delete l_t_rsnodes where tlevel lt l_tlevel.
wa_nodeid-sign = 'I'.
wa_nodeid-option = 'EQ'.
wa_nodeid-low = l_nodeid.
append wa_nodeid to lr_nodeid.
*-----------------------------------------------------------------------
* Запускаем цикл, чтобы пройти все подчиненные ноды
while lr_nodeid is not initial.
loop at l_t_rsnodes into wa_rsnodes
where parentid in lr_nodeid.
* Отбираем нужные записи
append wa_rsnodes to e_t_rsnodes.
* Собираем подчиненные ноды
wa_parentid-sign = 'I'.
wa_parentid-option = 'EQ'.
wa_parentid-low = wa_rsnodes-nodeid.
append wa_parentid to lr_parentid.
endloop.
* Удаляем ноды, по которым уже собраны подчиненные объекты
clear lr_nodeid.
move lr_parentid to lr_nodeid.
clear lr_parentid.
endwhile.
*-----------------------------------------------------------------------
* Удаляем подчинённые ноды-узлы
delete e_t_rsnodes where iobjnm eq '0HIER_NODE'.
endif.
*-----------------------------------------------------------------------
endfunction.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(L_NODENAME) TYPE RSSHNODENAME
*" REFERENCE(L_HIENM) TYPE RSHIENM
*" EXPORTING
*" REFERENCE(E_T_RSNODES) TYPE RSHI_T_HIENODE
*"----------------------------------------------------------------------
*"----------------------------------------------------------------------
*" Note:
*" В главное программе группы функций не забыть объявить:
*" type-pools: rshi, rsd, rsdm, rssm.
*"----------------------------------------------------------------------
*-----------------------------------------------------------------------
data:
l_t_rsnodes type rshi_t_hienode,
wa_rsnodes like line of l_t_rsnodes,
wa_rshiedirkey type rshi_s_rshiedirkey,
l_t_rshiedir type rssh_t_hiedir,
wa_rshiedir like line of l_t_rshiedir,
l_nodeid type rshienodid,
l_tlevel type rstlevel.
data:
lr_parentid type range of rsparent,
wa_parentid like line of lr_parentid,
lr_nodeid type range of rshienodid,
wa_nodeid like line of lr_nodeid.
*-----------------------------------------------------------------------
* Получаем табличку с нашей иерархией
select single *
from rshiedir
into wa_rshiedir
where hienm = l_hienm
and objvers = 'A'.
if sy-subrc = 0.
wa_rshiedirkey-hieid = wa_rshiedir-hieid.
wa_rshiedirkey-objvers = 'A'.
endif.
call function 'RSSH_HIERARCHY_READ'
exporting
i_rshiedirkey = wa_rshiedirkey
importing
e_t_rsnodes = l_t_rsnodes
exceptions
invalid_hierarchy = 1
name_error = 2
iobj_not_found = 3
others = 4.
if sy-subrc = 0.
* Получаем строку корневой ноды
loop at l_t_rsnodes into wa_rsnodes
where nodename = l_nodename
and link is initial. " Чтобы не попасть на ссылочный узел.
" Да, знаю, однозначность, как по NODEID, мы не получим,
" но пользователи обещали все узловые ноды называть уникально.
l_nodeid = wa_rsnodes-nodeid.
l_tlevel = wa_rsnodes-tlevel.
endloop.
* Удаляем лишние ноды, которые находятся сверху.
delete l_t_rsnodes where tlevel lt l_tlevel.
wa_nodeid-sign = 'I'.
wa_nodeid-option = 'EQ'.
wa_nodeid-low = l_nodeid.
append wa_nodeid to lr_nodeid.
*-----------------------------------------------------------------------
* Запускаем цикл, чтобы пройти все подчиненные ноды
while lr_nodeid is not initial.
loop at l_t_rsnodes into wa_rsnodes
where parentid in lr_nodeid.
* Отбираем нужные записи
append wa_rsnodes to e_t_rsnodes.
* Собираем подчиненные ноды
wa_parentid-sign = 'I'.
wa_parentid-option = 'EQ'.
wa_parentid-low = wa_rsnodes-nodeid.
append wa_parentid to lr_parentid.
endloop.
* Удаляем ноды, по которым уже собраны подчиненные объекты
clear lr_nodeid.
move lr_parentid to lr_nodeid.
clear lr_parentid.
endwhile.
*-----------------------------------------------------------------------
* Удаляем подчинённые ноды-узлы
delete e_t_rsnodes where iobjnm eq '0HIER_NODE'.
endif.
*-----------------------------------------------------------------------
endfunction.
Комментариев нет:
Отправить комментарий