搭建动态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.

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

简单跑一下代码实现结果

相关推荐
imDwAaY4 分钟前
一条 SQL 发出去之后,MySQL 到底做了什么?
sql·mysql
行业研究员43 分钟前
Agent Memory降低Token消耗原理解析
数据库·人工智能·oracle·腾讯云·智能体
yixun_gdas1 小时前
企业网站内容巡查的价值与方法:企业官网的合规与形象管理
数据库·内容运营
见闻小天地1 小时前
空调机房赛莱默B&G冷冻泵/冷却泵的核心技术特性分析
大数据·运维·数据库
辛迪聊物业数字化1 小时前
物业管理系统新手部署与实操指南
数据库·物联网·架构·系统架构
March.s1 小时前
MySQL 数据库原理与实战:从数据管理到 LAMP 建站全解
数据库·mysql
字节跳动的猫2 小时前
LikeShop 种草社区模块二开:笔记发布、话题广场与商品挂载实现
数据结构·数据库
IvorySQL2 小时前
PostgreSQL 日报| PostgreSQL JDBC 安全更新(10 月 10 日)
数据库·postgresql·区块链
晚风叙码2 小时前
MySQL 增删改查(CRUD)完全指南:从入门到面试
数据库·mysql·面试
dishugj2 小时前
HANA集群计划内切换与维护操作
java·linux·数据库