ABAP的sql语句是可以动态生成的,这个特性可以带给我们很多的便利。 比如SAP对费用的存储结构可能会采用 将会计月作为栏位的情况,及 period001,period002。。。等这样方式来存储值。 通常取这样的值都是采用 Case when的方式或 If--else 等语句选择不同的执行语句获取不同列的值。 这样的处理方式无形中增加了代码的行数,而实际上除了数值列不一样之外,其他列都是一样的,如果这时候采用 动态SQL ,就可以大大简化代码。
格式:
SELECT (column_syntax)FROM(dbtab_syntax)
其中:
column_syntaxcan be a character-type data object or an internal table with a character-type data type(可以是字符串,也可以一个字符类型栏位的内表)
dbtab_syntaxcan be a character-type data object or an internal table with a character-type data object(可以是字符串,也可以一个字符类型栏位的内表)
使用前处理方式:
If Period = ‘001’.
select obj wk001 from tableName
into .......
where con.
.......
Endselect.
ElseIf Period = '002'.
select obj wk002 from tableName
into ......
where con.
.......
Endselect.
ElseIf .....
Endif.
使用动态处理:
data_key = 'wk'.
concatenate data_key period into data_key separated by space.
concatenate ' obj ' data_key into column_syntax separated by space
select (column_syntax) From tableName
into ....
where con.
.........
Endselect.
应该说代码是有明显简化的。
有人会有性能方面的犹豫,我做过测试,不影响,甚至还快一些。
搜索了一下网络,发现更多的资料:
ABAP动态查询的实现:可以完全实现动态查询,每个字段都可以动态。
(1) 利用宏
(2) 利用abap指针
(3) 利用FIELD-SYMBOL
具体实现:
1.结构的动态查询
DEFINE Select_DATA_TO_WA.
Select &1
FROM &2
INTO CORRESPONDING FIELDS OF &3
Where (&4).
EXIT.
ENDSelect.
END-OF-DEFINITION.
2.变量的动态查询
DEFINE Select_DATA_TO_VARIANT.
Select &1
FROM &2
INTO &3
Where (&4).
EXIT.
ENDSelect.
END-OF-DEFINITION.
3.内表的动态查询
DEFINE Select_DATA_TO_VARIANT.
Select &1
FROM &2
INTO CORRESPONDING FIELDS OF TABLE &3
Where (&4).
EXIT.
ENDSelect.
END-OF-DEFINITION.
具体程序实现:
DATA: L_FIELD(100) TYPE C,
L_TABLE(10) TYPE C,
L_COND(100) TYPE C.
DATA: I_COND TYPE TALBE OF L_COND.
FIELD-SYMBOLS TYPE ANY.
START-OF-Selection.
CONCATENATE‘CARRID’‘CONNID’‘CITYFROM’
INTO L_S SEPARATE BY SPACE.
CONCATENATE‘CONNID =‘‘’‘0123’‘’’’INTO L_COND.
APPEND COND TO I_COND.
L_TABLE =‘SPFLI’.
IF IS ASSIGNED.
UNASSIGN .
ASSIGN SPFLI TO .
ELSE.
ASSIGN SPFLI TO .
ENDIF.
Select_DATA_TO_WA (L_S) (L_TABLE) I_COND.