动态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 :<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.
经验分享 程序员 微信小程序 职场和发展