关于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)
注意:常量时需要加引号,处理的时候用三个引号来表示一个引号,包含小数点的数字也需要加引号。
单独输行项目文本:
单独查凭证抬头文本
两者都输