Abap 如何使用多个非强制性输入字段进行搜索?

Abap 如何使用多个非强制性输入字段进行搜索?,abap,Abap,我想问一下,如何在一个包含多个不需要的输入字段的选择屏幕中进行基本的搜索过滤 我试图通过使用多个IF语句,后跟WHERE子句来解决我当前的问题,但它并不完全正确。如果我现在只使用几个输入2,'ID'和'Number',代码不会太长,但是如果超过10个左右,这样做会感觉不对 到目前为止,我所尝试的大致如下: IF lv_id IS INITIAL and lv_nr IS INITIAL. SELECT * from DBase INTO TABLE Local_Table. ELS

我想问一下,如何在一个包含多个不需要的输入字段的选择屏幕中进行基本的搜索过滤

我试图通过使用多个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.

期望的结果是通过没有输入或多个非强制性输入来正确执行搜索,而不必编写很长的代码,以防输入数量过多。

对于这种带有串联where条件的方法如何

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).

使用串联where条件的这种方法怎么样

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).

当有多个条件时,可以在WHERE子句中使用IN运算符

首先,您需要为每个参数定义一个选择表,并且必须填充它们或将它们保留为空

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 .

当有多个条件时,可以在WHERE子句中使用IN运算符

首先,您需要为每个参数定义一个选择表,并且必须填充它们或将它们保留为空

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 .

您可以将输入字段定义为具有可选无间隔无扩展的选择选项,以模仿参数的外观。然后只需在WHERE子句中使用IN运算符:


您可以将输入字段定义为具有可选无间隔无扩展的选择选项,以模仿参数的外观。然后只需在WHERE子句中使用IN运算符:


很抱歉,我不明白如果我有10个以上的输入字段,该方法如何缩短代码?@Mick您不需要在输入文件之间有所有的组合变体。您不能缩短代码,因为在任何情况下,在最坏的情况下,您必须使用10+个条件编写SQL查询,并且必须以某种方式定义此复杂查询。如果您查看其他回复,那么您将看到,在任何情况下,您都将使用多个IFs或Where子句,该子句包含所有列,并为其定义了SELECT-OPTIONSexample@Mick,支持谢尔盖。如果您有一些相互矛盾的搜索条件,它们相互交叉或相互影响,那么动态查询可能是您唯一的选择。带有IN语句的SELTAB适合大多数情况,但不是所有情况。很抱歉,我不明白如果我有10个以上的输入字段,这种方法如何使代码更短?@Mick您不需要在输入文件之间有所有组合变体。您不能缩短代码,因为在任何情况下,在最坏的情况下,您必须使用10+个条件编写SQL查询,并且必须以某种方式定义此复杂查询。如果您查看其他回复,那么您将看到,在任何情况下,您都将使用多个IFs或Where子句,该子句包含所有列,并为其定义了SELECT-OPTIONSexample@Mick,支持谢尔盖。如果您有一些相互矛盾的搜索条件,它们相互交叉或相互影响,那么动态查询可能是您唯一的选择。带有IN语句的SELTAB适合大多数情况,但并非所有情况。如果数据范围像lv\U id的范围,则可能会短一点。如果lv\U id不是初始值,则范围像id=COND。如果lv\U id不是初始值,则范围像id=COND。如果lv\U id不是初始值,则范围像id=COND值符号='I'选项='EQ'低=lv\U id。