Текущее время: Сб, июл 19 2025, 16:02

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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