Текущее время: Пн, июл 28 2025, 15:17

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Выкладываю свой класс(обертку) для динамического создания таблиц.
СообщениеДобавлено: Вт, сен 15 2009, 12:26 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, окт 31 2008, 15:58
Сообщения: 70
Добрый день.

Тема динамического создания таблиц поднимается на нашем форуме с регулярностью раз в 2 недели, это точно =)

Есть много примеров, и при желании, немного посмотрев, каждый может это сделать.

Я решил выложить свой класс на основе RTTI с той целью, если кто-то забудет, или не будет под рукой примера, смог просто взять мой

include, и либо использовать его, либо посмотрев внутрь вспомнить. И возможно еще одно сообщение на эту тему, уменьшит их появление в

дальнейшем.

Меня мотивировало на это вновь появившаяся тема про дин. создание таблиц.

Для меня это типа шпаргалки.
Code:
*&---------------------------------------------------------------------*
*&  Include           ZAVV_LCL_CRTFIELDCATALOG
*&---------------------------------------------------------------------*
CLASS zavv_lcl_dyn DEFINITION .
  PUBLIC SECTION.
    CLASS-METHODS:
        get_fldcat IMPORTING im_table TYPE STANDARD TABLE
          EXPORTING ex_fldcat TYPE lvc_t_fcat,
        get_dyntab IMPORTING im_table TYPE STANDARD TABLE
          EXPORTING ex_dyntab TYPE REF TO data,
        get_dyntab_from_std IMPORTING VALUE(im_name_type) TYPE char80
          EXPORTING ex_dyntab TYPE REF TO data
                .


ENDCLASS.                    "zavv_lcl_crtfieldcatalog DEFINITION
*----------------------------------------------------------------------*
*       CLASS zavv_lcl_crtfieldcatalog IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zavv_lcl_dyn IMPLEMENTATION.
  METHOD get_fldcat.

    DATA: lcl_table_descr TYPE REF TO cl_abap_tabledescr,
          lcl_struc_descr TYPE REF TO cl_abap_structdescr,
          ret_components TYPE abap_compdescr_tab,
          wa_ret_components TYPE LINE OF abap_compdescr_tab,
          wa_ct_fieldcat TYPE lvc_s_fcat.

    CLEAR: lcl_table_descr ,
              lcl_struc_descr ,
              ret_components ,
              wa_ret_components ,
              wa_ct_fieldcat .

    lcl_table_descr ?= cl_abap_typedescr=>describe_by_data( im_table ).
    lcl_struc_descr ?= lcl_table_descr->get_table_line_type( ).
    ret_components = lcl_struc_descr->components.

    LOOP AT ret_components INTO wa_ret_components .
      wa_ct_fieldcat-fieldname = wa_ret_components-name.
      wa_ct_fieldcat-col_pos = sy-tabix.
      wa_ct_fieldcat-inttype = wa_ret_components-type_kind.
      wa_ct_fieldcat-intlen = wa_ret_components-length.
      APPEND wa_ct_fieldcat TO ex_fldcat.
      CLEAR wa_ct_fieldcat.
    ENDLOOP.


  ENDMETHOD.                    "get_fldcat
  METHOD get_dyntab.

    DATA: lcl_table_descr TYPE REF TO cl_abap_tabledescr,
          lcl_struc_descr TYPE REF TO cl_abap_structdescr,
          ret_components TYPE abap_compdescr_tab,
          wa_ret_components TYPE LINE OF abap_compdescr_tab,
          wa_ct_fieldcat TYPE lvc_s_fcat,
          lt_fldcat TYPE lvc_t_fcat.

    CLEAR: lcl_table_descr ,
              lcl_struc_descr ,
              ret_components ,
              wa_ret_components ,
              wa_ct_fieldcat ,
              lt_fldcat .

    lcl_table_descr ?= cl_abap_typedescr=>describe_by_data( im_table ).
    lcl_struc_descr ?= lcl_table_descr->get_table_line_type( ).
    ret_components = lcl_struc_descr->components.

    LOOP AT ret_components INTO wa_ret_components .
      wa_ct_fieldcat-fieldname = wa_ret_components-name.
      wa_ct_fieldcat-col_pos = sy-tabix.
      wa_ct_fieldcat-inttype = wa_ret_components-type_kind.
      wa_ct_fieldcat-intlen = wa_ret_components-length.
      APPEND wa_ct_fieldcat TO lt_fldcat.
      CLEAR wa_ct_fieldcat.
    ENDLOOP.
    DATA: im_table1 TYPE REF TO data.

    CALL METHOD cl_alv_table_create=>create_dynamic_table
      EXPORTING
        it_fieldcatalog           = lt_fldcat
      IMPORTING
        ep_table                  = ex_dyntab
      EXCEPTIONS
        generate_subpool_dir_full = 1
        OTHERS                    = 2.

  ENDMETHOD.                    "get_fldcat
  METHOD get_dyntab_from_std.

    CREATE DATA ex_dyntab TYPE STANDARD TABLE OF (im_name_type).

  ENDMETHOD.                    "get_dyntab_from_std
ENDCLASS.                    "zavv_lcl_crtfieldcatalog IMPLEMENTATION

Пример использования
Code:
REPORT  zavv_test.

INCLUDE zavv_lcl_crtfieldcatalog.

DATA : it_file  LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.

DATA file_path LIKE  rlgrap-filename.

TYPES : BEGIN OF  sbu_upload ,
  bu TYPE char2,
  bu_desc TYPE char5,
  delete TYPE c,
END OF sbu_upload .

DATA tbu_upload  TYPE STANDARD TABLE OF sbu_upload  WITH HEADER LINE.

DATA: lt_fieldcat TYPE lvc_t_fcat.

INITIALIZATION.

START-OF-SELECTION.

  zavv_lcl_dyn=>get_fldcat( EXPORTING im_table = tbu_upload[]
                                        IMPORTING ex_fldcat = lt_fieldcat  ).
  DATA: lt_tab1 TYPE REF TO data.
  zavv_lcl_dyn=>get_dyntab( EXPORTING im_table = tbu_upload[]
                                        IMPORTING ex_dyntab = lt_tab1  ).

  DATA: lt_tab2 TYPE REF TO data.
  zavv_lcl_dyn=>get_dyntab_from_std( EXPORTING im_name_type = 'MARA'
                                        IMPORTING ex_dyntab = lt_tab2  ).


  FIELD-SYMBOLS: <l_table1> TYPE STANDARD TABLE,
                 <l_line1> TYPE any,
                 <fs> TYPE any.
  DATA: new_line1 TYPE REF TO data.

  ASSIGN lt_tab1->* TO <l_table1>.
  CREATE DATA new_line1 LIKE LINE OF <l_table1>.
  ASSIGN new_line1->* TO <l_line1>.

  ASSIGN COMPONENT 'BU' OF STRUCTURE <l_line1> to <fs>.
  <fs> = '1'.
  APPEND <l_line1> to <l_table1>.

  BREAK sy-uname.

_________________
С Уважением, Абрамов Виктор.
The devil is in the detail.


Последний раз редактировалось Абрамов Виктор Вт, апр 06 2010, 10:21, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выкладываю свой класс(обертку) для динамического создания таблиц.
СообщениеДобавлено: Чт, сен 17 2009, 09:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Если структура, по которой нужна таблица, уже есть в виде переменной, то все же проще, думаю, создать таблицу при помощи CREATE DATA tab_ref LIKE TABLE OF var, если конечно, версия SAP позволяет:
Code:
DATA: ref TYPE REF TO data,
      tab_ref TYPE REF TO data.

FIELD-SYMBOLS: <fs> TYPE ANY.

CREATE DATA ref TYPE ('T001').

ASSIGN ref->* TO <fs>.

CREATE DATA tab_ref LIKE TABLE OF <fs>.

Создавать сначала fieldcatalog, потом генерить пул подпрограмм (внутри cl_alv_table_create=>create_dynamic_table) для создания таблицы, думаю перебор.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выкладываю свой класс(обертку) для динамического создания таблиц.
СообщениеДобавлено: Чт, сен 17 2009, 10:10 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, ноя 07 2006, 09:49
Сообщения: 303
Можно даже для fs сразу вписать тип создаваемый таблицы:

Code:
FIELD-SYMBOLS:
  <fs_it_tab> TYPE STANDARD TABLE.

DATA:
  ref_it_dbtab TYPE REF TO data.

CREATE DATA ref_it_dbtab TYPE STANDARD TABLE OF (p_dbtab).
ASSIGN ref_it_dbtab->* TO <fs_it_tab>.


Вроде бы как быстродействие с типизированными fs-ми должно быть повыше, согласно help.sap.com, если не ошибаюсь...

_________________
* * *


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выкладываю свой класс(обертку) для динамического создания таблиц.
СообщениеДобавлено: Вт, апр 06 2010, 10:21 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, окт 31 2008, 15:58
Сообщения: 70
Добрый день, коллеги.

Отвечаю на поступившие дополнения.

Сергей Королев, Вы правы, что когда используем

Code:
DATA: ref TYPE REF TO data,
      tab_ref TYPE REF TO data.

FIELD-SYMBOLS: <fs> TYPE ANY.

CREATE DATA ref TYPE ('T001').

ASSIGN ref->* TO <fs>.

CREATE DATA tab_ref LIKE TABLE OF <fs>.

конкретно для создания одной простой динамической таблицы, это проще.
Но основное предназначение этого класса, когда я его использую на практике, это дополнение-изменение существующей структуры или изменение типа полей. Т.е. там где стандартный тип не подходит. Создание простой динамической таблицы на основе уже существующей, это не цель класса, а одна из возможностей.

Добавил еще один метод в одну строчку, чтобы сразу разграничить. Один метод для получения itab на основе измененного филдкаталога, а другой делает сразу на основе стандартного типа. Это сделано только для того, чтобы исключить в дальнейшем эти споры.

_________________
С Уважением, Абрамов Виктор.
The devil is in the detail.


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

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


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

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


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

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