Текущее время: Чт, июл 31 2025, 15:01

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Формировать структуру ALV динамически
СообщениеДобавлено: Чт, июн 28 2007, 08:22 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Любаша написал(а):

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

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Формировать структуру ALV динамически
СообщениеДобавлено: Чт, июн 28 2007, 08:29 
Гость
sy-uname написал(а):
Основной метод - отфильтровывать по-максимому ещё на стадии выборки и бороться с, как это часто бывает, выбором всего из-за псевдо-"необходимо по работе".


У меня задача поставлена так, что максимум оптимизации - это 99 столбцов, к сожалению. И то это ограничение самого грида. Остальная выборка - это очень много строк.

Но меня в самом деле поражает объем памяти, который есть грид при строительстве. А ещё есть предложения?


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: Формировать структуру ALV динамически
СообщениеДобавлено: Чт, июн 28 2007, 10:13 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Любаша написал(а):
У меня задача поставлена так, что максимум оптимизации - это 99 столбцов, к сожалению. И то это ограничение самого грида. Остальная выборка - это очень много строк.

Но меня в самом деле поражает объем памяти, который есть грид при строительстве. А ещё есть предложения?

Если _ЭТО_ потом просто печатается - выгружайте сразу в смартформу, pdf или спул.
Если ОНИ с _ЭТИМ_ ещё хотят какие-то проделывать операции - выгружайте в файл, и пусть ОНИ его обрабатывают в Excel, Access, т.п.

Или пусть докупят железо, перейдут на 64bit.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Формировать структуру ALV динамически
СообщениеДобавлено: Чт, июн 28 2007, 10:16 
Гость
sy-uname написал(а):
Любаша написал(а):
У меня задача поставлена так, что максимум оптимизации - это 99 столбцов, к сожалению. И то это ограничение самого грида. Остальная выборка - это очень много строк.

Но меня в самом деле поражает объем памяти, который есть грид при строительстве. А ещё есть предложения?

Если _ЭТО_ потом просто печатается - выгружайте сразу в смартформу, pdf или спул.
Если ОНИ с _ЭТИМ_ ещё хотят какие-то проделывать операции - выгружайте в файл, и пусть ОНИ его обрабатывают в Excel, Access, т.п.

Или пусть докупят железо, перейдут на 64bit.


Нет, ЭТО потом должно перекачаться в САП пакетниками. И храниться до поры, до времени в Z-таблицах.
А ещё по ЭТОМУ должно быть построено куча отчётов.


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

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Вот только что закончил реализовывать описанную в начале топика идею. В моем случае потребление памяти сократилось в 8 раз.

Code:


  data: dyntab type standard table of dntab with header line.
  data: tab_name type ddobjname value 'ZBIG_STRUCTURE'. "< в этой структуре 130 столбцов
 
  "получим описание этой структуры
  call function 'NAMETAB_GET'
    exporting
      langu   = sy-langu
      tabname = tab_name
    tables
      nametab = dyntab.

  "построим филдкаталог только с теми столбцами, которые нас интересуют
  data: i_fcat    type  lvc_t_fcat with header line.
  loop at dyntab.
    read table fcat_rip with key fieldname = dyntab-fieldname.
    if sy-subrc = 0.
      i_fcat-fieldname = dyntab-fieldname.
      i_fcat-ref_field = dyntab-fieldname.
      i_fcat-ref_table = dyntab-tabname.
      append  i_fcat .
    endif.
  endloop.

  "на основании полученного филдкаталога сформируем таблицу с соответствующей структурой
  data: dref     type ref to data.
  call method cl_alv_table_create=>create_dynamic_table
    exporting
      it_fieldcatalog = i_fcat[]
    importing
      ep_table        = dref.

  field-symbols : <newtab> type table.
  assign  dref->* to <newtab>. "<newtab> - нужная нам таблица

  "создадим workarea для нашей таблицы
  data: p_line type ref to data.
  create data p_line like line of <newtab>.
  field-symbols: <line> type any.
  assign p_line->* to <line>.

  "result - большая таблица, 130 столбцов.
  "перекинем из нее данные в <newtab>
  loop at result.
    move-corresponding result to <line>.
    append <line> to <newtab>.
  endloop.
  refresh: result.

  "наконец, вызовем ALV, передав туда <newtab>, вместо result
  call function 'REUSE_ALV_GRID_DISPLAY'
  exporting
    i_callback_program                = repid
    i_callback_user_command           = 'USER_COMMAND'
    i_callback_top_of_page            = 'TOP_OF_PAGE'
    i_grid_settings                   = s_glay
    it_fieldcat                       = t_fieldcat
    i_save                            = 'A'
    it_events                         = gt_events
    is_variant                        = s_variant
    i_html_height_top                 = 25
  tables
    t_outtab                          = <newtab>. "result.



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

Зарегистрирован:
Ср, сен 22 2004, 08:42
Сообщения: 1079
Откуда: Москва
Пол: Мужской
вместо refresh: result необходимо cделать free: result.


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

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Mike1 написал:
вместо refresh: result необходимо cделать free: result.


Почему?


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

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
На всякий случай.
Code:
free: result, result[].
clear: result, result[].
refresh: result.


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

Зарегистрирован:
Ср, сен 22 2004, 08:42
Сообщения: 1079
Откуда: Москва
Пол: Мужской
Оператор refresh только удаляет записи из таблицы. Оператор free освобождает выделенную под таблицу память.


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

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Mike1 написал:
Оператор refresh только удаляет записи из таблицы. Оператор free освобождает выделенную под таблицу память.


Сейчас проверил - память освобождается.


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

Зарегистрирован:
Ср, сен 22 2004, 08:42
Сообщения: 1079
Откуда: Москва
Пол: Мужской
в вашем коде сначала free а потом refresh. Память освобождается по free.


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

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Mike1 написал:
в вашем коде сначала free а потом refresh. Память освобождается по free.


Код, с помощью которого я это проверял выглядит вот так:

Code:
report ZTMP.

data: tmp type standard table of zzz with header line.

do 100000 times.
  append tmp.
enddo.

refresh: tmp.

tmp-belnr = 0.


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

Зарегистрирован:
Ср, сен 22 2004, 08:42
Сообщения: 1079
Откуда: Москва
Пол: Мужской
На моей системе после refresh таблица занимала 14k памяти.


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

Зарегистрирован:
Ср, окт 04 2006, 09:08
Сообщения: 204
Mike1 написал:
На моей системе после refresh таблица занимала 14k памяти.


А Вы определяете размер памяти, занимемый конкретной таблицей?


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

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


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

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


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

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