sap abap 动态 SQL 编写
REPORT ZPROGRAM_F0042.
" 动态SQL
TABLES:EKPO.
SELECT-OPTIONS: S_EBELN FOR EKPO-EBELN, " 不用判断,因为这个是内表。
S_MATNR FOR EKPO-MATNR,
S_MATKL FOR EKPO-MATKL.
PARAMETERS: P_BUKRS TYPE BUKRS , "需要判断,只是给了个类型,没有具体数值。
P_LGORT TYPE LGORt_D. " 默认是select 的事件start of selection
" 要求:1 AEDAT = '2001.06.19' 2\ NETWR= '1898.00'
"--------------定义变量--------------
DATA: LV_WHERE TYPE STRING.
DATA:LV_TMP_WHERE TYPE STRING.
DATA:LT_EKPO TYPE TABLE OF EKPO.
"公司代码是否为空?
if p_bukrs is not initial.
concatenate lv_where 'bukrs = p_bukrs' 'and' into lv_where separated by space.
endif.
"库存地点是否为空
if p_lgort is not initial.
concatenate lv_where 'lgort = p_lgort ' ' and ' into lv_where separated by space .
endif.
"日期,小数在设置默认的时候,要加上双引号,才可以查出数据。
CONCATENATE LV_WHERE 'AEDAT =' '''20010619 ''' 'AND' INTO LV_WHERE SEPARATED BY SPACE.
CONCATENATE LV_WHERE 'NETWR =' '''1898.00''' ' AND ' INTO LV_WHERE SEPARATED BY SPACE.
"select-option 为空时,查出的是所有的数据,不为空时,按照内表里的内容来查
CONCATENATE lv_where 'ebeln in s_ebeln and matnr in s_matnr and matkl in s_matkl'
into lv_where separated by space.
"执行SQL语句:
if lv_where is NOT initial.
select * from ekpo into TABLE lt_ekpo where (lv_where).
else.
select * from ekpo into TABLE lt_ekpo.
endif.
" BREAK-POINT.
"----------------去掉 拼接字符串 中最右边的and
SHIFT lv_where by 1 PLACES left ."往左方向移动1位,
shift lv_where left deleting leading 'AND'." 删除左边的 AND LEFT 和 LEADING配对使用
shift lv_where RIGHT DELETING TRAILING 'AND'." 删除右边边的 AND RIGHT 和 TRAILING配对使用
" 据说 AND 之间有内容的,中间的内容不会受到影响。AND AND 则保留
BREAK-POINT.