1.动态sql语句查询
简单来说,查询的字段,查询的表格,还有where条件都是变量。可以作为选择屏幕或者接口数据输入,最后得出输入条件的数据。具有通用性。 其中,动态查询的关键在于:sql语句查询结果所放置内表的创建。
2.源代码
PARAMETERS: p_field TYPE char200,
p_table TYPE char10,
p_whe TYPE char200.
*第一种创建动态内表,根据所查询的字段,去生成内表
DATA: d_ref TYPE REF TO data,
lt_alv_cat TYPE TABLE OF lvc_s_fcat,
ls_alv_cat LIKE LINE OF lt_alv_cat.
"根据填写的字段来自建内表
CONDENSE p_field NO-GAPS. "去掉空格,
"p_field:填写字段规范: CARRID ,CONNID, FLDATE 最后一个字段不填逗号
"把填写的内容,根据逗号进行拆分
DATA:lt_field TYPE TABLE OF lvc_rfname.
SPLIT p_field AT ','
INTO TABLE lt_field.
"循环变成fieldcat
LOOP AT lt_field INTO DATA(ls_field).
*根据取出的字段目录生成参考字段目录
ls_alv_cat-fieldname = ls_field. "字段名
ls_alv_cat-ref_table = p_table. "参考表
ls_alv_cat-ref_table = p_table. "参考表
ls_alv_cat-ref_field = ls_field. "参考字段
APPEND ls_alv_cat TO lt_alv_cat.
CLEAR: ls_alv_cat,ls_field.
ENDLOOP.
*内表创建
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = lt_alv_cat
IMPORTING
ep_table = d_ref.
*指定生成的内表到字段符号
FIELD-SYMBOLS :<dyn_table> TYPE table.
ASSIGN d_ref->* TO <dyn_table>.
"动态SQL查询语句
SELECT (p_field) FROM (p_table) WHERE (p_whe) INTO CORRESPONDING FIELDS OF TABLE @<dyn_table>.
IF sy-subrc = 0.
"循环处理数据
* LOOP AT <dyn_table> ASSIGNING FIELD-SYMBOL(<wa>).
*
* ENDLOOP.
"输出结果
cl_demo_output=>display( <dyn_table> ).
ELSE.
WRITE:'SQL语句有误' .
ENDIF.
**"第二种:知道表就可以动态定义对应的内表和工作区
**"根据填入的表格取结构
**DATA:dyn_table TYPE REF TO data.
**CREATE DATA dyn_table TYPE TABLE OF (p_table).
**
**"定义指针内表
**FIELD-SYMBOLS: <dyn_table> TYPE table.
**ASSIGN dyn_table->* TO <dyn_table>.
**
*SELECT (p_field) FROM (p_table) WHERE (p_whe) INTO CORRESPONDING FIELDS OF TABLE @<dyn_table>.
**
**IF sy-subrc = 0.
** CL_DEMO_output=>display( <dyn_table> ).
**ELSE.
** WRITE:'SQL语句有误' .
**ENDIF.
3.代码结果
选择屏幕,就是sql语句的查询字段和查询的表以及查询调节,这些也可以维护到配置表中,然后动态取值出来,进行查询。
结果,查询哪几个字段,生成的内表也就只有几个字段。
3.参考链接
1.ABAP动态生成内表的三种方法
2.ABAP 动态内表 动态ALV-明大叔
3.拆分字符串split
jio冷哦,快点赞!