动态SQL查询,动态内表

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 : TYPE table.
ASSIGN d_ref->* TO .

"动态SQL查询语句
SELECT (p_field)  FROM (p_table) WHERE (p_whe) INTO CORRESPONDING FIELDS OF TABLE @<dyn_table>.
IF sy-subrc = 0.
  "循环处理数据
*  LOOP AT   ASSIGNING FIELD-SYMBOL().
*
*  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语句的查询字段和查询的表以及查询调节,这些也可以维护到配置表中,然后动态取值出来,进行查询。
动态SQL查询,动态内表_第1张图片
结果,查询哪几个字段,生成的内表也就只有几个字段。
动态SQL查询,动态内表_第2张图片
3.参考链接
1.ABAP动态生成内表的三种方法
2.ABAP 动态内表 动态ALV-明大叔
3.拆分字符串split

jio冷哦,快点赞!

你可能感兴趣的:(ABAP,sql,数据库,database)