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

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


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

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


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

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