Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE38 - ABAP Редактор => Тема начата: Паганель от Декабрь 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 ? Вроде не дает ....
Какие подводные камни в такой конструкции ?
-
Первое: ее потом нельзя использовать в 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.
)
-
Подводных камней нет. Без UNIQUE ее просто нужно отсортировать по читаемому ключу. Т.е SORT уже готовой, либо ORDER BY в выборке + то, что ты в хелпе прочитал.
-
Первое: ее потом нельзя использовать в 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, если она дальше не нужна и кол-во записей велико.
-
а refresh gt_outtab <> FREE GT_OUTTAB
-
что то не пойму с хелпа , как то читать ?
READ TABLE gtq_outtab WITH TABLE KEY werks = resitems-werks matnr = resitems-matnr.
не хавает ....
-
а refresh gt_outtab <> FREE GT_OUTTAB
Оператор REFRESH просто очищает внутреннюю табличку, но не освобождает оперативную память.
-
спасибо
-
Изменять сообщения не стал, просто подправлюсь.
WITH UNIQUE KEY означает, что во внутренней таблице не может быть 2-х и более записей с одним ключем и только, но не факт, что данные отсортированы по нему. Можно объявить как ... SORTED TABLE WITH UNIQUE KEY werks matnr, если хочется, чтобы комбинация завод-материал была уникальна. Про сортировку - выше.
2 Паганель: а что за задача?
-
Изменять сообщения не стал, просто подправлюсь.
WITH UNIQUE KEY означает, что во внутренней таблице не может быть 2-х и более записей с одним ключем и только, но не факт, что данные отсортированы по нему. Можно объявить как ... SORTED TABLE WITH UNIQUE KEY werks matnr, если хочется, чтобы комбинация завод-материал была уникальна.
Т.е. главное отсортировать ? если нету уникальности, то выберется первая запись ?
-
Т.е. главное отсортировать ? если нету уникальности, то выберется первая запись?
Главное и необходимое условие - таблица должна быть отсортирована по ключу, который ты используешь в операторе READ. А про уникальность: вот я и спросил про задачу, зачем тебе данные с уникальной комбинацией завод-материал? Если нет уникальности, то при нескольких одинаковых записях (завод-материал) не факт, что первую прочитает.
-
Главное и необходимое условие - таблица должна быть отсортирована по ключу, который ты используешь в операторе READ. А про уникальность: вот я и спросил про задачу, зачем тебе данные с уникальной комбинацией завод-материал?
да я просто в этой табличке просумировал данные приходов по Заводу .....
И уникальность как бы не нужна, только как то не подумал, что действительно тут данные уникальны ....
-
да я просто в этой табличке просумировал данные приходов по Заводу .....
А тогда понятно, приход каждого материала. Рекомендую оператор SORT в этом случае, тогда не нужно заморачиваться ни при объявлении вн. таблицы (обычная), следовательно, и при передаче ее в ALV Grid (ее же и выводить, не ругнется). Все просто.
-
я так понял, что мне достаточно отсортировать и вперед, отлично ... есть некоторые нюансы, ну тут как бы расберусь ...
-
Да, все верно, только с оператором READ не забывать BINARY SEARCH, ну да об этом уже писали. ;)
-
Да, все верно, только с оператором READ не забывать BINARY SEARCH, ну да об этом уже писали. ;)
Ссори, а где это про BINARY SEARCH писали ? шо-то не находит поиск ...
-
Ссори, а где это про 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.
-
Ссори, сам нашел
READ TABLE rt_outtab WITH KEY matnr = gt_vw_prod-matnr
werks = gt_in_move-werks.
МаладЭц... таки проблема что AND не катит и операция только сравнения, а всякие больше/меньше к сожалению не катят.
-
МаладЭц... таки проблема что AND не катит и операция только сравнения, а всякие больше/меньше к сожалению не катят.
А в новой версии можно уже http://www.vadoid.com/sap/teched08/COMP209_v2.pdf (http://www.vadoid.com/sap/teched08/COMP209_v2.pdf)
-
А в новой версии можно уже http://www.vadoid.com/sap/teched08/COMP209_v2.pdf (http://www.vadoid.com/sap/teched08/COMP209_v2.pdf)
Ну у него 4.7 насколько я помню... но что в новой это уже наконец работает, это хорошо... а то LOOP-ами было ну напряжно крутить...
-
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.
-
Для себя что бы потом сновая не искать, как пользоватся:
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?.
-
Второй раз намекают на это, что-то не пойму что не так
-
Привет, народу
вот у меня тоже как раз выборка bseg/bset
и сделав выборку по bset во внут табличку (созданную с типом таблица с ключами)
и выполнив поиск по ней с использование бинари сертч,
удалось добиться ускорения аж на 5 -10 %
ну не знаю...
мож у меня в консерватории нужно поправить :)
-
Второй раз намекают на это, что-то не пойму что не так
Посмотри код, выше скинул же, только до цикла сортируй. :)
-
спасибо, сразу не заметил :)
SORT gt_outtab BY werks matnr.
READ TABLE gt_outtab WITH TABLE KEY werks = l_items-werks matnr = l_items-matnr BINARY SERCH.
-
и выполнив поиск по ней с использование бинари сертч,
удалось добиться ускорения аж на 5 -10 %
Ну так 10% это уже не мало... как говорится там 10 тут 5, глядишь и стало пошустрее... или оптимизация это когда 100-200%? Так это уже называется переписывание кода!
-
а BINARY SERCH кроме скорости еще что то дает, хотя глупый вопрос конечно, не думаю что точность ...
-
а BINARY SERCH кроме скорости еще что то дает, хотя глупый вопрос конечно, не думаю что точность ...
В смысле что-то дает? Вопрос не корректен, это типа а педаль газа в машине что-то кроме увеличения скорости дает? Ответ, дает больший расход бензина и увеличение скорости, чего мы и добиваемся, программа не только должна правильно считать, но и считать как можно быстрее ;) вот бинарный поиск и позволяет получить ускорение в 5% - 10%, как по мне это не мало, особенно если поиск вызывается в каком-нибудь цикле пару тысяч раз.
-
В смысле что-то дает? Вопрос не корректен, это типа а педаль газа в машине что-то кроме увеличения скорости дает? Ответ, дает больший расход бензина и увеличение скорости, чего мы и добиваемся, программа не только должна правильно считать, но и считать как можно быстрее ;) вот бинарный поиск и позволяет получить ускорение в 5% - 10%, как по мне это не мало, особенно если поиск вызывается в каком-нибудь цикле пару тысяч раз.
Да Вопрос не корректен, просто тестирую, вижу что суммы не сходятся ...... грешным делом подумал на BINARY SERCH, потом правда нашел.