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

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

简单跑一下代码实现结果

相关推荐
RestCloud13 小时前
4中常见的数据集成方式
数据库
阿里云云原生14 小时前
阿里云百炼开源面向 Java 开发者的 NL2SQL 智能体框架
sql
Databend14 小时前
超 10 倍查询加速,N-Gram Index 设计与优化全解析
数据库
爱可生开源社区15 小时前
SCALE:一个面向专业级任务的大语言模型 SQL 能力开源评测框架
数据库
星环科技TDH社区版16 小时前
星环科技产品可存储的表格式功能介绍以及创建示例
大数据·数据库
Tapdata19 小时前
全球 DaaS 市场研究报告上线,聚焦数据服务化趋势与行业演进路径
数据库
李少兄21 小时前
MySQL 默认连接数
数据库·mysql
刘一说21 小时前
资深Java工程师的面试题目(六)数据存储
java·开发语言·数据库·面试·性能优化
江沉晚呤时21 小时前
EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
java·开发语言·数据库
珹洺21 小时前
数据库系统概论(十九)详细讲解关系查询处理与查询优化
数据库