Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => SE38 - ABAP Редактор => Тема начата: Паганель от Декабрь 16, 2008, 05:35:40 pm

Название: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 05:35:40 pm
хочу использовать что-то типа READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks and matnr = l_items-matnr

по хелпу она (табличка) должна быть обьявлена WITH UNIQUE KEY carrid connid (поля)

Достаточно ли это, можно ли без UNIQUE ? Вроде не дает ....

Какие подводные камни в такой конструкции ?
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 05:37:32 pm
Первое: ее потом нельзя использовать в REUSE_ALV_GRID_DISPLAY
("GT_OUTTAB" is not a "STANDARD TABLE". Non-standard tables can only be
passed to IMPORTING, EXPORTING, or CHANGING parameters. parameters.
)
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 05:39:44 pm
Подводных камней нет. Без UNIQUE ее просто нужно отсортировать по читаемому ключу. Т.е SORT уже готовой, либо ORDER BY в выборке + то, что ты в хелпе прочитал. 
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 05:42:50 pm
You are not allowed to view links. Register or Login
Первое: ее потом нельзя использовать в REUSE_ALV_GRID_DISPLAY
("GT_OUTTAB" is not a "STANDARD TABLE". Non-standard tables can only be
passed to IMPORTING, EXPORTING, or CHANGING parameters. parameters.
)
Нужно передавать в стандартную той же структуры, и ее уже в ALV: itab[] = GT_OUTTAB[]. Не забудь почистить: FREE GT_OUTTAB, если она дальше не нужна и кол-во записей велико.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 05:44:12 pm
а refresh gt_outtab <> FREE GT_OUTTAB
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 05:45:43 pm
что то не пойму с хелпа , как то читать ?

READ TABLE gtq_outtab WITH TABLE KEY werks = resitems-werks matnr = resitems-matnr.
не хавает ....
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 05:47:48 pm
You are not allowed to view links. Register or Login
а refresh gt_outtab <> FREE GT_OUTTAB
Оператор REFRESH просто очищает внутреннюю табличку, но не освобождает оперативную память.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 05:49:04 pm
спасибо
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 08:29:59 pm
Изменять сообщения не стал, просто подправлюсь.
WITH UNIQUE KEY означает, что во внутренней таблице не может быть 2-х и более записей с одним ключем и только, но не факт, что данные отсортированы по нему. Можно объявить как ... SORTED TABLE WITH UNIQUE KEY werks matnr, если хочется, чтобы комбинация завод-материал была уникальна. Про сортировку - выше.
2 Паганель: а что за задача? 
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 08:34:55 pm
You are not allowed to view links. Register or Login
Изменять сообщения не стал, просто подправлюсь.
WITH UNIQUE KEY означает, что во внутренней таблице не может быть 2-х и более записей с одним ключем и только, но не факт, что данные отсортированы по нему. Можно объявить как ... SORTED TABLE WITH UNIQUE KEY werks matnr, если хочется, чтобы комбинация завод-материал была уникальна.

Т.е. главное отсортировать ? если нету уникальности, то выберется первая запись ?



Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 08:41:34 pm
Цитировать
Т.е. главное отсортировать ? если нету уникальности, то выберется первая запись?
Главное и необходимое условие - таблица должна быть отсортирована по ключу, который ты используешь в операторе READ. А про уникальность: вот я и спросил про задачу, зачем тебе данные с уникальной комбинацией завод-материал? Если нет уникальности, то при нескольких одинаковых записях (завод-материал) не факт, что первую прочитает.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 08:46:29 pm
You are not allowed to view links. Register or Login
Главное и необходимое условие - таблица должна быть отсортирована по ключу, который ты используешь в операторе READ. А про уникальность: вот я и спросил про задачу, зачем тебе данные с уникальной комбинацией завод-материал?

да я просто в этой табличке просумировал данные приходов по Заводу .....
И уникальность как бы не нужна, только как то не подумал, что действительно тут данные уникальны ....
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 08:56:53 pm
Цитировать
да я просто в этой табличке просумировал данные приходов по Заводу .....
А тогда понятно, приход каждого материала. Рекомендую оператор SORT в этом случае, тогда не нужно заморачиваться ни при объявлении вн. таблицы (обычная), следовательно, и при передаче ее в ALV Grid (ее же и выводить, не ругнется). Все просто.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 09:02:14 pm
я так понял, что мне достаточно отсортировать и вперед, отлично ... есть некоторые нюансы, ну тут как бы расберусь ...
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 09:04:39 pm
Да, все верно, только с оператором READ не забывать BINARY SEARCH, ну да об этом уже писали. ;)
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 09:17:30 pm
You are not allowed to view links. Register or Login
Да, все верно, только с оператором READ не забывать BINARY SEARCH, ну да об этом уже писали. ;)

Ссори, а где это про  BINARY SEARCH писали ? шо-то не находит  поиск ...
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 16, 2008, 09:43:15 pm
You are not allowed to view links. Register or Login
Ссори, а где это про  BINARY SEARCH писали ? шо-то не находит  поиск ...
Немного в теме про оптимизацию. Смысл в том, что с BINARY SEARCH оператор READ работает быстрее, только внутренняя табличка должна быть отсортирована по ключу, в данном случае werks matnr.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 16, 2008, 09:44:55 pm
так и подумал, сейчас перечитаю пост про оптимизацию

Спасибо
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 17, 2008, 03:34:54 pm
а как считывать:
READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks and matnr = l_items-matnr
не катит ......
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 17, 2008, 03:38:24 pm
Ссори, сам нашел
READ TABLE rt_outtab WITH KEY matnr = gt_vw_prod-matnr
                                     werks = gt_in_move-werks.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Uukrul от Декабрь 17, 2008, 03:50:10 pm
You are not allowed to view links. Register or Login
Ссори, сам нашел
READ TABLE rt_outtab WITH KEY matnr = gt_vw_prod-matnr
                                     werks = gt_in_move-werks.
МаладЭц... таки проблема что AND не катит и операция только сравнения, а всякие больше/меньше к сожалению не катят.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: №1 от Декабрь 17, 2008, 05:09:12 pm
You are not allowed to view links. Register or Login
МаладЭц... таки проблема что AND не катит и операция только сравнения, а всякие больше/меньше к сожалению не катят.
А в новой версии можно уже http://www.vadoid.com/sap/teched08/COMP209_v2.pdf (http://www.vadoid.com/sap/teched08/COMP209_v2.pdf)
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Uukrul от Декабрь 17, 2008, 05:15:03 pm
You are not allowed to view links. Register or Login
А в новой версии можно уже http://www.vadoid.com/sap/teched08/COMP209_v2.pdf (http://www.vadoid.com/sap/teched08/COMP209_v2.pdf)
Ну у него 4.7 насколько я помню... но что в новой это уже наконец работает, это хорошо... а то LOOP-ами было ну напряжно крутить...
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 17, 2008, 05:47:20 pm
Код: You are not allowed to view links. Register or Login
SORT gt_outtab BY werks matnr.
READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks matnr = l_items-matnr BINARY SERCH.
Последовательность полей при объявлении gt_outtab в приведенном примере именно werks matnr.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 17, 2008, 09:11:03 pm
Спасибо большое за помощь ...

Толко что сказал Дмитрию что в текущей задаче не прийдется использовать сию конструкцию .... а тут оказалось что всетаки
надо .....
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 18, 2008, 02:40:58 am
Для себя что бы потом сновая не искать, как пользоватся:

Код: You are not allowed to view links. Register or Login
FORM test TABLES   gt_bk_in_move.
  DATA: rt_outtab TYPE STANDARD TABLE OF gs_outtab
        WITH HEADER LINE WITH KEY matnr werks.

  rt_outtab[] = gt_outtab[].

  LOOP AT gt_bk_in_move INTO ls_bk_in_move.
    READ TABLE rt_outtab WITH KEY matnr = ls_bk_in_move-matnr
                                  werks = ls_bk_in_move-werks.
    IF sy-subrc NE 0.
      rt_outtab-matnr  = ls_bk_in_move-matnr.
      rt_outtab-werks  = ls_bk_in_move-werks.
      rt_outtab-pmenge = ls_bk_in_move-menge.
      rt_outtab-pdmbtr = ls_bk_in_move-dmbtr.
      rt_outtab-waers  = ls_bk_in_move-waers.
      rt_outtab-meins  = ls_bk_in_move-meins.
      APPEND rt_outtab.
    ELSE.
      rt_outtab-pmenge = rt_outtab-pmenge + ls_bk_in_move-menge.
      rt_outtab-pdmbtr = rt_outtab-pdmbtr + ls_bk_in_move-dmbtr.
      MODIFY rt_outtab FROM rt_outtab INDEX sy-tabix.
    ENDIF.
  ENDLOOP.

  " ПЕРЕНОС ДАННЫХ
  gt_outtab[] = rt_outtab[].
  FREE rt_outtab[].

ENDFORM.         
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Uukrul от Декабрь 18, 2008, 03:53:07 pm
You are not allowed to view links. Register or Login
Для себя что бы потом сновая не искать, как пользоватся:
Код: You are not allowed to view links. Register or Login
  LOOP AT gt_bk_in_move INTO ls_bk_in_move.
    READ TABLE rt_outtab WITH KEY matnr = ls_bk_in_move-matnr
                                  werks = ls_bk_in_move-werks.
  
А как по поводу BINARY SEARCH?.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 18, 2008, 04:28:24 pm
Второй раз намекают на это, что-то не пойму что не так
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: NachDenken от Декабрь 18, 2008, 04:44:05 pm
Привет, народу
вот у меня тоже как раз выборка bseg/bset
и сделав выборку по bset во внут табличку (созданную с типом таблица с ключами)
и выполнив поиск по ней с использование бинари сертч,
удалось добиться ускорения аж на 5 -10 %
ну не знаю...
мож у меня в консерватории нужно поправить :)
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Dmitriy от Декабрь 18, 2008, 04:50:47 pm
You are not allowed to view links. Register or Login
Второй раз намекают на это, что-то не пойму что не так
Посмотри код, выше скинул же, только до цикла сортируй. :)
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 18, 2008, 04:53:34 pm
спасибо, сразу не заметил  :)
Цитировать
SORT gt_outtab BY werks matnr.
READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks matnr = l_items-matnr BINARY SERCH.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Uukrul от Декабрь 18, 2008, 05:01:47 pm
You are not allowed to view links. Register or Login
и выполнив поиск по ней с использование бинари сертч,
удалось добиться ускорения аж на 5 -10 %
Ну так 10% это уже не мало...  как говорится там 10 тут 5, глядишь и стало пошустрее... или оптимизация это когда 100-200%? Так это уже называется переписывание кода!
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 18, 2008, 11:14:06 pm
а BINARY SERCH кроме скорости еще что то дает, хотя глупый вопрос конечно, не думаю что точность ...
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Uukrul от Декабрь 18, 2008, 11:49:22 pm
You are not allowed to view links. Register or Login
а BINARY SERCH кроме скорости еще что то дает, хотя глупый вопрос конечно, не думаю что точность ...
В  смысле что-то дает? Вопрос не корректен, это типа а педаль газа в машине что-то кроме увеличения скорости дает? Ответ, дает больший расход бензина и увеличение скорости, чего мы и добиваемся, программа не только должна правильно считать, но и считать как можно быстрее  ;) вот бинарный поиск и позволяет получить ускорение в 5% - 10%, как по мне это не мало, особенно если поиск вызывается в каком-нибудь цикле пару тысяч раз.
Название: Re: Условия при каких можно использовать READ TABLE?
Отправлено: Паганель от Декабрь 19, 2008, 12:21:57 pm
You are not allowed to view links. Register or Login
В  смысле что-то дает? Вопрос не корректен, это типа а педаль газа в машине что-то кроме увеличения скорости дает? Ответ, дает больший расход бензина и увеличение скорости, чего мы и добиваемся, программа не только должна правильно считать, но и считать как можно быстрее  ;) вот бинарный поиск и позволяет получить ускорение в 5% - 10%, как по мне это не мало, особенно если поиск вызывается в каком-нибудь цикле пару тысяч раз.

Да Вопрос не корректен, просто тестирую, вижу что суммы не сходятся ...... грешным делом подумал на BINARY SERCH, потом правда нашел.