Текущее время: Вс, авг 03 2025, 03:04

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 03 2007, 13:18 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Long написал(а):
В моем случае, хотелось просто попробовать сделать матрицу - таблицу таблиц.


Так вот как раз в вашем случае, вложенную динамически созданную таблицу сначала надо НЕ ЗАБЫТЬ удалить из памяти, прежде чем удалять таблицу с указателями.

Если этого не делать, проблемы Вы может быть и не заметите, потому что общая память удалится при закрытии приложения, но если эта утечка памяти будет накапливаться, в сложном приложении можете получить дамп, связанный с превышением 2G лимита.

Я выступаю не только за грамотность русского языка, но и за аккуратность написания приложений. ;-)


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

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
sy-uname написал(а):
Long написал(а):
Проблемы нет, вопрос интересен с точки зрения дополнительных возможностей. Вы не могли бы привести примеры использования?

Никаких дополнительных возможностей.

Был слегка не прав - основная и, возможно, единственная дополнительная возможность - это в комбинации использования create data и ref to data для одновременного хранения в таблице совершенно различных по типу объектов.

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


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Long написал(а):
Если не секрет, позвольте узнать, как Вы посмотрели область памяти?


Самописным FM. Получаете объем памяти до и после исследуемого
кода.

Цитата:
FUNCTION ZE_GET_OWN_MEM_USE.
*"----------------------------------------------------------------------
*"*"Local interface:
*" EXPORTING
*" REFERENCE(P_MEM) TYPE I
*" EXCEPTIONS
*" ERROR
*"----------------------------------------------------------------------

DATA: lt_info TYPE TABLE OF WPTOTLINFO WITH HEADER LINE.
DATA: l_wpno LIKE WPINFO-WP_NO,
l_wppid LIKE WPINFO-WP_PID.

CLEAR p_mem.

CALL FUNCTION 'TH_GET_OWN_WP_NO'
IMPORTING
WP_PID = l_wppid
WP_NO = l_wpno.

CALL FUNCTION 'STUM_WP_SERVER_ACTIVITY'
TABLES
WP_INFO = lt_info
EXCEPTIONS
ARGUMENT_ERROR = 1
SEND_ERROR = 2.

IF NOT sy-subrc IS INITIAL.
RAISE ERROR.
ENDIF.
DELETE lt_info WHERE wp_pid NE l_wppid.

LOOP AT lt_info.
ADD lt_info-memsum TO p_mem.
ENDLOOP.

ENDFUNCTION.


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

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Long написал(а):
Lars написал:

О дополнительных возможностях, тут может быть, и не приходится говорить, скорее об удобстве.

В классах это хранеие инстанций, привязка объектов.
В "обычной жизни"... Можно использовать таблицу ссылок во вложенных внутренних таблицах, скажем, для хранения или правки исходников и значений в той же внутренней таблице, дыба не морочится при исправлении в двух местах ... ну и т.д. :)

В моем случае, хотелось просто попробовать сделать матрицу - таблицу таблиц.


ну да, реально ...
Например делала такую задачу: надо было в произвольных пользовательских таблицах изменить произвольные данные (чтобы скрыть истинные) по сотрудникам.
Вот тут я такуюштуку и прменил. Создал вн. таблички, присвоил их указатели в таблицу с ключом - пользователь. И соответственно обработал ...


Последний раз редактировалось Lars Вт, июл 03 2007, 13:26, всего редактировалось 1 раз.

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

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Long написал(а):
В моем случае, хотелось просто попробовать сделать матрицу - таблицу таблиц.


Для таблицы таблиц достаточно более простой конструкции:
Code:
types: t1 type standard table of ddtype
     , t2 type standard table of t1.

t2 - таблица таблиц.

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


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

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
vga написал(а):
Кстати, провел небольшой эксперимент, заключив код, приведенный sy-uname в подпрограмму. Хотелось проверить, будет ли ABAP автоматом освобождать память, присвоенную указателю.
Так вот, абап показал себя достойным приемником языка C, автоматом память он не освобождает.
Поэтому в более сложных вариантах программы нужно сделать loop по таблице и овободить память, присвоенную указателю (field-symbols).

А через какой интервал времени происходили замеры?
Ведь в abap-е освобождением памяти занимается специальный сборщик мусора, который запускается через некоторый промежуток времени. Вот например в самом дебагере есть специальный пункт меню - Start Garbage collector.

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


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
sy-uname написал(а):
А через какой интервал времени происходили замеры?
Ведь в abap-е освобождением памяти занимается специальный сборщик мусора, который запускается через некоторый промежуток времени. Вот например в самом дебагере есть специальный пункт меню - Start Garbage collector.


Запустил еще раз в трех вариантах.
1) без промежутка
2) промежуток 10 мин
3) с запуском Garbage collector.

результат один, что такая память автоматом не вычистилась. Вообще это достаточно интеллектуальная штука - сборщик мусора.


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

Зарегистрирован:
Вс, ноя 12 2006, 23:53
Сообщения: 40
Откуда: Moscow
sy-uname написал(а):
Long написал(а):
В моем случае, хотелось просто попробовать сделать матрицу - таблицу таблиц.


Для таблицы таблиц достаточно более простой конструкции:
Code:
types: t1 type standard table of ddtype
     , t2 type standard table of t1.

t2 - таблица таблиц.

Я с Вами полностью согласен. Тут еще поигрался с динамическим созданием таблиц, и вот что вышло:

Code:
DATA: BEGIN OF gt_data_ref OCCURS 0,
        row_ref TYPE REF TO data,
      END OF gt_data_ref.

DATA : BEGIN OF gt_data_key_ref OCCURS 0,
        tbl_ref TYPE REF TO data,
        key(20),
       END OF gt_data_key_ref.
DATA:
        lt_row_ref            LIKE TABLE OF gt_data_ref WITH HEADER LINE,
        lt_tbl_ref            LIKE TABLE OF gt_data_key_ref WITH HEADER LINE,
        ls_row_ref            LIKE LINE OF gt_data_ref.


DATA: BEGIN OF lt_data OCCURS 0,
        xxx TYPE i,
        yyyy(5),
      END OF lt_data.

FIELD-SYMBOLS: <fs_row> LIKE LINE OF lt_data,
               <fs_ref> LIKE gt_data_ref,
               <fs_tbl> TYPE STANDARD TABLE.
......
......
......
LOOP AT lt_data ASSIGNING <fs_row>  .

  READ TABLE lt_tbl_ref WITH KEY key = <fs_row>-yyyy.
  CLEAR ls_row_ref.
  IF sy-subrc <> 0.
    CREATE DATA lt_tbl_ref-tbl_ref LIKE TABLE OF gt_data_ref.
    lt_tbl_ref-key = <fs_row>-yyyy.
    APPEND lt_tbl_ref.
  ENDIF.

  ASSIGN lt_tbl_ref-tbl_ref->* TO <fs_tbl>.
  GET REFERENCE OF <fs_row> INTO ls_row_ref-row_ref.
  APPEND ls_row_ref TO <fs_tbl>.

ENDLOOP.

Создание MAP, где по ключу YYYY можно вытащить указатели на строки в таблице lt_data.
Буду очень рад конструктивной критике.


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Long написал(а):
Создание MAP, где по ключу YYYY можно вытащить указатели на строки в таблице lt_data.


Могу заблуждаться, но помоему вы учились на язык С++ и поэтому мыслите понятиями этого языка. Мне кажется в ABAP-е это можно сделать проще. Сформулируйте задачу ;-)

PS: Как то на языке вертится: "Забудьте все то, чему вас учили в школе". ABAP-ер, который будет разбираться после вас в коде, много о Вас добрых слов скажет.


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

Зарегистрирован:
Вс, ноя 12 2006, 23:53
Сообщения: 40
Откуда: Moscow
vga написал(а):
Могу заблуждаться, но помоему вы учились на язык С++ и поэтому мыслите понятиями этого языка. Мне кажется в ABAP-е это можно сделать проще. Сформулируйте задачу ;-)

Задача - поиграться с возможностями работы с указателями и ссылками в АВАРе :D . А в приведенном мною премере, я хотел получить структуру данных, позволяющуюю передавать набор указателей на строчки внутренней таблицы( чтобы не приходилось копировать записи, при этом модификация данных не требовала бы операцию поиска по первоначальной таблице - lt_data ).


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Поиграться, конечно, завсегда полезно. ;-) Но в реальной жизни есть SORTED, HASHED tables или бинарный поиск по ключу.


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

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Long написал(а):
... позволяющуюю передавать набор указателей на строчки внутренней таблицы( чтобы не приходилось копировать записи, при этом модификация данных не требовала бы операцию поиска по первоначальной таблице - lt_data ).
Опасное это занятие - сортировка, вставка записей и sy-subrc = 4 при попытке определить указатель на объект гарантирован.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 03 2007, 15:36 
Ассистент
Ассистент

Зарегистрирован:
Вс, ноя 12 2006, 23:53
Сообщения: 40
Откуда: Moscow
sy-uname написал(а):
Опасное это занятие - сортировка, вставка записей и sy-subrc = 4 при попытке определить указатель на объект гарантирован.

Моему любопыству не видно конца :). Насколько я полагал, внутреняя стандартная таблица в ABAP - связный список с указателем на адрес - начало структуры. Разве в этом случае нам не все равно на сортировку и вставку новых строк?


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Long написал(а):
Насколько я полагал, внутреняя стандартная таблица в ABAP - связный список с указателем на адрес - начало структуры.


Судя по всему не связный список, потому что приращение таблицы идет по 8К, а не на длину вставляемой строки.


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

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
sy-uname написал(а):
Long написал(а):
... позволяющуюю передавать набор указателей на строчки внутренней таблицы( чтобы не приходилось копировать записи, при этом модификация данных не требовала бы операцию поиска по первоначальной таблице - lt_data ).
Опасное это занятие - сортировка, вставка записей и sy-subrc = 4 при попытке определить указатель на объект гарантирован.


Мне кажется, все не так мрачно :)
На что может повлиять сортировка исходной таблицы ? При удалении из исходной таблицы освободится и ссылка таблице, куда она включена, тоесть is not bound.
Хотя, безусловно подводные камни есть и преодалевать их придется.


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

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


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

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


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

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