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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Формировать структуру ALV динамически
СообщениеДобавлено: Ср, июн 20 2007, 12:43 
Специалист
Специалист

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Добрый день, уважаемые коллеги!

Возник такой странный вопрос:

Есть отчет, который выводит ALV-grid с очень большим количеством столбцов => большой расход памяти, если строк много.
При этом понятно, что одновременно все столбцы пользователю не нужны.
Появилась идея: пользователь указывает что ему нужно, и получает список только с этими столбцами.
Соответственно вопрос: есть ли способы формировать таблицу с "динамической" структурой, которую потом можно потом передать в ALV?

Понимаю, звучит бредово, но тем не менее...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:01 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Посмотри класс CL_SALV_TABLE и https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/1628


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:03 
Гость
самое простое - использование параметра NO_OUT в фиелдкаталоге


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:14 
Специалист
Специалист

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
John Doe написал:
Посмотри класс CL_SALV_TABLE и https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/1628


Похоже это то, что нужно. Будем пробовать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:23 
Гость
вот живой пример,
должен помочь:

Code:
REPORT  ZTEST611111                             .

TYPE-POOLS: KKBLO, SLIS.
DATA: PRN LIKE SY-REPID.
DATA: IT TYPE  KKBLO_T_FIELDCAT ,
      IL LIKE LINE OF IT.


PRN = SY-REPID.


IL-FIELDNAME = 'FF1'.
IL-TABNAME = 'ZAP'.
IL-DATATYPE = 'CHAR'.
IL-INTLEN = '10'.
APPEND IL TO IT.

IL-FIELDNAME = 'FF2'.
IL-TABNAME = 'ZAP'.
IL-DATATYPE = 'CHAR'.
IL-INTLEN = '10'.
APPEND IL TO IT.


CALL FUNCTION 'K_KKB_TABLE_CREATE'
  EXPORTING
    IT_FIELDCAT              = IT
    I_CALLBACK_PROGRAM       = PRN
    I_FORMNAME               = 'MFORM'
    I_TABNAME                = 'ZAP'
  EXCEPTIONS
    GENERATE_SUB_POOL_FAILED = 1
    OTHERS                   = 2.

*&---------------------------------------------------------------------*
*&      Form  mform
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM MFORM TABLES ZAP.
DATA: IC TYPE SLIS_T_FIELDCAT_ALV,
       ICL LIKE LINE OF IC.
  FIELD-SYMBOLS: <F>.
  DATA: FNAME(20).
  LOOP AT IT INTO IL.
     MOVE-CORRESPONDING IL TO ICL.
     APPEND ICL TO IC.
  ENDLOOP.
  DO 10 TIMES.
    LOOP AT IT INTO IL.
      CONCATENATE 'ZAP-' IL-FIELDNAME
         INTO FNAME.
      ASSIGN (FNAME) TO <F>.
      IF SY-SUBRC = 0.
        CASE IL-FIELDNAME.
          WHEN 'FF1'. WRITE SY-DATUM TO <F>.
          WHEN 'FF2'.
            WRITE SY-UZEIT TO <F>.
        ENDCASE.
      ENDIF.
    ENDLOOP.
    APPEND ZAP.
  ENDDO.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = PRN
      IT_FIELDCAT        = IC
    TABLES
      T_OUTTAB           = ZAP.

ENDFORM.                    "mform


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:29 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Пн, ноя 06 2006, 20:01
Сообщения: 29
Как вариант - задать вариант по умолчанию для всех ALV-Grid с определенным количеством колонок


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:45 
Специалист
Специалист

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
РМщик написал(а):
вот живой пример,
должен помочь:

...



Спасибо, это именно то, что нужно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 13:55 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
еще как вариант:
Завести большую структуру со всеми нужными-ненужными полями.
Получить по ней филдкаталог.
Удалить из него неужные поля.
И через CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE получить таблицу нужного формата.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 20 2007, 14:46 
Специалист
Специалист

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Lars написал:
еще как вариант:
Завести большую структуру со всеми нужными-ненужными полями.
Получить по ней филдкаталог.
Удалить из него неужные поля.
И через CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE получить таблицу нужного формата.


Да, пожалуй в моем случае это даже лучше подойдет, т.к. "большая структура" уже описана в словаре.
Значит достаточно будет просто выкинуть из нее лишние поля.
Отлично!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 21 2007, 09:26 
Специалист
Специалист

Зарегистрирован:
Чт, июн 21 2007, 09:14
Сообщения: 166
Откуда: Москва
Пол: Мужской
В класс-метод
CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE нужно передавать каталог полей генерируемой таблицы. Если посмотреть, что внутри метода, то можно сделать тоже самое, только ручками.
Вот примерчик

Code:

TYPES:
t_line_prog(72) TYPE c.

DATA:
it_source TYPE STANDARD TABLE OF t_line_prog.

*it_source – таблица со строками исходного кода программы
*заполним ее следующим образом

*REPORT TEST.
*TABLES: BSEG .
*FORM TABLE_CREATE CHANGING POINTER TYPE REF TO DATA.
*TYPES: BEGIN OF T_WA_TAB,
*BUKRS TYPE BSEG-BUKRS,
*BELNR TYPE BSEG-BELNR,
*GJAHR TYPE BSEG-GJAHR,
*BUZEI TYPE BSEG-BUZEI,
*BUZID TYPE BSEG-BUZID,
*AUGDT TYPE BSEG-AUGDT,
*AUGCP TYPE BSEG-AUGCP,
*AUGBL TYPE BSEG-AUGBL,
*END OF T_WA_TAB.
*DATA: IT_TAB TYPE STANDARD TABLE OF T_WA_TAB.
*CREATE DATA POINTER LIKE IT_TAB[].
*ENDFORM.

DATA: program_name LIKE sy-cprog,
syntax_check_message(128) TYPE c,
line_no TYPE i.

*теперь сгенерируем пул подпрограмм
CATCH SYSTEM-EXCEPTIONS generate_subpool_dir_full = 4.
  GENERATE SUBROUTINE POOL it_source
  NAME program_name
  MESSAGE syntax_check_message
  LINE line_no.
ENDCATCH.

*если не произошло системных исключительных ситуаций, которые
*ловятся CATCH ... ENDCATCH, то sy-subrc = 0 и program_name
*содержит имя сгенерированного пула

DATA rf_pointer TYPE REF TO data.
FIELD-SYMBOLS: <fs_tab> TYPE table.

IF sy-subrc = 0.
*вызовем подпрограмму TABLE_CREATE из сгенерированного пула
  PERFORM table_create IN PROGRAM (program_name) CHANGING
  rf_pointer.
*вот и получили табличку нужного типа, всё просто
  ASSIGN rf_pointer->* TO <fs_tab>.
ENDIF.

*потом где-нибудь в программе обращаемся к табличке
IF <fs_tab> IS ASSIGNED.
...
ENDIF.




Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 25 2007, 17:22 
Специалист
Специалист

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Сделал с классом cl_alv_table_create, получил <newtab> нужной мне структуры.
Но как в нее что-то записать? Заголовка у нее нет, вариант: data: wa like line of <newtab> не прокатывает как-раз из-за способа, которым эта таблица была получена.


Code:
DATA : dyntab    TYPE STANDARD TABLE OF dntab,
       wa_dyntab TYPE dntab,

       dref      TYPE REF TO data,

       i_fcat    TYPE  lvc_t_fcat,
       wa_fcat   TYPE lvc_s_fcat,

       tab_name TYPE ddobjname VALUE 'ZTEST'.

FIELD-SYMBOLS : <newtab> TYPE table.
parameters: xxx type c as checkbox.

at selection-screen output.
loop at screen.
endloop.

START-OF-SELECTION.

  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      langu   = sy-langu
      tabname = tab_name
    TABLES
      nametab = dyntab. "dyntab now contains the field names

* FILLING THE CATALOG OF NEW DYNAMIC INTERNAL TABLE

  LOOP AT dyntab INTO wa_dyntab.
    wa_fcat-fieldname = wa_dyntab-fieldname.
    wa_fcat-ref_field = wa_dyntab-fieldname.
    wa_fcat-ref_table = wa_dyntab-tabname.
    APPEND wa_fcat TO i_fcat .
  ENDLOOP.


* CREATING A POINTER (FIELD SYMBOL) TO THE INTERNAL TABLE
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = i_fcat
    IMPORTING
      ep_table        = dref.

  ASSIGN  dref->* TO <newtab>.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 25 2007, 17:27 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
MOVE-CORRESPONDING и APPEND <newtab>... Или селект в корреспондинг филдс оф <newtab>.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Пн, июн 25 2007, 17:33 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
append/insert initial line into <table> assigning <line>. (4.7)
or
data line_ref type ref to data.
create data line_ref like line of <table>.
assign line_ref->* to <line>.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 25 2007, 17:36 
Специалист
Специалист

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Ага, разобрался. Тот же класс помогает:

Code:
  call method cl_alv_table_create=>table_copy
    exporting
      IT_OUTTAB = result[]
      IT_FIELDCATALOG = i_fcat
    importing
      EP_TABLE = dref.

  ASSIGN  dref->* TO <newtab>.


Внутри table_copy хитро все довольно сделано. Сам не додумаешься.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Формировать структуру ALV динамически
СообщениеДобавлено: Чт, июн 28 2007, 08:13 
Гость
profiteer написал(а):
Добрый день, уважаемые коллеги!

Возник такой странный вопрос:

Есть отчет, который выводит ALV-grid с очень большим количеством столбцов => большой расход памяти, если строк много.

...


У меня проблема с памятью и соответственно, с быстродействием.
Подскажите, как работать с гридом с большим количеством строк?
Это необходимо по работе. Очень тормозит и съедает кучу памяти.
Есть ли какие-то методы оптимизации работы?

Ещё вопрос: объясните, пжлста, простыми словами, что такое в методе set_table_for_first_display
Code:
        i_buffer_active         = 'X'     
        i_bypassing_buffer   = 'X'
?


Принять этот ответ
Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

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


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

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


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

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