欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

关于ABAP动态WHERE条件 SQL查询的处理

最近在处理一项批量修改凭证文本内容时候,先要查出关键字的所有凭证,包括行项目文本及凭证抬头文本,用户也不高兴分别查询,又想有时候单独查询。

 这个时候如果这样写

    SELECT BSEG~BUKRS,BSEG~GJAHR,BSEG~BELNR,BSEG~BUZEI,BSEG~SGTXT,BKPF~BKTXT
    FROM BSEG
    INNER JOIN BKPF ON BKPF~BUKRS = BSEG~BUKRS AND BKPF~GJAHR = BSEG~GJAHR AND BKPF~BELNR = BSEG~BELNR
    WHERE BSEG~BUKRS EQ  @P_BUKRS
    AND BSEG~GJAHR  EQ  @P_GJAHR
    AND BSEG~BELNR IN  @S_BELNR
    AND ( BSEG~SGTXT IN  @S_SGTXT OR BKPF~BKTXT IN  @S_BKTXT )
    INTO TABLE @DATA(LT_BSEG1).

结果是当两者都输的时候是没问题的,但是只输一个文本框,另一个不输的话,会出现全部的数据。询问了其他大神,都是建议使用动态条件去处理。

       LR_DISPLAY   TYPE REF TO CL_SALV_DISPLAY_SETTINGS.
  "动态where条件
  DATA:LV_STRING TYPE STRING.
  IF S_SGTXT IS NOT INITIAL.
    LV_STRING = 'BSEG~SGTXT IN  @S_SGTXT'.
  ENDIF.

  IF S_BKTXT IS NOT INITIAL.
    LV_STRING = 'BKPF~BKTXT IN  @S_BKTXT'.
  ENDIF.

  IF S_BKTXT IS NOT INITIAL AND S_SGTXT IS NOT INITIAL.
    LV_STRING = '( BSEG~SGTXT IN  @S_SGTXT OR BKPF~BKTXT IN  @S_BKTXT )'.
  ENDIF.

*  IF S_SGTXT IS NOT INITIAL AND S_BKTXT IS INITIAL.
  SELECT BSEG~BUKRS,BSEG~GJAHR,BSEG~BELNR,BSEG~BUZEI,BSEG~SGTXT,BKPF~BKTXT INTO TABLE @DATA(LT_BSEG)
  FROM BSEG
  INNER JOIN BKPF ON BKPF~BUKRS = BSEG~BUKRS AND BKPF~GJAHR = BSEG~GJAHR AND BKPF~BELNR = BSEG~BELNR
  WHERE BSEG~BUKRS EQ  @P_BUKRS
  AND BSEG~GJAHR  EQ  @P_GJAHR
  AND BSEG~BELNR IN  @S_BELNR
  AND (LV_STRING)

注意:常量时需要加引号,处理的时候用三个引号来表示一个引号,包含小数点的数字也需要加引号。

单独输行项目文本:

 

 单独查凭证抬头文本

 

 两者都输

 

posted @ 2023-08-31 14:03  萧静默  阅读(1222)  评论(0编辑  收藏  举报