Условия при каких можно использовать READ TABLE?

Автор Паганель, Грудень 16, 2008, 05:35:40 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Паганель

хочу использовать что-то типа READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks and matnr = l_items-matnr

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

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

Какие подводные камни в такой конструкции ?

Паганель

Первое: ее потом нельзя использовать в 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.
)

Dmitriy

Подводных камней нет. Без UNIQUE ее просто нужно отсортировать по читаемому ключу. Т.е SORT уже готовой, либо ORDER BY в выборке + то, что ты в хелпе прочитал. 

Dmitriy

Цитата: Паганель від Грудень 16, 2008, 05:37:32 ПП
Первое: ее потом нельзя использовать в 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, если она дальше не нужна и кол-во записей велико.


Паганель

что то не пойму с хелпа , как то читать ?

READ TABLE gtq_outtab WITH TABLE KEY werks = resitems-werks matnr = resitems-matnr.
не хавает ....

Dmitriy

Цитата: Паганель від Грудень 16, 2008, 05:44:12 ПП
а refresh gt_outtab <> FREE GT_OUTTAB
Оператор REFRESH просто очищает внутреннюю табличку, но не освобождает оперативную память.


Dmitriy

#8
Изменять сообщения не стал, просто подправлюсь.
WITH UNIQUE KEY означает, что во внутренней таблице не может быть 2-х и более записей с одним ключем и только, но не факт, что данные отсортированы по нему. Можно объявить как ... SORTED TABLE WITH UNIQUE KEY werks matnr, если хочется, чтобы комбинация завод-материал была уникальна. Про сортировку - выше.
2 Паганель: а что за задача? 

Паганель

#9
Цитата: Dmitriy від Грудень 16, 2008, 08:29:59 ПП
Изменять сообщения не стал, просто подправлюсь.
WITH UNIQUE KEY означает, что во внутренней таблице не может быть 2-х и более записей с одним ключем и только, но не факт, что данные отсортированы по нему. Можно объявить как ... SORTED TABLE WITH UNIQUE KEY werks matnr, если хочется, чтобы комбинация завод-материал была уникальна.

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




Dmitriy

#10
ЦитатаТ.е. главное отсортировать ? если нету уникальности, то выберется первая запись?
Главное и необходимое условие - таблица должна быть отсортирована по ключу, который ты используешь в операторе READ. А про уникальность: вот я и спросил про задачу, зачем тебе данные с уникальной комбинацией завод-материал? Если нет уникальности, то при нескольких одинаковых записях (завод-материал) не факт, что первую прочитает.

Паганель

#11
Цитата: Dmitriy від Грудень 16, 2008, 08:41:34 ПП
Главное и необходимое условие - таблица должна быть отсортирована по ключу, который ты используешь в операторе READ. А про уникальность: вот я и спросил про задачу, зачем тебе данные с уникальной комбинацией завод-материал?

да я просто в этой табличке просумировал данные приходов по Заводу .....
И уникальность как бы не нужна, только как то не подумал, что действительно тут данные уникальны ....

Dmitriy

Цитатада я просто в этой табличке просумировал данные приходов по Заводу .....
А тогда понятно, приход каждого материала. Рекомендую оператор SORT в этом случае, тогда не нужно заморачиваться ни при объявлении вн. таблицы (обычная), следовательно, и при передаче ее в ALV Grid (ее же и выводить, не ругнется). Все просто.

Паганель

я так понял, что мне достаточно отсортировать и вперед, отлично ... есть некоторые нюансы, ну тут как бы расберусь ...

Dmitriy

Да, все верно, только с оператором READ не забывать BINARY SEARCH, ну да об этом уже писали. ;)

Паганель

Цитата: Dmitriy від Грудень 16, 2008, 09:04:39 ПП
Да, все верно, только с оператором READ не забывать BINARY SEARCH, ну да об этом уже писали. ;)

Ссори, а где это про  BINARY SEARCH писали ? шо-то не находит  поиск ...

Dmitriy

Цитата: Паганель від Грудень 16, 2008, 09:17:30 ПП
Ссори, а где это про  BINARY SEARCH писали ? шо-то не находит  поиск ...
Немного в теме про оптимизацию. Смысл в том, что с BINARY SEARCH оператор READ работает быстрее, только внутренняя табличка должна быть отсортирована по ключу, в данном случае werks matnr.

Паганель

так и подумал, сейчас перечитаю пост про оптимизацию

Спасибо

Паганель

а как считывать:
READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks and matnr = l_items-matnr
не катит ......

Паганель

Ссори, сам нашел
READ TABLE rt_outtab WITH KEY matnr = gt_vw_prod-matnr
                                     werks = gt_in_move-werks.

Uukrul

Цитата: Паганель від Грудень 17, 2008, 03:38:24 ПП
Ссори, сам нашел
READ TABLE rt_outtab WITH KEY matnr = gt_vw_prod-matnr
                                     werks = gt_in_move-werks.
МаладЭц... таки проблема что AND не катит и операция только сравнения, а всякие больше/меньше к сожалению не катят.

№1

Цитата: Uukrul від Грудень 17, 2008, 03:50:10 ПП
МаладЭц... таки проблема что AND не катит и операция только сравнения, а всякие больше/меньше к сожалению не катят.
А в новой версии можно уже http://www.vadoid.com/sap/teched08/COMP209_v2.pdf
Мой блог

Uukrul

Цитата: № 1 від Грудень 17, 2008, 05:09:12 ПП
А в новой версии можно уже http://www.vadoid.com/sap/teched08/COMP209_v2.pdf
Ну у него 4.7 насколько я помню... но что в новой это уже наконец работает, это хорошо... а то LOOP-ами было ну напряжно крутить...

Dmitriy

#23
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.

Паганель

Спасибо большое за помощь ...

Толко что сказал Дмитрию что в текущей задаче не прийдется использовать сию конструкцию .... а тут оказалось что всетаки
надо .....

Паганель

Для себя что бы потом сновая не искать, как пользоватся:

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.         

Uukrul

Цитата: Паганель від Грудень 18, 2008, 02:40:58 ДП
Для себя что бы потом сновая не искать, как пользоватся:

  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?.


NachDenken

Привет, народу
вот у меня тоже как раз выборка bseg/bset
и сделав выборку по bset во внут табличку (созданную с типом таблица с ключами)
и выполнив поиск по ней с использование бинари сертч,
удалось добиться ускорения аж на 5 -10 %
ну не знаю...
мож у меня в консерватории нужно поправить :)

Dmitriy

Цитата: Паганель від Грудень 18, 2008, 04:28:24 ПП
Второй раз намекают на это, что-то не пойму что не так
Посмотри код, выше скинул же, только до цикла сортируй. :)

Паганель

спасибо, сразу не заметил  :)
ЦитатаSORT gt_outtab BY werks matnr.
READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks matnr = l_items-matnr BINARY SERCH.

Uukrul

Цитата: NachDenken від Грудень 18, 2008, 04:44:05 ПП
и выполнив поиск по ней с использование бинари сертч,
удалось добиться ускорения аж на 5 -10 %
Ну так 10% это уже не мало...  как говорится там 10 тут 5, глядишь и стало пошустрее... или оптимизация это когда 100-200%? Так это уже называется переписывание кода!

Паганель

а BINARY SERCH кроме скорости еще что то дает, хотя глупый вопрос конечно, не думаю что точность ...

Uukrul

Цитата: Паганель від Грудень 18, 2008, 11:14:06 ПП
а BINARY SERCH кроме скорости еще что то дает, хотя глупый вопрос конечно, не думаю что точность ...
В  смысле что-то дает? Вопрос не корректен, это типа а педаль газа в машине что-то кроме увеличения скорости дает? Ответ, дает больший расход бензина и увеличение скорости, чего мы и добиваемся, программа не только должна правильно считать, но и считать как можно быстрее  ;) вот бинарный поиск и позволяет получить ускорение в 5% - 10%, как по мне это не мало, особенно если поиск вызывается в каком-нибудь цикле пару тысяч раз.

Паганель

Цитата: Uukrul від Грудень 18, 2008, 11:49:22 ПП
В  смысле что-то дает? Вопрос не корректен, это типа а педаль газа в машине что-то кроме увеличения скорости дает? Ответ, дает больший расход бензина и увеличение скорости, чего мы и добиваемся, программа не только должна правильно считать, но и считать как можно быстрее  ;) вот бинарный поиск и позволяет получить ускорение в 5% - 10%, как по мне это не мало, особенно если поиск вызывается в каком-нибудь цикле пару тысяч раз.

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

SMF spam blocked by CleanTalk