搭建动态SQL取数

日常取数的时候可能会存在动态SQL的问题,比如取数动态或者条件动态等情况,下面针对动态SQL做一个完整的处理。包括SELECT 、FROM、WHERE 以及 最后table的动态。

首先 数据定义,这里全按照表来append处理

复制代码
TYPES:BEGIN OF ty_data,
        edpline TYPE edpline,
      END OF ty_data.

DATA:lt_select TYPE TABLE OF ty_data,
     ls_select TYPE ty_data,
     lt_from   TYPE TABLE OF ty_data,
     ls_from   TYPE ty_data,
     lt_where  TYPE TABLE OF ty_data,
     ls_where  TYPE ty_data.

动态SELECT 处理

复制代码
CLEAR:ls_select.REFRESH:lt_select.

ls_select-edpline = 'mara~matnr,'.
APPEND ls_select TO lt_select.CLEAR:ls_select.

ls_select-edpline = 'makt~maktx,'.
APPEND ls_select TO lt_select.CLEAR:ls_select.

ASSIGN lt_select[ lines( lt_select ) ] TO FIELD-SYMBOL(<comp>).
REPLACE ',' IN <comp> WITH ''.

动态表关联

复制代码
CLEAR:ls_from.REFRESH:lt_from.

ls_from-edpline = 'MARA'.
APPEND ls_from TO lt_from.CLEAR:ls_from.
ls_from-edpline = 'INNER JOIN MAKT'.
APPEND ls_from TO lt_from.CLEAR:ls_from.
ls_from-edpline = 'ON MARA~MATNR = MAKT~MATNR'.
APPEND ls_from TO lt_from.CLEAR:ls_from.

动态where 条件

复制代码
CLEAR:ls_where.REFRESH:lt_where.

ls_where = 'MAKT~SPRAS = @SY-LANGU'.
APPEND ls_where TO lt_where.CLEAR:ls_where.

ls_where = 'AND MARA~MTART = `Z120`'.
APPEND ls_where TO lt_where.CLEAR:ls_where.

搭建动态表

复制代码
***构建动态表

DATA:gt_fieldcat TYPE lvc_t_fcat,
     gs_fieldcat TYPE lvc_s_fcat.

DATA: dy_table TYPE REF TO data,
      dy_line  TYPE REF TO data.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>.

DEFINE fill_field.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname     = &1.
  gs_fieldcat-coltext       = &2.
  gs_fieldcat-ref_table     = &3.
  gs_fieldcat-ref_field     = &4.

    gs_fieldcat-scrtext_l = gs_fieldcat-scrtext_m = gs_fieldcat-scrtext_s = gs_fieldcat-reptext = gs_fieldcat-coltext.

  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

fill_field 'MATNR' '物料号' 'MARA' 'MATNR'.
fill_field 'MAKTX' '物料描述' 'MAKT' 'MAKTX'.

* 根据it_fact生成动态表
CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = gt_fieldcat[]
  IMPORTING
    ep_table        = dy_table.

ASSIGN dy_table->* TO <dyn_table>.

CREATE DATA dy_line LIKE LINE OF <dyn_table>.

ASSIGN dy_line->* TO <dyn_wa>.

SQL 以及展示

复制代码
SELECT (lt_select)
  FROM (lt_from)
  INTO TABLE @<dyn_table>
  WHERE (lt_where).

LOOP AT <dyn_table> ASSIGNING <dyn_wa>.

  ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dyn_wa> TO FIELD-SYMBOL(<fv_matnr>).
  ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <dyn_wa> TO FIELD-SYMBOL(<fv_maktx>).

  WRITE:/ <fv_matnr>,<fv_maktx>.

ENDLOOP.

完整代码

复制代码
TYPES:BEGIN OF ty_data,
        edpline TYPE edpline,
      END OF ty_data.

DATA:lt_select TYPE TABLE OF ty_data,
     ls_select TYPE ty_data,
     lt_from   TYPE TABLE OF ty_data,
     ls_from   TYPE ty_data,
     lt_where  TYPE TABLE OF ty_data,
     ls_where  TYPE ty_data.

TYPES:BEGIN OF gy_matnr,
        matnr TYPE mara-matnr,
        maktx TYPE makt-maktx,
      END OF gy_matnr.
DATA:gs_matnr TYPE gy_matnr,
     gt_matnr TYPE TABLE OF gy_matnr.

DATA:ls_data TYPE REF TO data.
FIELD-SYMBOLS:<ft_data> TYPE ANY TABLE.

CLEAR:ls_select.REFRESH:lt_select.

ls_select-edpline = 'mara~matnr,'.
APPEND ls_select TO lt_select.CLEAR:ls_select.

ls_select-edpline = 'makt~maktx,'.
APPEND ls_select TO lt_select.CLEAR:ls_select.

ASSIGN lt_select[ lines( lt_select ) ] TO FIELD-SYMBOL(<comp>).
REPLACE ',' IN <comp> WITH ''.

CLEAR:ls_from.REFRESH:lt_from.

ls_from-edpline = 'MARA'.
APPEND ls_from TO lt_from.CLEAR:ls_from.
ls_from-edpline = 'INNER JOIN MAKT'.
APPEND ls_from TO lt_from.CLEAR:ls_from.
ls_from-edpline = 'ON MARA~MATNR = MAKT~MATNR'.
APPEND ls_from TO lt_from.CLEAR:ls_from.

CLEAR:ls_where.REFRESH:lt_where.

ls_where = 'MAKT~SPRAS = @SY-LANGU'.
APPEND ls_where TO lt_where.CLEAR:ls_where.

ls_where = 'AND MARA~MTART = `Z120`'.
APPEND ls_where TO lt_where.CLEAR:ls_where.

***构建动态表

DATA:gt_fieldcat TYPE lvc_t_fcat,
     gs_fieldcat TYPE lvc_s_fcat.

DATA: dy_table TYPE REF TO data,
      dy_line  TYPE REF TO data.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>.

DEFINE fill_field.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname     = &1.
  gs_fieldcat-coltext       = &2.
  gs_fieldcat-ref_table     = &3.
  gs_fieldcat-ref_field     = &4.

    gs_fieldcat-scrtext_l = gs_fieldcat-scrtext_m = gs_fieldcat-scrtext_s = gs_fieldcat-reptext = gs_fieldcat-coltext.

  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

fill_field 'MATNR' '物料号' 'MARA' 'MATNR'.
fill_field 'MAKTX' '物料描述' 'MAKT' 'MAKTX'.

* 根据it_fact生成动态表
CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = gt_fieldcat[]
  IMPORTING
    ep_table        = dy_table.

ASSIGN dy_table->* TO <dyn_table>.

CREATE DATA dy_line LIKE LINE OF <dyn_table>.

ASSIGN dy_line->* TO <dyn_wa>.

SELECT (lt_select)
  FROM (lt_from)
  INTO TABLE @<dyn_table>
  WHERE (lt_where).

LOOP AT <dyn_table> ASSIGNING <dyn_wa>.

  ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dyn_wa> TO FIELD-SYMBOL(<fv_matnr>).
  ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <dyn_wa> TO FIELD-SYMBOL(<fv_maktx>).

  WRITE:/ <fv_matnr>,<fv_maktx>.

ENDLOOP.

BREAK-POINT.

这里只是一个简单的代码,但是由简到难道理都一样,看具体需求去做具体的处理。

简单跑一下代码实现结果

相关推荐
爱掘金的土拨鼠1 小时前
国产化dm数据库锁表解锁
数据库
庖丁解java1 小时前
N个Utils
数据库
Mr. zhihao1 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql
2301_793086872 小时前
Redis 04 Reactor
数据库·redis·缓存
Sais_Z2 小时前
ClickHouse的学习与了解
数据库·clickhouse
代码的余温2 小时前
MySQL性能优化:10个关键参数调整指南
数据库·mysql·性能优化
silver98863 小时前
sql链接的url中serverTimezone的作用
数据库·sql
tanxiaomi4 小时前
数据库索引视角:对比二叉树到红黑树再到B树
数据结构·数据库·b树
水无痕simon4 小时前
5 索引的操作
数据库·elasticsearch
柏油5 小时前
可视化 MySQL binlog 监听方案
数据库·后端·mysql