Текущее время: Чт, июл 17 2025, 21:48

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Создание FIELDCATALOG на основе динамически созданной структуры
СообщениеДобавлено: Вс, сен 07 2014, 17:18 
Начинающий
Начинающий

Зарегистрирован:
Вс, сен 07 2014, 16:44
Сообщения: 8
Здравствуйте.
Есть следующая задача:
Есть таблица 1 с полями: завод, неделя, кол-во за неделю.
На основании данных из таблицы 1 нужно создать таблицу 2 с полями : завод, неделя 1 ... неделя N, заполнить ее данными из таблицы 1 и вывести на экран.


Создаю структуру аналогично нижеописанному примеру:
Code:
REPORT  test
"Описание параметров СЭ
parameters
  : p_name     type fieldname
  , p_type     type c
  , p_len      type i
  , p_tbnam    type string
  .
"Описание данных
data "Структура таблицы в которой будут храниться
     "введенные пользователем описания полей, динамической табл.
  : begin   of   gs_task
  ,   name  like p_name " имя поля
  ,   type  like p_type " тип поля
  ,   len   like p_len  " длина поля
  , end     of   gs_task
  , gt_task like standard table of gs_task
            with key name
  , gt_fld  type standard table of fieldname " список полей для выборки
  , gr      type ref to data
  .
field-symbols
  : <table> type standard table
  .
at selection-screen.
  gs_task-name = p_name .
  gs_task-type = p_type .
  gs_task-len  = p_len  .
  "Заполняем таблицу данными c СЭ
  append gs_task to gt_task.

start-of-selection.
  perform table_creation. " создание таблицы
  perform table_reading.  " заполнение и вывод на экран
*&---------------------------------------------------------------------*
*&      Form  table_creation
*&---------------------------------------------------------------------*
form table_creation.
  data
    : lo_struct  type ref to cl_abap_structdescr
    , lo_table   type ref to cl_abap_tabledescr
    , ls_comp    type abap_componentdescr
    , lt_comp    type abap_component_tab
    .
  sort gt_task.
  delete adjacent duplicates from gt_task.
  loop at gt_task into gs_task.
    ls_comp-name = gs_task-name. " имя поля
    case gs_task-type.
    " используем методы (get_i, get_d, get_c, get_n) класса cl_abap_elemdescr
    " которые возвращают тип объекта для элементарного типа, так же
    " используем значение gs_task-len внутри метода для указания длины типа данных

      when 'I'. " Числовое поле
        ls_comp-type = cl_abap_elemdescr=>get_i( ).
      when 'D'. " Поле типа ДАТА
        ls_comp-type = cl_abap_elemdescr=>get_d( ).
      when 'C'. " Текстовое поле с переменной длиной
        ls_comp-type = cl_abap_elemdescr=>get_c( gs_task-len ).
      when 'N'. " Текстовое поле(для хранения чисел) с переменной длиной
        ls_comp-type = cl_abap_elemdescr=>get_n( gs_task-len ).
    endcase.
    append ls_comp to lt_comp.
    append gs_task-name to gt_fld.
  endloop.
  lo_struct = cl_abap_structdescr=>create( lt_comp ).  " создаем объект структуру
  lo_table  = cl_abap_tabledescr=>create( lo_struct ). " создаем объект таблицу
  create data gr  type handle lo_table. " создаем обект-данных полученного типа
  assign gr->* to <table>. "создаем таблицу
endform.                    "table_creation
*&---------------------------------------------------------------------*
*&      Form  table_reading
*&---------------------------------------------------------------------*
form table_reading.
*  " Выборка
*  select (gt_fld)  " поля указанные пользователем на СЭ
*    from (p_tbnam) " таблица указанная пользователем на СЭ
*         into corresponding fields of table <table>.

  field-symbols
    : <ls_wa> type any
    , <comp> type any
    .
" Вывод выбранных записей
  loop at <table> assigning <ls_wa>.
    new-line.
    do.
      assign component sy-index of structure <ls_wa> to <comp>.
      if sy-subrc ne 0.
        exit.
      endif.
      write <comp>.
    enddo.
  endloop.
endform.                    "table_reading


Далее создаю fieldcat:
Code:
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_mself
      i_structure_name       = 'LO_STRUCT'
    CHANGING
      ct_fieldcat            = lt_fdcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc IS NOT INITIAL.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


Но появляется ошибка:
Изображение


Подскажите, пожалуйста, как исправить ошибку?
Заранее спасибо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание FIELDCATALOG на основе динамически созданной структуры
СообщениеДобавлено: Вс, сен 07 2014, 18:20 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
этот ф/м работает по словарным типам,
каталог составляйте сами


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание FIELDCATALOG на основе динамически созданной структуры  Тема решена
СообщениеДобавлено: Вс, сен 07 2014, 20:01 
Начинающий
Начинающий

Зарегистрирован:
Вс, сен 07 2014, 16:44
Сообщения: 8
trop написал(а):
этот ф/м работает по словарным типам,
каталог составляйте сами


Спасибо, за ответ.

Появилась новая проблема:
не знаю как заполнить таблицу 2 (<table> (field-symbols : <table> type standard table)) данными из таблицы 1.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание FIELDCATALOG на основе динамически созданной структуры
СообщениеДобавлено: Пн, сен 08 2014, 13:09 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
trop написал(а):
каталог составляйте сами
SALV-грид умеет делать филдкаталог по ссылке, надо только вытащить из него.
Примерно так:
Code:
REPORT z_test1 .

TYPE-POOLS:
  slis .
DATA:
  gt_fcat_lvc       TYPE lvc_t_fcat ,
  gt_fcat_slis      TYPE slis_t_fieldcat_alv ,
  gt_outtab         TYPE STANDARD TABLE OF t001 .

START-OF-SELECTION .

  PERFORM get_fcat_lvc  USING gt_outtab[]
                     CHANGING gt_fcat_lvc[] .

  PERFORM get_fcat_slis USING gt_outtab[]
                     CHANGING gt_fcat_slis[] .


*&---------------------------------------------------------------------*
*&      Form  get_fcat_lvc
*&---------------------------------------------------------------------*
FORM get_fcat_lvc USING pt_outtab    TYPE STANDARD TABLE
               CHANGING ct_fcat_lvc  TYPE lvc_t_fcat .
  DATA:
    lr_salv_table    TYPE REF TO cl_salv_table ,
    lr_columns_table TYPE REF TO cl_salv_columns_table ,
    lr_aggregations  TYPE REF TO cl_salv_aggregations .

  cl_salv_table=>factory( IMPORTING r_salv_table = lr_salv_table
                          CHANGING  t_table      = pt_outtab ) .

  lr_columns_table = lr_salv_table->get_columns( ) .

  ct_fcat_lvc = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
                                      r_columns = lr_columns_table
                                      r_aggregations = lr_aggregations ) .

ENDFORM .                    "get_fcat_lvc
*&---------------------------------------------------------------------*
*&      Form  get_fcat_slis
*&---------------------------------------------------------------------*
FORM get_fcat_slis USING pt_outtab    TYPE STANDARD TABLE
                CHANGING ct_fcat_slis TYPE slis_t_fieldcat_alv .
  DATA:
    lr_salv_table    TYPE REF TO cl_salv_table ,
    lr_columns_table TYPE REF TO cl_salv_columns_table ,
    lr_aggregations  TYPE REF TO cl_salv_aggregations .

  cl_salv_table=>factory( IMPORTING r_salv_table = lr_salv_table
                          CHANGING  t_table      = pt_outtab ) .

  lr_columns_table = lr_salv_table->get_columns( ) .

  ct_fcat_slis = cl_salv_controller_metadata=>get_slis_fieldcatalog(
                                        r_columns = lr_columns_table
                                        r_aggregations = lr_aggregations ).

ENDFORM .                    "get_fcat_slis


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание FIELDCATALOG на основе динамически созданной структуры
СообщениеДобавлено: Пн, сен 08 2014, 13:28 
Начинающий
Начинающий

Зарегистрирован:
Вс, сен 07 2014, 16:44
Сообщения: 8
Бородин Игорь написал(а):
trop написал(а):
каталог составляйте сами
SALV-грид умеет делать филдкаталог по ссылке, надо только вытащить из него.
Примерно так:
Code:
REPORT z_test1 .

TYPE-POOLS:
  slis .
DATA:
  gt_fcat_lvc       TYPE lvc_t_fcat ,
  gt_fcat_slis      TYPE slis_t_fieldcat_alv ,
  gt_outtab         TYPE STANDARD TABLE OF t001 .

START-OF-SELECTION .

  PERFORM get_fcat_lvc  USING gt_outtab[]
                     CHANGING gt_fcat_lvc[] .

  PERFORM get_fcat_slis USING gt_outtab[]
                     CHANGING gt_fcat_slis[] .


*&---------------------------------------------------------------------*
*&      Form  get_fcat_lvc
*&---------------------------------------------------------------------*
FORM get_fcat_lvc USING pt_outtab    TYPE STANDARD TABLE
               CHANGING ct_fcat_lvc  TYPE lvc_t_fcat .
  DATA:
    lr_salv_table    TYPE REF TO cl_salv_table ,
    lr_columns_table TYPE REF TO cl_salv_columns_table ,
    lr_aggregations  TYPE REF TO cl_salv_aggregations .

  cl_salv_table=>factory( IMPORTING r_salv_table = lr_salv_table
                          CHANGING  t_table      = pt_outtab ) .

  lr_columns_table = lr_salv_table->get_columns( ) .

  ct_fcat_lvc = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
                                      r_columns = lr_columns_table
                                      r_aggregations = lr_aggregations ) .

ENDFORM .                    "get_fcat_lvc
*&---------------------------------------------------------------------*
*&      Form  get_fcat_slis
*&---------------------------------------------------------------------*
FORM get_fcat_slis USING pt_outtab    TYPE STANDARD TABLE
                CHANGING ct_fcat_slis TYPE slis_t_fieldcat_alv .
  DATA:
    lr_salv_table    TYPE REF TO cl_salv_table ,
    lr_columns_table TYPE REF TO cl_salv_columns_table ,
    lr_aggregations  TYPE REF TO cl_salv_aggregations .

  cl_salv_table=>factory( IMPORTING r_salv_table = lr_salv_table
                          CHANGING  t_table      = pt_outtab ) .

  lr_columns_table = lr_salv_table->get_columns( ) .

  ct_fcat_slis = cl_salv_controller_metadata=>get_slis_fieldcatalog(
                                        r_columns = lr_columns_table
                                        r_aggregations = lr_aggregations ).

ENDFORM .                    "get_fcat_slis


Сделал вот так:
1) Создал структуру с заранее известными полями + неделя(поле-образец)
2) Через ф/м создал каталог полей
3) Далее сделал следующее:
Code:
  LOOP AT lt_fdcat ASSIGNING <wa_fcat>.
        IF <wa_fcat>-fieldname = 'WEEK_1'.
        LOOP AT lt_week INTO ls_week.
          CONCATENATE 'WEEK' ls_week-week INTO <wa_fcat>-fieldname.
           APPEND <wa_fcat>  TO lt_fdcat2.
        ENDLOOP.
      ELSE.
        APPEND <wa_fcat>  TO lt_fdcat2.
      ENDIF.
    ENDLOOP.



Всем огромное спасибо за помощь!


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

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


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

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


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

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