Текущее время: Ср, апр 24 2024, 06:05

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


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

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


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

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