SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Скрыть нулевые записи


Goto page 1, 2  Next
 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
kolobok
Участник
Участник



Joined: 03 Sep 2012
Posts: 29

PostPosted: Wed Sep 26, 2012 11:56 am    Post subject: Скрыть нулевые записи Reply with quote

Небольшая проблема... Нужно скрыть нулевые записи, если установлена галочка на 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.
Back to top
View user's profile Send private message
flex
Специалист
Специалист



Joined: 02 Feb 2011
Posts: 50

PostPosted: Wed Sep 26, 2012 3:16 pm    Post subject: Reply with quote

Как-то вырвано из контекста... Что значит скрыть? В смысле убрать из выборки (как я вижу, тут select-endselect).

Может нужно было использовать логическое "или" вместо "и" в условии?
Back to top
View user's profile Send private message
kolobok
Участник
Участник



Joined: 03 Sep 2012
Posts: 29

PostPosted: Thu Sep 27, 2012 8:27 am    Post subject: Reply with quote

flex wrote:
Как-то вырвано из контекста... Что значит скрыть? В смысле убрать из выборки (как я вижу, тут select-endselect).

Может нужно было использовать логическое "или" вместо "и" в условии?


вырвано из контекста лишь потому, что особой привязки к остальному коду нет. Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки. Строки в которых значения по нулям. А операция "или" здесь не подойдет. Потому что только при нулевых значениях всех ячеек нужно скрыть.
ну вот:
A|B|C|D|E
0|7 |5|6 |0
0|0 |0|0 |0 - Вот эту строку надо скрыть: не показывать.
Back to top
View user's profile Send private message
bimit
Специалист
Специалист



Joined: 11 Jul 2011
Posts: 56

PostPosted: Thu Sep 27, 2012 8:44 am    Post subject: Reply with quote

kolobok wrote:
flex wrote:
Как-то вырвано из контекста... Что значит скрыть? В смысле убрать из выборки (как я вижу, тут select-endselect).

Может нужно было использовать логическое "или" вместо "и" в условии?


вырвано из контекста лишь потому, что особой привязки к остальному коду нет. Под "скрыть" я подразумеваю скрыть, то есть не показывать нулевые строки. Строки в которых значения по нулям. А операция "или" здесь не подойдет. Потому что только при нулевых значениях всех ячеек нужно скрыть.
ну вот:
A|B|C|D|E
0|7 |5|6 |0
0|0 |0|0 |0 - Вот эту строку надо скрыть: не показывать.


Может проще удалить по условию из внутренней таблицы. Посмотрите оператор DELETE Wink
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Thu Sep 27, 2012 9:54 am    Post subject: Reply with quote

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
  .
Back to top
View user's profile Send private message
ghost
Специалист
Специалист


Age: 37
Joined: 18 Jan 2008
Posts: 71
Location: Tashkent-Astana-Moscow

PostPosted: Thu Sep 27, 2012 10:21 am    Post subject: Reply with quote

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

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Back to top
View user's profile Send private message Send e-mail Blog
bimit
Специалист
Специалист



Joined: 11 Jul 2011
Posts: 56

PostPosted: Thu Sep 27, 2012 10:38 am    Post subject: Reply with quote

ghost wrote:
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


К случаю который здесь описан, это дополнение не подойдет, а так, да, бывает где надо применить UP TO 1 ROWS Wink
Back to top
View user's profile Send private message
kolobok
Участник
Участник



Joined: 03 Sep 2012
Posts: 29

PostPosted: Thu Sep 27, 2012 11:03 am    Post subject: Reply with quote

В itab осуществляется выборка из таблицы НУ. производятся расчеты по многим полям.
Continue используется в циклах. Loop, select, while и пр. Он работает. Только не все записи скрывает. Какие-то скрывает, какие-то оставляет.
Возможно, что нужно сделать новый цикл по ITAB. Сейчас так и попробую и еще delete попробую
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Thu Sep 27, 2012 11:10 am    Post subject: Reply with quote

Quote:
я бы не был так категоричен насчет ENDSELECT. Иногда можно и использовать особенно с дополнением UP TO 1 ROWS


можно. но зачем? если нужно выбрать 1 запись в таблицу это можно сделать с UP TO 1 ROW без ENDSELECT. Если ту же запись выбрать в структуру - есть SELECT SINGLE. Есть нужна проверка на существование - тот же SELECT SINGLE или COUNT(*).

ENDSELECT располагает к написанию проверок внутри запроса, что не есть хорошо, ибо увеличивает время соединения с БД.
Проверки нужно включать в WHERE сразу. Либо, если первое невозможно, выбирать без них во внутреннюю таблицу и выкидывать уже из нее после выборки.

Мне как-то сразу вбили, что ENDSELECT - это плохо, и за все время в абапе у меня не было случая где бы он понадобился.

Есть примеры, когда без него никак?
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Thu Sep 27, 2012 11:17 am    Post subject: Reply with quote

kolobok wrote:
Только не все записи скрывает.

Он вообще записи не скрывает. Он передает управление на следующую итерацию цикла.

Покажите весь код с select до endselect.
Back to top
View user's profile Send private message
bimit
Специалист
Специалист



Joined: 11 Jul 2011
Posts: 56

PostPosted: Thu Sep 27, 2012 11:22 am    Post subject: Reply with quote

kolobok wrote:
В itab осуществляется выборка из таблицы НУ. производятся расчеты по многим полям.
Continue используется в циклах. Loop, select, while и пр. Он работает. Только не все записи скрывает. Какие-то скрывает, какие-то оставляет.
Возможно, что нужно сделать новый цикл по ITAB. Сейчас так и попробую и еще delete попробую


Зачем новый цикл, как тут правильно написали, или убираете записи на момент выбора из БД, или уже из внутренней таблицы, оператор DELETE как раз подойдет

З.Ы. Ну если уже есть цикл по таблице ITAB, то убирайте в нем Wink
Back to top
View user's profile Send private message
kolobok
Участник
Участник



Joined: 03 Sep 2012
Posts: 29

PostPosted: Thu Sep 27, 2012 11:43 am    Post subject: Reply with quote

Селекты убирать не хочется. Понимаю, что есть более оптимизированный вариант. Но пока проблема более или менее решилась так:

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.
Back to top
View user's profile Send private message
ghost
Специалист
Специалист


Age: 37
Joined: 18 Jan 2008
Posts: 71
Location: Tashkent-Astana-Moscow

PostPosted: Thu Sep 27, 2012 12:02 pm    Post subject: Reply with quote

и опять off:
to bimit : да поэтому и добавил дополнение off: Wink
to alezhu : 1) с каких пор UP TO N ROWS используется вне цикла ( без ENDSELECT) Confused
2) select single не всегда хорош , в частности когда явно полный ключ нельзя указать
3) count тут вообще не причем. имелось ввиду такая конструкция необходима например для проверки есть ли вообще запись по указанному ключу либо выбрать первую найденную запись (но опять опять же когда нет возможности указать полный ключ)

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Back to top
View user's profile Send private message Send e-mail Blog
flex
Специалист
Специалист



Joined: 02 Feb 2011
Posts: 50

PostPosted: Thu Sep 27, 2012 3:16 pm    Post subject: Reply with quote

off:
ghost wrote:

to alezhu : 1) с каких пор UP TO N ROWS используется вне цикла ( без ENDSELECT) Confused

Эм?
Code:
SELECT * FROM sflight UP TO 10 ROWS
  INTO TABLE gt_sflight.
Back to top
View user's profile Send private message
Mania4e11o
Участник
Участник


Age: 33
Joined: 12 Dec 2011
Posts: 47
Location: Рязань

PostPosted: Thu Sep 27, 2012 3:35 pm    Post subject: Reply with quote

ghost wrote:
1) с каких пор UP TO N ROWS используется вне цикла ( без ENDSELECT) Confused


Скорее всего вы перепутали дополние FROM n TO m для оператора LOOP .. ENDLOOP.
Back to top
View user's profile Send private message Blog
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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.