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

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


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

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


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

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