写作于2017年2月17日。
Java和ABAP只能根据字符串通过反射获得变量的metadata,像标题描述的这个需求听起来有点怪。需求是Mervin实现Range search时需要根据range table的内容来动态拼OPEN SQL,OPEN SQL里的statement必须是range table的变量名。 AG9: 这四个参数模拟search支持的attribute,如果runtime时候哪个参数传了值进去,就把哪个参数名拼到SQL去:
具体实现:
method BUILD_SQL.
* Jerry: move this logic to constructor!!
data: lt_arg TYPE TABLE OF SEOSUBCODF.
SELECT * INTO TABLE lt_arg FROM SEOSUBCODF WHERE clsname = 'ZCL_SQL'
and cmpname = 'BUILD_SQL'.
* Jerry: end.
DATA: lv_result TYPE string value 'select from XXX'.
LOOP AT lt_arg ASSIGNING FIELD-SYMBOL(<arg>).
ASSIGN (<arg>-sconame) TO FIELD-SYMBOL(<arg_value>).
IF sy-subrc = 0 and <arg_value> IS NOT INITIAL.
lv_result = | { lv_result } WHERE { <arg>-sconame } = { <arg_value> } |.
ENDIF.
ENDLOOP.
WRITE: / lv_result.
endmethod.
测试:
输出: 参数名已经动态拼到SQL里去了: