Posted: Wed Sep 26, 2012 11:56 am Post subject: Скрыть нулевые записи
Небольшая проблема... Нужно скрыть нулевые записи, если установлена галочка на P_NULL. Скрывает, но не все записи. Вопрос: может ли дело быть в операторе CONTINUE? Или в чем-то другом.
Code:
select...
....
IF P_NULL IS NOT INITIAL
AND ITAB-SUM_NVR = 0
AND ITAB-SUM_VVR = 0
AND ITAB-SUM_PR = 0
AND ITAB-SUM_NU = 0
AND ITAB-SUM_BU = 0
AND ITAB-SUM_S = 0
AND ITAB-SUM_E = 0.
CONTINUE.
ENDIF.
....
endselect.
Как-то вырвано из контекста... Что значит скрыть? В смысле убрать из выборки (как я вижу, тут select-endselect).
Может нужно было использовать логическое "или" вместо "и" в условии?
вырвано из контекста лишь потому, что особой привязки к остальному коду нет. Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки. Строки в которых значения по нулям. А операция "или" здесь не подойдет. Потому что только при нулевых значениях всех ячеек нужно скрыть.
ну вот:
A|B|C|D|E
0|7 |5|6 |0
0|0 |0|0 |0 - Вот эту строку надо скрыть: не показывать.
Как-то вырвано из контекста... Что значит скрыть? В смысле убрать из выборки (как я вижу, тут select-endselect).
Может нужно было использовать логическое "или" вместо "и" в условии?
вырвано из контекста лишь потому, что особой привязки к остальному коду нет. Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки. Строки в которых значения по нулям. А операция "или" здесь не подойдет. Потому что только при нулевых значениях всех ячеек нужно скрыть.
ну вот:
A|B|C|D|E
0|7 |5|6 |0
0|0 |0|0 |0 - Вот эту строку надо скрыть: не показывать.
Может проще удалить по условию из внутренней таблицы. Посмотрите оператор DELETE
Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки.
А Вы тут ничего не показываете. Вы тут что-то выбираете, судя по select. Откуда не понятно, что за ITAB - не понятно. Судя по Continue, у Вас там еще loop какой-то. И что Вы там делаете с тем, что выбрали, тоже не понятно.
Приводите весь контекст. Телепаты в отпуске.
Самое простое решение тут (ENDSELECT зло):
Code:
IF P_NULL IS INITIAL.
SELECT ...
WHERE ...
.
ELSE.
SELECT ...
WHERE ...
AND SUM_NVR ne 0
AND SUM_VVR ne 0
AND SUM_PR ne 0
AND SUM_NU ne 0
AND SUM_BU ne 0
AND SUM_S ne 0
AND SUM_E ne 0
.
Age: 37 Joined: 18 Jan 2008 Posts: 71 Location: Tashkent-Astana-Moscow
Posted: Thu Sep 27, 2012 10:21 am Post subject:
alezhu wrote:
Quote:
Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки.
А Вы тут ничего не показываете. Вы тут что-то выбираете, судя по select. Откуда не понятно, что за ITAB - не понятно. Судя по Continue, у Вас там еще loop какой-то. И что Вы там делаете с тем, что выбрали, тоже не понятно.
Приводите весь контекст. Телепаты в отпуске.
Самое простое решение тут (ENDSELECT зло):
Code:
IF P_NULL IS INITIAL.
SELECT ...
WHERE ...
.
ELSE.
SELECT ...
WHERE ...
AND SUM_NVR ne 0
AND SUM_VVR ne 0
AND SUM_PR ne 0
AND SUM_NU ne 0
AND SUM_BU ne 0
AND SUM_S ne 0
AND SUM_E ne 0
.
off: я бы не был так категоричен насчет ENDSELECT. Иногда можно и использовать особенно с дополнением UP TO 1 ROWS _________________ Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки.
А Вы тут ничего не показываете. Вы тут что-то выбираете, судя по select. Откуда не понятно, что за ITAB - не понятно. Судя по Continue, у Вас там еще loop какой-то. И что Вы там делаете с тем, что выбрали, тоже не понятно.
Приводите весь контекст. Телепаты в отпуске.
Самое простое решение тут (ENDSELECT зло):
Code:
IF P_NULL IS INITIAL.
SELECT ...
WHERE ...
.
ELSE.
SELECT ...
WHERE ...
AND SUM_NVR ne 0
AND SUM_VVR ne 0
AND SUM_PR ne 0
AND SUM_NU ne 0
AND SUM_BU ne 0
AND SUM_S ne 0
AND SUM_E ne 0
.
off: я бы не был так категоричен насчет ENDSELECT. Иногда можно и использовать особенно с дополнением UP TO 1 ROWS
К случаю который здесь описан, это дополнение не подойдет, а так, да, бывает где надо применить UP TO 1 ROWS
В itab осуществляется выборка из таблицы НУ. производятся расчеты по многим полям.
Continue используется в циклах. Loop, select, while и пр. Он работает. Только не все записи скрывает. Какие-то скрывает, какие-то оставляет.
Возможно, что нужно сделать новый цикл по ITAB. Сейчас так и попробую и еще delete попробую
я бы не был так категоричен насчет ENDSELECT. Иногда можно и использовать особенно с дополнением UP TO 1 ROWS
можно. но зачем? если нужно выбрать 1 запись в таблицу это можно сделать с UP TO 1 ROW без ENDSELECT. Если ту же запись выбрать в структуру - есть SELECT SINGLE. Есть нужна проверка на существование - тот же SELECT SINGLE или COUNT(*).
ENDSELECT располагает к написанию проверок внутри запроса, что не есть хорошо, ибо увеличивает время соединения с БД.
Проверки нужно включать в WHERE сразу. Либо, если первое невозможно, выбирать без них во внутреннюю таблицу и выкидывать уже из нее после выборки.
Мне как-то сразу вбили, что ENDSELECT - это плохо, и за все время в абапе у меня не было случая где бы он понадобился.
В itab осуществляется выборка из таблицы НУ. производятся расчеты по многим полям.
Continue используется в циклах. Loop, select, while и пр. Он работает. Только не все записи скрывает. Какие-то скрывает, какие-то оставляет.
Возможно, что нужно сделать новый цикл по ITAB. Сейчас так и попробую и еще delete попробую
Зачем новый цикл, как тут правильно написали, или убираете записи на момент выбора из БД, или уже из внутренней таблицы, оператор DELETE как раз подойдет
З.Ы. Ну если уже есть цикл по таблице ITAB, то убирайте в нем
Селекты убирать не хочется. Понимаю, что есть более оптимизированный вариант. Но пока проблема более или менее решилась так:
Code:
IF P_NULL IS NOT INITIAL.
delete itab where
SUM_NVR = 0
AND SUM_VVR = 0
AND SUM_PR = 0
AND SUM_NU = 0
AND SUM_BU = 0
AND SUM_S = 0
AND SUM_E = 0.
"CONTINUE.
"modify itab.
ENDIF.
Age: 37 Joined: 18 Jan 2008 Posts: 71 Location: Tashkent-Astana-Moscow
Posted: Thu Sep 27, 2012 12:02 pm Post subject:
и опять off: to bimit : да поэтому и добавил дополнение off: to alezhu : 1) с каких пор UP TO N ROWS используется вне цикла ( без ENDSELECT)
2) select single не всегда хорош , в частности когда явно полный ключ нельзя указать
3) count тут вообще не причем. имелось ввиду такая конструкция необходима например для проверки есть ли вообще запись по указанному ключу либо выбрать первую найденную запись (но опять опять же когда нет возможности указать полный ключ) _________________ Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.