欢迎来到萧静默的博客

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

关于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 @   萧静默  阅读(1409)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2021-08-31 MIR7/MIRO 贷项凭证/事后借记/后续贷记
2020-08-31 Java-多线程-等待与唤醒机制
点击右上角即可分享
微信分享提示