Текущее время: Вс, июл 27 2025, 06:33

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Проверьте себя
СообщениеДобавлено: Ср, апр 20 2005, 09:52 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Пришла в голову забавная задачка.
Code:
report ZEF_TEST5.

TYPES:
  BEGIN OF ts_labst,
    matnr TYPE matnr,
    werks TYPE werks_d,
    lgort TYPE lgort_d,
    labst TYPE labst,
    meins TYPE meins,
  END OF ts_labst,
  tt_labst TYPE TABLE OF ts_labst WITH KEY matnr werks lgort
.
DATA:
  gt_labst      TYPE tt_labst,
  gt_labst_copy TYPE tt_labst
.

SELECT mard~matnr werks lgort labst meins
  INTO TABLE gt_labst
  UP TO 1000 ROWS
  FROM mard INNER JOIN mara
    ON mard~matnr = mara~matnr.

BREAK-POINT. "#1

gt_labst_copy = gt_labst.

BREAK-POINT. "#2

DELETE gt_labst_copy WHERE matnr IS NOT INITIAL.

BREAK-POINT. "#3


Вопрос следующий: в какой точке останова расход распределённой памяти, занимаемой программой, будет наибольшим?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 11:47 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
на самом деле, это зависит от алгоритмов работы конкретного ядра, формы внутреннего представления данных и пр.
предположим, что в последней.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 12:53 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
:lol: ни в какой :lol:
просто по причине синтаксической ошибки в коде:
DELETE gt_labst_copy WHERE matnr IS NOT INITIAL.
следует заменить на
DELETE gt_labst_copy WHERE NOT matnr IS initial.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 13:04 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
nicky555 написал:
:lol: ни в какой :lol:
просто по причине синтаксической ошибки в коде:
DELETE gt_labst_copy WHERE matnr IS NOT INITIAL.
следует заменить на
DELETE gt_labst_copy WHERE NOT matnr IS initial.


Обижаете... Нет здесь ошибки в коде. Во всяком случае в 4.7.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 13:14 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
старею... :) не обижайтесь
чисто теоретически - во второй и третьей точках объем занимаемой памяти вроде бы должен быть одинаков и максимален.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 15:06 
Гость
думаю, в 3, где он равен 2 + объем памяти на выполнение удаления


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 15:20 
Гость
Кстати Nikki555 зря раньше времени к пенсии готовитесь :wink:
В 46с ошибка однако....


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 15:45 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
В "#1 объем = V1 + const.
В "#2 объем = 2*V1 + const.
В "#3 объем = 2*V1 - V(удаленных строк) + const = V1 + const.
Следовательно в #2
Или нет ???

_________________
Волю в кулак, мышцы в узду, работай себе и не ахай!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 20 2005, 15:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
ну, батенька, как же так? :wink:
а как же работа OCCURS? - ведь именно здесь выделяется память по мере заполнения таблицы с размером указанного кусочка, а вот очистить память можно только "удалив" всю таблицу целиком...
так что "минус число удаленных записей" не пойдет - память для них оккупирована и сдавать свои позиции до оператора FREE itab не намерена :P

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 21 2005, 07:05 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Цитата:
ну, батенька, как же так?
а как же работа OCCURS? - ведь именно здесь выделяется память по мере заполнения таблицы с размером указанного кусочка, а вот очистить память можно только "удалив" всю таблицу целиком...
так что "минус число удаленных записей" не пойдет - память для них оккупирована и сдавать свои позиции до оператора FREE itab не намерена


Да
Все верно

_________________
Волю в кулак, мышцы в узду, работай себе и не ахай!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 21 2005, 08:05 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan
Ф написал(а):
Кстати Nikki555 зря раньше времени к пенсии готовитесь :wink:
В 46с ошибка однако....


Это от версии ядра системы зависит, в более поздних, кажись с 6.2* (абаперы/системщики меня поправят если вру) возможнf и такая запись как:
DELETE gt_labst_copy WHERE matnr IS NOT INITIAL


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 21 2005, 18:16 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Будем считать, что все, кто хотел, себя проверили.
Правильный ответ: #3.
Дело в том, что переменные gt_labst и gt_labst_copy являются указателями на объект памяти (memory object), который в нашем случае представлен телом внутренней таблицы.
При операции
Code:
gt_labst_copy = gt_labst.

копирования объктов памяти не происходит, просто указателей на него становится на один больше, поэтому ни распределённая, ни используемая память не расходуется.
А вот при операции (точнее, непосредственно перед ней)
Code:
DELETE gt_labst_copy WHERE matnr IS NOT INITIAL.

происходит копирование объектов памяти, поскольку через одну из ссылок модифицируется сам объект памяти. Как справедливо заметил nicky555, при операции удаления записей из внутренней таблицы освобождения распределённой памяти не происходит. Следовательно, объём занимаемой распределённой памяти удваивается.
Подробнее об этом можно почитать здесь
https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/webas/Save%20Time%20and%20Effort%20with%20ABAP%20Memory%20Inspector.pdf

Воочию убедиться в вышесказанном можно, проследовав в дебаггере на каждой из точек останова по следующему пути меню: Перейти к - Просмотр статусов - Занимаемая память. Необходимая информация находится на закладке Потребл. памяти - ранг. списки.

С вашего позволения приведу ещё одну задачку
Code:
REPORT  zef_test3 NO STANDARD PAGE HEADING.

PERFORM get_data.
PERFORM write_data.

*&--------------------------------------------------------------------*
*&      Form  get_data
*&--------------------------------------------------------------------*
FORM get_data.
  TABLES:
    mard
  .
  SELECT matnr
    INTO CORRESPONDING FIELDS OF mard
    FROM mard
    UP TO 1 ROWS.
  ENDSELECT.
ENDFORM.                    "get_data

*&--------------------------------------------------------------------*
*&      Form  write_data
*&--------------------------------------------------------------------*
FORM write_data.
  WRITE mard-matnr.
ENDFORM.                    "write_data

Вопрос: сколько строк выведет программа на экран при условии, что в таблице MARD 1000 записей?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, апр 22 2005, 05:29 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, апр 06 2005, 06:46
Сообщения: 40
Откуда: Омск
EGF написал(а):
Вопрос: сколько строк выведет программа на экран при условии, что в таблице MARD 1000 записей?

Выведется одна пустая строчка (Если это строчкой не считается, то ни одной :) )

_________________
С уважением, Антон


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

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
EGF написал(а):
Правильный ответ: #3.
Дело в том, что переменные gt_labst и gt_labst_copy являются указателями на объект памяти (memory object), который в нашем случае представлен телом внутренней таблицы.
...

Боюсь, с точки зрения системы версии до 4.6С включительно это неверно.
Автор, видимо, путает понятия внутренней таблицы и ссылки на таблицу (field-symbols). То есть, присваивая переменной внутренней таблицы значения первой я делаю только еще одну ссылку на первую таблицу? :roll:
Если следовать вашим рассуждениям, обращаясь к таблице gt_labst_copy я буду удалять записи и в основной таблице? :shock:
В общем, не согласный я... :P

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, апр 22 2005, 15:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Цитата:
Автор, видимо, путает понятия внутренней таблицы и ссылки на таблицу (field-symbols).

Да нет, не путает, вроде это именно так и реализовано (просто от глаз скрыто). Насчет версий спорить не буду.

_________________
С уважением, Сергей Королев


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

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


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

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


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

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