搭建动态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 小时前
【PmHub后端篇】PmHub 中缓存与数据库一致性的实现方案及分析
数据库·缓存
kaixiang3001 小时前
sqli-labs靶场23-28a关(过滤)
数据库·sql
不剪发的Tony老师1 小时前
数据库行业竞争加剧,MySQL 9.3.0 企业版开始支持个人下载
数据库·mysql
张伯毅2 小时前
Flink SQL 将kafka topic的数据写到另外一个topic里面
sql·flink·kafka
淡定是个好东西2 小时前
springboot连接高斯数据库(GaussDB)踩坑指南
数据库·gaussdb
追风赶月、2 小时前
【Redis】哨兵(Sentinel)机制
数据库·redis·sentinel
悟能不能悟3 小时前
mysql的not exists走索引吗
数据库·mysql
明月与玄武3 小时前
Jmeter -- JDBC驱动连接数据库超详细指南
数据库·jmeter·配置jdbc连接
专注VB编程开发20年3 小时前
VB.NET关于接口实现与简化设计的分析,封装其他类
java·前端·数据库
vvilkim3 小时前
Redis持久化机制详解:保障数据安全的关键策略
数据库·redis·缓存