Как выполнить поиск по нескольким необязательным полям ввода? - PullRequest
1 голос
/ 20 мая 2019

Я хотел бы спросить, как выполнить базовую фильтрацию поиска на экране выбора с несколькими полями ввода, которые не требуются.

Я попытался сделать это, используя несколько операторов IF, за которыми следуют предложения WHERE.которая решает мою текущую проблему, но это не совсем правильно, если я работаю только с несколькими входами (2 на данный момент, 'ID' и 'Number'), код не слишком длинный, но если его больше 10 или около тогочувствую, что неправильно делать это таким образом

То, что я до сих пор пробовал, было примерно таким:

IF lv_id IS INITIAL and lv_nr IS INITIAL.

     SELECT * from DBase INTO TABLE Local_Table.

ELSEIF lv_id IS NOT INITIAL AND lv_nr IS INITIAL.

     SELECT * from DBase INTO TABLE Local_Table WHERE ID = lv_nr.

ELSEIF lv_id IS INITIAL AND lv_nr IS NOT INITIAL.

     SELECT * from DBase INTO TABLE Local_Table WHERE Number = lv_nr.

ELSEIF lv_id IS NOT INITIAL AND lv_nr IS NOT INITIAL.

     SELECT * from DBase INTO TABLE Local_Table WHERE ID = lv_id AND Number = lv_nr.

Ожидаемый результат - поиск выполняется правильно, без ввода или нескольких не-обязательные входы, без необходимости писать очень длинный код в случае большого количества входов.

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

вы можете использовать оператор IN в предложении WHERE при наличии нескольких условий.

Сначала Вам нужно определить таблицу выбора для каждого параметра и заполнить их или оставить пустыми.

types: begin of myselopt ,
       sign type char1 ,
       option type char2 ,
       low type ... (depends on the type you want select)
       high type ... ,
    end of myselopt .

types : t_selopt type table of myselopt .   

data: gt_selopt type t_selopt ,
      gt_selopt_2 type t_selopt_2 . #needs to be defined first 

if lv_id is not initial .
    insert value #( sign = 'I' option = 'EQ' low = lv_id ) into table gt_selopt .
endif . 

if lv_nr is not initial .
    insert value #( sign = 'I' option = 'EQ' low = lv_nr ) into table gt_selopt_2 .
endif .

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

select * from dbaste into table local_table where id in gt_selopt
                                        and number in gt_selopt_2 .
1 голос
/ 20 мая 2019

Вы можете определить поля ввода как SELECT-OPTIONS (с необязательным NO INTERVALS NO-EXTENSION для имитации вида PARAMETERS). Затем просто используйте оператор IN в предложении WHERE:

REPORT.

DATA: your_ztable TYPE your_ztable.

SELECT-OPTIONS: s_id FOR your_ztable-id     NO INTERVALS NO-EXTENSION,
                s_nr FOR your_ztable-number NO INTERVALS NO-EXTENSION.

AT SELECTION-SCREEN.

  SELECT * FROM your_ztable
    WHERE id   IN @s_id
    AND number IN @s_nr
    INTO TABLE @DATA(local_table).
0 голосов
/ 20 мая 2019

А как насчет этого подхода с объединенными условиями?

DATA:
  lv_where TYPE string.


IF lv_id IS NOT INITIAL.
    CONCATENATE ' AND ID' space '=' space '"' lv_id '"' INTO lv_where.
ENDIF. 

IF lv_nr IS NOT INITIAL.
    CONCATENATE ' AND Number' space '=' space '"' lv_nr '"' INTO lv_where.
ENDIF.

IF lv_where IS NOT INITIAL.
    SHIFT lv_where By 5 PLACES. " to remove leading _AND_ (
ENDIF.

SELECT * from DBase INTO TABLE Local_Table WHERE (lv_where).
...