SAPфорум.RU
https://sapboard.ru/forum/

Чекбокс на экране выбора модифицирует запрос к БД
https://sapboard.ru/forum/viewtopic.php?f=13&t=96375
Страница 1 из 1

Автор:  sonics [ Чт, май 10 2018, 09:27 ]
Заголовок сообщения:  Чекбокс на экране выбора модифицирует запрос к БД

Здравствуйте.
Часть экрана выбора:
Code:
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.
    PARAMETERS p_chbox AS CHECKBOX DEFAULT 'X'.
    SELECTION-SCREEN COMMENT 10(24) text-001 FOR FIELD p_chbox.
  SELECTION-SCREEN END OF LINE.

Часть запроса к бд:
Code:
  WHERE zppmrp5~elevel = 1 AND
        zppmrp5~matnr_1 IN so_mat1 AND
        zppmrp5~matnr_2 IN so_mat2 AND
        zppmrp5~matnr IN so_matnr AND
        zppmrp5~arbpl_1 IN so_arb1 AND
        zppmrp5~arbpl_2 IN so_arb2 AND
        zppmrp5~ZBESK IN so_ZBESK.

Не разобрался как сделать так, чтобы при снятии галочки, убиралась строка WHERE zppmrp5~elevel = 1 AND или как-то так должно быть, чтобы выбирались все elevel ?
Подскажите пожалуйста.

Автор:  Kuranov.Dmitry [ Чт, май 10 2018, 09:42 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Вот кусок примера из хелпа по оператору SELECT:

Code:
PARAMETERS: airline(2) TYPE C,
            date       TYPE D.
DATA: where_clause TYPE STRING,
      connid       TYPE sflight-connid.

CONCATENATE     'carrid = ''' airline ''''
            ' AND fldate = ''' date '''' INTO where_clause.

SELECT connid FROM sflight INTO connid
  WHERE (where_clause).
  WRITE: / date, airline, connid.
ENDSELECT.


модифицируйте под свою задачу

второй вариант, сделать IF-ELSE
и два селекта

Автор:  Besa [ Чт, май 10 2018, 09:45 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Sonic, У Вас же пример под носом :)
Code:
zppmrp5~matnr_1 IN so_mat1 AND

заполните выше по условию какой нибудь range so_level чтобы сделать zppmrp5~elevel IN...
или на селективный экран вывести поле если это подходит и дать возможность заполнять его.

или f1 по where и смотреть динамику.

Автор:  sonics [ Чт, май 10 2018, 09:53 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Kuranov.Dmitry написал(а):
Вот кусок примера из хелпа по оператору SELECT:

Code:
PARAMETERS: airline(2) TYPE C,
            date       TYPE D.
DATA: where_clause TYPE STRING,
      connid       TYPE sflight-connid.

CONCATENATE     'carrid = ''' airline ''''
            ' AND fldate = ''' date '''' INTO where_clause.

SELECT connid FROM sflight INTO connid
  WHERE (where_clause).
  WRITE: / date, airline, connid.
ENDSELECT.


модифицируйте под свою задачу

второй вариант, сделать IF-ELSE
и два селекта

Я вот и хотел сделать if else, но в секции where же нельзя так сделать :(

грубо говоря я же не могу сделать так
WHERE IF p_chbox is INITIAL.
zppmrp5~elevel = 1.
ENDIF.
:( вот тут я и попал...

Автор:  sonics [ Чт, май 10 2018, 09:53 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Besa написал:
Sonic, У Вас же пример под носом :)
Code:
zppmrp5~matnr_1 IN so_mat1 AND

заполните выше по условию какой нибудь range so_level чтобы сделать zppmrp5~elevel IN...
или на селективный экран вывести поле если это подходит и дать возможность заполнять его.

или f1 по where и смотреть динамику.

хм, туговато идет ... ) сейчас попробую

Автор:  Kengur [ Чт, май 10 2018, 10:42 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

пора для соникса делать отдельный подфорум :D

Автор:  Kuranov.Dmitry [ Чт, май 10 2018, 10:49 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

sonics написал(а):
Kuranov.Dmitry написал(а):
Вот кусок примера из хелпа по оператору SELECT:

Code:
PARAMETERS: airline(2) TYPE C,
            date       TYPE D.
DATA: where_clause TYPE STRING,
      connid       TYPE sflight-connid.

CONCATENATE     'carrid = ''' airline ''''
            ' AND fldate = ''' date '''' INTO where_clause.

SELECT connid FROM sflight INTO connid
  WHERE (where_clause).
  WRITE: / date, airline, connid.
ENDSELECT.


модифицируйте под свою задачу

второй вариант, сделать IF-ELSE
и два селекта

Я вот и хотел сделать if else, но в секции where же нельзя так сделать :(

грубо говоря я же не могу сделать так
WHERE IF p_chbox is INITIAL.
zppmrp5~elevel = 1.
ENDIF.
:( вот тут я и попал...


Почитайте курсы по абапу ....

зачем в WHERE пихать IF?

IF p_flag = 'X'.
SELECT ...
ELSE.
SELECT...
endif.

Автор:  Kuranov.Dmitry [ Чт, май 10 2018, 10:53 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Ну или так как писал Besa

Code:

SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.
    PARAMETERS p_chbox AS CHECKBOX DEFAULT 'X'.
    SELECTION-SCREEN COMMENT 10(24) text-001 FOR FIELD p_chbox.
  SELECTION-SCREEN END OF LINE.

DATA l_elevel like zppmrp5-elevel.
RANGES r_eleveel FOR l_elevel.

IF p_chbox = 'X'.
   clear r_elevel.
else.
   r_elevel-low = 1.
  r_elevel-option = 'EQ'.
  r_elevel-sign = 'I'.
  append r_elevel.
endif.


SELECT * FROM zppmrp5
WHERE zppmrp5~elevel in r_elevel AND
        zppmrp5~matnr_1 IN so_mat1 AND
        zppmrp5~matnr_2 IN so_mat2 AND
        zppmrp5~matnr IN so_matnr AND
        zppmrp5~arbpl_1 IN so_arb1 AND
        zppmrp5~arbpl_2 IN so_arb2 AND
        zppmrp5~ZBESK IN so_ZBESK.



грубо говоря, если RANGE пустой, то условие IN с ним всегда истина .

<Что то> и ИСТИНА = <что-то>
Таким образом строка из условия как бы уберется.

в вашем случае это более красиво будет чем два селекта в разных ветках условия

Автор:  sonics [ Чт, май 10 2018, 10:57 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Kengur написал(а):
пора для соникса делать отдельный подфорум :D

я уже со многим разобрался! :)
но исходя из того, что на обучение мой завод не профинансирует, приходится разбираться так . . . вопросами, хелпом
понимаю, что большинство вопросов достаточно простых, но все же мне не хватает иногда, простого, доступного описания simple words :D

Автор:  sonics [ Чт, май 10 2018, 11:01 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Kuranov.Dmitry написал(а):
Почитайте курсы по абапу ....

зачем в WHERE пихать IF?

IF p_flag = 'X'.
SELECT ...
ELSE.
SELECT...
endif.

так очень сильно нагружает БД и запрос обрабатывается долго, у меня идет соединение двух таблиц по 3-4 млн каждая и определенные критерии.
если я выведу сразу таблицу, а потом почищу от elevel = 1, то приходится долго ждать.
А при elevel=1 в селекте, транзакция отрабатывается в течение 15-20 сек.
Поэтому и такая вот задача.... что нужно именно в моем селекте

Code:
SELECT zppmrp5~matnr_1
       zppmrp5~datuv
       zppmrp5~matnr_2
       zppmrp5~matnr
       zppmrp5~werks
       zppmrp5~arbpl_1
       zppmrp5~arbpl_2
       zppmrp5~seqnr
       zppmrp5~elevel
       zppmrp5~pbdnr
       zppmrp5~zbesk
       zppmrp5~IA

       zppmrp5~gamng AS gamng_td
       zppmrp5~gamng_1 AS gamng_1_td
       zppmrp5_tmp1~gamng AS gamng_ld
       zppmrp5_tmp1~gamng_1 AS gamng_1_ld

  INTO CORRESPONDING FIELDS OF TABLE gt_result_tab
  FROM zppmrp5
  LEFT
    JOIN zppmrp5_tmp1 ON zppmrp5_tmp1~matnr = zppmrp5~matnr
        AND zppmrp5_tmp1~matnr_1 = zppmrp5~matnr_1
        AND zppmrp5_tmp1~matnr_2 = zppmrp5~matnr_2
        AND zppmrp5_tmp1~arbpl_1 = zppmrp5~arbpl_1
        AND zppmrp5_tmp1~arbpl_2 = zppmrp5~arbpl_2
        AND zppmrp5_tmp1~seqnr = zppmrp5~seqnr
        AND zppmrp5_tmp1~werks = zppmrp5~werks
        AND zppmrp5_tmp1~pbdnr = zppmrp5~pbdnr
  WHERE zppmrp5~elevel = 1 AND
        zppmrp5~matnr_1 IN so_mat1 AND
        zppmrp5~matnr_2 IN so_mat2 AND
        zppmrp5~matnr IN so_matnr AND
        zppmrp5~arbpl_1 IN so_arb1 AND
        zppmrp5~arbpl_2 IN so_arb2 AND
        zppmrp5~ZBESK IN so_ZBESK.

SELECT zppmrp5_tmp1~matnr_1
       zppmrp5_tmp1~matnr_2
       zppmrp5_tmp1~werks
       zppmrp5_tmp1~matnr
       zppmrp5_tmp1~arbpl_1
       zppmrp5_tmp1~arbpl_2
       zppmrp5_tmp1~datuv
       zppmrp5_tmp1~seqnr
       zppmrp5_tmp1~elevel
       zppmrp5_tmp1~pbdnr
       zppmrp5_tmp1~gamng AS gamng_ld
       zppmrp5_tmp1~gamng_1 AS gamng_1_ld
       zppmrp5_tmp1~zbesk
       zppmrp5_tmp1~IA

       zppmrp5~gamng AS gamng_td
       zppmrp5~gamng_1 AS gamng_1_td

  APPENDING CORRESPONDING FIELDS OF TABLE gt_result_tab
  FROM zppmrp5_tmp1
  LEFT
    JOIN zppmrp5 ON zppmrp5~matnr = zppmrp5_tmp1~matnr
        AND zppmrp5~matnr_1 = zppmrp5_tmp1~matnr_1
        AND zppmrp5~matnr_2 = zppmrp5_tmp1~matnr_2
        AND zppmrp5~arbpl_1 = zppmrp5_tmp1~arbpl_1
        AND zppmrp5~arbpl_2 = zppmrp5_tmp1~arbpl_2
        AND zppmrp5~seqnr = zppmrp5_tmp1~seqnr
        AND zppmrp5~werks = zppmrp5_tmp1~werks
        AND zppmrp5~pbdnr = zppmrp5_tmp1~pbdnr
  WHERE zppmrp5_tmp1~elevel = 1 AND
        zppmrp5_tmp1~matnr_1 IN so_mat1 AND
        zppmrp5_tmp1~matnr_2 IN so_mat2 AND
        zppmrp5_tmp1~matnr IN so_matnr AND
        zppmrp5_tmp1~arbpl_1 IN so_arb1 AND
        zppmrp5_tmp1~arbpl_2 IN so_arb2 AND
        zppmrp5_tmp1~ZBESK IN so_ZBESK.

Автор:  Kuranov.Dmitry [ Чт, май 10 2018, 11:06 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Цитата:
ак очень сильно нагружает БД и запрос обрабатывается долго, у меня идет соединение двух таблиц по 3-4 млн каждая и определенные критерии.
если я выведу сразу таблицу, а потом почищу от elevel = 1, то приходится долго ждать.
А при elevel=1 в селекте, транзакция отрабатывается в течение 15-20 сек.


ну так зачем вы хотите его убирать по флажку?)

Автор:  sonics [ Чт, май 10 2018, 11:16 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Kuranov.Dmitry написал(а):
Цитата:
ак очень сильно нагружает БД и запрос обрабатывается долго, у меня идет соединение двух таблиц по 3-4 млн каждая и определенные критерии.
если я выведу сразу таблицу, а потом почищу от elevel = 1, то приходится долго ждать.
А при elevel=1 в селекте, транзакция отрабатывается в течение 15-20 сек.


ну так зачем вы хотите его убирать по флажку?)

а потому, что надо смотреть помимо Изделия, еще и конкретные ДСЕ или УЗЕЛ и т.д. и т.п.
более конкретную информацию по производству деталей.
Надо! :)
Это планирование производства и анализ подробный...
дали бы денег на новый сервак, проблем бы меньше было :(
и на обучение еще бы отправили :D

Автор:  sonics [ Чт, май 10 2018, 15:58 ]
Заголовок сообщения:  Re: Чекбокс на экране выбора модифицирует запрос к БД

Kuranov.Dmitry написал(а):
Ну или так как писал Besa

Code:

SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.
    PARAMETERS p_chbox AS CHECKBOX DEFAULT 'X'.
    SELECTION-SCREEN COMMENT 10(24) text-001 FOR FIELD p_chbox.
  SELECTION-SCREEN END OF LINE.

DATA l_elevel like zppmrp5-elevel.
RANGES r_eleveel FOR l_elevel.

IF p_chbox = 'X'.
   clear r_elevel.
else.
   r_elevel-low = 1.
  r_elevel-option = 'EQ'.
  r_elevel-sign = 'I'.
  append r_elevel.
endif.


SELECT * FROM zppmrp5
WHERE zppmrp5~elevel in r_elevel AND
        zppmrp5~matnr_1 IN so_mat1 AND
        zppmrp5~matnr_2 IN so_mat2 AND
        zppmrp5~matnr IN so_matnr AND
        zppmrp5~arbpl_1 IN so_arb1 AND
        zppmrp5~arbpl_2 IN so_arb2 AND
        zppmrp5~ZBESK IN so_ZBESK.



грубо говоря, если RANGE пустой, то условие IN с ним всегда истина .

<Что то> и ИСТИНА = <что-то>
Таким образом строка из условия как бы уберется.

в вашем случае это более красиво будет чем два селекта в разных ветках условия

это было шикарно . . . О_о
попробую вникнуть, но работает! спасибо!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/