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

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


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

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


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

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