Текущее время: Пн, июл 21 2025, 03:52

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Дерево из объекта словаря данных?
СообщениеДобавлено: Пн, июн 24 2013, 12:28 
Ассистент
Ассистент

Зарегистрирован:
Вт, авг 03 2010, 11:03
Сообщения: 35
Всем привет!
Подкинули забавную задачку, за которую не знаю, с какого конца взяться.. Подсобите советом?
Существует АВАР-структура навроде описания средства поиска (SHLP_DESCR).
Т.е. внутри структуры:
лежат вперемешку: поля, вложенные структуры, вложенные таблицы;
+ внутри каждой таблицы или структуры лежат вперемешку: поля, вложенные структуры, вложенные таблицы;
++ внутри каждой таблицы или структуры лежат вперемешку: поля, вложенные структуры, вложенные таблицы;
+++ внутри каждой таблицы или структуры лежат вперемешку: поля, вложенные структуры, вложенные таблицы;
++++ внутри каждой таблицы или структуры ну и т.д. :)
В общем случае это можно представить в виде классического дерева или в виде XML.
В конце концов на "листиках" этого "дерева" лежит некое строковое поле, которое нужно заполнить по какому-либо алгоритму.
Сама по себе эта структура является интерфейсом передачи данных между двумя системами, т.е. система "B" готова принять данные из системы "А" вот в таком формате.
А теперь самое прикольное - эта структура есть универсальный инструмент на все случаи жизни и для разных типов документов могут по-разному заполнятся разные наборы полей на разных уровнях.
Пользователю необходимо предоставить интерфейс ведения всего этого безобразия:
Т.е. ему нужно для каждого типа документа поразворачивать нужные ветки этого дерева и вписать туда, к примеру, ФМ, который будет заполнять выбранное значение.
Что-то подобное, но значительно сложней, уже реализовано SAPом в инструментарии DMEE, но они закрыли, блин, возможность, добавлять в него свои типы деревьев! :evil:
Писать свой DMEE кагбы не комильфо, ломать имеющийся - тоже не похвалят...
Вопрос: м.б. существует какой-то альтернативный способ заюзать для этой задачи стандарт?
Или хотя бы какой-нибудь инструмент построения дерева из словарской структуры?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дерево из объекта словаря данных?
СообщениеДобавлено: Вт, июн 25 2013, 04:35 
Специалист
Специалист

Зарегистрирован:
Чт, дек 02 2010, 08:37
Сообщения: 156
Сейчас уже не помню точно, но, по-моему, можно добавить свой тип дерева в ракурс V_DMEE_TREE_TYPE.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дерево из объекта словаря данных?
СообщениеДобавлено: Вт, июн 25 2013, 12:16 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Я когда-то выводил дерево структуры следующим образом:
Code:
REPORT  ztest1.

*----------------------------------------------------------------------*
*       CLASS lcl_ctxtdescr DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_ctxtdescr DEFINITION.

  PUBLIC SECTION.
    TYPE-POOLS:
      abap,
      icon.
    TYPES:
      ty_s_hierarchy      TYPE snodetext,
      ty_t_hierarchy      TYPE STANDARD TABLE OF ty_s_hierarchy .
    TYPES:
      ty_comp_type        TYPE char1,
      ty_comp_name        TYPE massd_component,
      ty_comp_path        TYPE c LENGTH 10000.
    TYPES:
      BEGIN OF ty_s_properties ,
        id                TYPE ty_s_hierarchy-id,
        comp_type         TYPE ty_comp_type,
        comp_name         TYPE ty_comp_name,
        comp_fullpath     TYPE ty_comp_path,
        type_absname      TYPE abap_abstypename,
        type_kind         TYPE abap_typekind,
        type_length       TYPE i,
        type_decimals     TYPE i,
      END   OF ty_s_properties ,
      ty_t_properties     TYPE STANDARD TABLE OF ty_s_properties .
    DATA:
      t_properties        TYPE ty_t_properties READ-ONLY,
      t_hierarchy         TYPE ty_t_hierarchy READ-ONLY,
      v_root_id           TYPE snode-id READ-ONLY.
    CONSTANTS:
      BEGIN OF c_comp_type,
        root              TYPE ty_comp_type VALUE 'R',
        table             TYPE ty_comp_type VALUE 'T',
        struct            TYPE ty_comp_type VALUE 'S',
        element           TYPE ty_comp_type VALUE 'E',
      END   OF c_comp_type.
    CONSTANTS:
      BEGIN OF c_comp_icon,
        root              TYPE icon_d VALUE icon_tree,
        table             TYPE icon_d VALUE icon_list,
        struct            TYPE icon_d VALUE icon_structure,
        element           TYPE icon_d VALUE icon_field_with_text,
      END   OF c_comp_icon.
    METHODS:
      constructor
          IMPORTING iv_absname          TYPE any.

  PRIVATE SECTION.
    METHODS:
      node_add
          IMPORTING iv_parent_id        TYPE snode-id
          CHANGING  cs_properties       TYPE ty_s_properties,
      nodes_recurs
          IMPORTING iv_parent_id        TYPE snode-id
                    iv_parent_fullpath  TYPE any
                    iv_comp_refer       TYPE any
                    iv_comp_name        TYPE any
          RETURNING value(rv_childern_found) TYPE flag.

ENDCLASS.                    "lcl_ctxtdescr DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_ctxtdescr IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_ctxtdescr IMPLEMENTATION.
  METHOD constructor.
    DATA ls_attr  TYPE streeattr.

    cl_abap_datadescr=>describe_by_name(
            EXPORTING  p_name   = iv_absname
            EXCEPTIONS OTHERS   = 4 ).
    IF sy-subrc NE 0.
      MESSAGE e000(lp)
      WITH 'Укажите действительный тип'.
    ENDIF.

    ls_attr-nodeicon    = c_comp_icon-root.
    ls_attr-kind        = 'I'.
    ls_attr-tlength1    = 30.
    ls_attr-text1       = 'Component'.
    ls_attr-tlength2    = 10.
    ls_attr-text2       = 'Type'.
    ls_attr-tlength3    = 10.
    ls_attr-text3       = 'Length'.    CONDENSE ls_attr-text3.
    ls_attr-tlength4    = 10.
    ls_attr-text4       = 'Decimals'.  CONDENSE ls_attr-text4.
    ls_attr-tlength5    = 20.
    ls_attr-text5       = 'Absolute_name'.

    CALL FUNCTION 'RS_TREE_CREATE'
      EXPORTING
        root_name          = 'CONTEXT'
        display_attributes = ls_attr
      IMPORTING
        root_id            = v_root_id.

    nodes_recurs( iv_parent_id        = v_root_id
                  iv_parent_fullpath  = space
                  iv_comp_refer       = iv_absname
                  iv_comp_name        = iv_absname ).

    CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'
      TABLES
        nodeinfo = t_hierarchy.

  ENDMETHOD.                    "constructor
  METHOD nodes_recurs.

    DATA:
      li_tabledescr       TYPE REF TO cl_abap_tabledescr,
      li_structdescr      TYPE REF TO cl_abap_structdescr,
      li_elemdescr        TYPE REF TO cl_abap_elemdescr,
      li_typedescr        TYPE REF TO cl_abap_typedescr,
      lt_components       TYPE abap_compdescr_tab,
      lv_comp_refer       TYPE string,
      ls_properties       TYPE ty_s_properties.
    FIELD-SYMBOLS:
      <components>        TYPE abap_compdescr.

*======================================================================
*   add current node
*======================================================================
*   describe
    CALL METHOD cl_abap_datadescr=>describe_by_name
      EXPORTING
        p_name         = iv_comp_refer
      RECEIVING
        p_descr_ref    = li_typedescr
      EXCEPTIONS
        type_not_found = 4.
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.

    CASE li_typedescr->type_kind.
      WHEN cl_abap_datadescr=>typekind_struct1
        OR cl_abap_datadescr=>typekind_struct2.

        li_structdescr ?=  li_typedescr.
        ls_properties-comp_type     = c_comp_type-struct.
        ls_properties-type_absname  = li_structdescr->absolute_name   .
        ls_properties-type_kind     = li_structdescr->type_kind    .
        ls_properties-type_length   = li_structdescr->length  .
        ls_properties-type_decimals = li_structdescr->decimals.
        lt_components[]             = li_structdescr->components[] .

      WHEN cl_abap_datadescr=>typekind_table .
        li_tabledescr  ?=  li_typedescr.
        li_structdescr ?=  li_tabledescr->get_table_line_type( ).
        ls_properties-comp_type     = c_comp_type-table.
        ls_properties-type_absname  = li_tabledescr->absolute_name   .
        ls_properties-type_kind     = li_tabledescr->type_kind    .
        ls_properties-type_length   = li_tabledescr->length  .
        ls_properties-type_decimals = li_tabledescr->decimals.

      WHEN OTHERS.
        li_elemdescr   ?=  li_typedescr.
        ls_properties-comp_type     = c_comp_type-element.
        ls_properties-type_absname  = li_elemdescr->absolute_name .
        ls_properties-type_kind     = li_elemdescr->type_kind.
        ls_properties-type_length   = li_elemdescr->length  .
        ls_properties-type_decimals = li_elemdescr->decimals.
    ENDCASE.

    ls_properties-comp_name = iv_comp_name.

    IF iv_parent_fullpath IS INITIAL.
      ls_properties-comp_fullpath = iv_comp_name.
    ELSE.
      CONCATENATE iv_parent_fullpath iv_comp_name
      INTO ls_properties-comp_fullpath SEPARATED BY '-'.
    ENDIF.

    node_add( EXPORTING iv_parent_id  = iv_parent_id
              CHANGING  cs_properties = ls_properties ).

*======================================================================
*   find and add children components
*======================================================================
    CASE ls_properties-type_kind.
      WHEN cl_abap_datadescr=>typekind_struct1
        OR cl_abap_datadescr=>typekind_struct2.

        LOOP AT lt_components ASSIGNING <components>.

          CONCATENATE ls_properties-type_absname  <components>-name
          INTO lv_comp_refer SEPARATED BY '-'.

          nodes_recurs( iv_parent_id        = ls_properties-id
                        iv_parent_fullpath  = ls_properties-comp_fullpath
                        iv_comp_refer       = lv_comp_refer
                        iv_comp_name        = <components>-name ).
        ENDLOOP.

      WHEN cl_abap_datadescr=>typekind_table .
        nodes_recurs( iv_parent_id        = ls_properties-id
                      iv_parent_fullpath  = ls_properties-comp_fullpath
                      iv_comp_refer       = li_structdescr->absolute_name
                      iv_comp_name        = 'LINE' ).
      WHEN OTHERS.

    ENDCASE.

  ENDMETHOD.                    "nodes_recurs
  METHOD node_add.

    DATA:
      ls_attr        TYPE streeattr.

    CLEAR ls_attr.
    ls_attr-kind        = 'I'.
    ls_attr-tlength1    = 30.
    ls_attr-text1       = cs_properties-comp_name.
    ls_attr-tlength2    = 10.
    ls_attr-text2       = cs_properties-type_kind.
    ls_attr-tlength3    = 10.
    ls_attr-text3       = cs_properties-type_length.   CONDENSE ls_attr-text3.
    ls_attr-tlength4    = 10.
    ls_attr-text4       = cs_properties-type_decimals. CONDENSE ls_attr-text4.
    ls_attr-tlength5    = 20.
    ls_attr-text5       = cs_properties-type_absname.

    CASE cs_properties-comp_type.
      WHEN c_comp_type-struct.   ls_attr-nodeicon = c_comp_icon-struct.
      WHEN c_comp_type-table.    ls_attr-nodeicon = c_comp_icon-table.
      WHEN c_comp_type-element.  ls_attr-nodeicon = c_comp_icon-element.
    ENDCASE.

    CALL FUNCTION 'RS_TREE_ADD_NODE'
      EXPORTING
        new_name           = space
        insert_id          = iv_parent_id
        relationship       = 'CHILD'
        display_attributes = ls_attr
      IMPORTING
        new_id             = cs_properties-id
      EXCEPTIONS
        OTHERS             = 0.

    APPEND cs_properties TO t_properties.

  ENDMETHOD.                    "node_add
ENDCLASS.                    "lcl_ctxtdescr IMPLEMENTATION

PARAMETERS p_absnam TYPE abap_abstypename DEFAULT 'SHLP_DESCR'.

START-OF-SELECTION.
  DATA r_ctxtdescr TYPE REF TO lcl_ctxtdescr.
  CREATE OBJECT r_ctxtdescr
    EXPORTING
      iv_absname = p_absnam.

  PERFORM rs_tree_list_display TABLES r_ctxtdescr->t_hierarchy[].

*&---------------------------------------------------------------------*
*&      Form  rs_tree_list_display
*&---------------------------------------------------------------------*
FORM rs_tree_list_display TABLES pt_nodeinfo STRUCTURE snodetext.
  TYPE-POOLS:
    stree.

  CHECK pt_nodeinfo[] IS NOT INITIAL.

  CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
    TABLES
      nodeinfo = pt_nodeinfo.

  CALL FUNCTION 'RS_TREE_EXPAND'
    EXPORTING
      node_id = 1
    EXCEPTIONS
      OTHERS  = 0.

  CALL FUNCTION 'RS_TREE_LIST_DISPLAY'
    EXPORTING
      callback_program      = sy-repid
      callback_gui_status   = 'RS_TREE_LIST_CB_GUI_STATUS'
      callback_user_command = 'RS_TREE_LIST_CB_UCOMM'
      screen_start_column   = 5
      screen_start_line     = 5
      screen_end_column     = 70
      screen_end_line       = 30
      use_control           = stree_use_control
      layout_mode           = 'C'.

ENDFORM.                    "rs_tree_list_display
*&---------------------------------------------------------------------*
*&      Form  RS_TREE_LIST_CB_GUI_STATUS
*&---------------------------------------------------------------------*
FORM rs_tree_list_cb_gui_status.
  DATA lt_excl  TYPE STANDARD TABLE OF fcode .
  APPEND 'TRAD' TO lt_excl.
  APPEND 'TRDL' TO lt_excl.
  APPEND 'TRRN' TO lt_excl.
  APPEND 'TRMV' TO lt_excl.
  APPEND 'TRTO' TO lt_excl.
  APPEND 'TRZM' TO lt_excl.

  SET PF-STATUS 'LD_TREE'
    OF PROGRAM 'SAPLSEUT'
    EXCLUDING lt_excl.
ENDFORM.                    "RS_TREE_LIST_CB_GUI_STATUS
*&---------------------------------------------------------------------*
*&      Form  RS_TREE_LIST_CB_UCOMM
*&---------------------------------------------------------------------*
FORM rs_tree_list_cb_ucomm TABLES pt_nodetab
                            USING pv_uc           TYPE any
                         CHANGING cv_exit         TYPE flag
                                  cv_list_refresh TYPE any .
  DATA ls_nodetab  TYPE seucomm.
  MOVE-CORRESPONDING pt_nodetab TO ls_nodetab.

* ... обработка

ENDFORM.                    "RS_TREE_LIST_CB_UCOMM


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дерево из объекта словаря данных?
СообщениеДобавлено: Вт, июн 25 2013, 12:20 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Однако, всё же рекомендую посмотреть в сторону стандартного функционала, реализованного в тр.SE11 -->Представление иерархии; возможно удастся это использовать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дерево из объекта словаря данных?
СообщениеДобавлено: Вт, июн 25 2013, 12:53 
Ассистент
Ассистент

Зарегистрирован:
Вт, авг 03 2010, 11:03
Сообщения: 35
baboon написал(а):
Сейчас уже не помню точно, но, по-моему, можно добавить свой тип дерева в ракурс V_DMEE_TREE_TYPE.

Ага, спасибо - зашевелилось! :) Теперь попытаюсь с этим разобраться.

Бородин Игорь написал(а):
Я когда-то выводил дерево структуры следующим образом:
Code:
REPORT  ztest1.

И Вам спасибо, кшно!, но вопрос был не в том, как написать алгоритм построения дерева, а в том, как бы так извернуться, чтобы вообще ничего не писать. :) Т.е. в том, как для моей пользы (как говаривал товарищ Матроскин) грамотно заюзать стандарт.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дерево из объекта словаря данных?
СообщениеДобавлено: Вт, июн 25 2013, 12:58 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Цитата:
грамотно заюзать стандарт
правильный подход, согласен


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дерево из объекта словаря данных?
СообщениеДобавлено: Вт, июн 25 2013, 13:03 
Ассистент
Ассистент

Зарегистрирован:
Вт, авг 03 2010, 11:03
Сообщения: 35
Бородин Игорь написал(а):
Однако, всё же рекомендую посмотреть в сторону стандартного функционала, реализованного в тр.SE11 -->Представление иерархии; возможно удастся это использовать.

А вот это уже интересно! Спасибо за подсказку!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB