Текущее время: Пт, июл 18 2025, 03:31

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


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

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


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

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