среда, 26 марта 2014 г.

Выбираем значения из узла иерархии в фильтр

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.

Комментариев нет:

Отправить комментарий