当前位置: 首页 > news >正文

搭建动态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_tableEXPORTINGit_fieldcatalog = gt_fieldcat[]IMPORTINGep_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_tableEXPORTINGit_fieldcatalog = gt_fieldcat[]IMPORTINGep_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.

这里只是一个简单的代码,但是由简到难道理都一样,看具体需求去做具体的处理。
简单跑一下代码实现结果
在这里插入图片描述

相关文章:

  • 【Token系列】02 | Embedding是怎么“长出来”的?从查表到训练过程全解
  • JavaScript基础知识合集笔记1——数据类型
  • Qt开发:QSettings的介绍和使用
  • 如何下载VSCode插件市场为VSIX文件
  • 2025第十六届蓝桥杯省赛第二场(京津冀)JAVA B组真题回顾
  • 数据库监控功能-oracle
  • 数据分析岗位-相关知识
  • Spring 学习笔记之 @Transactional 异常不回滚汇总
  • javase和java有什么区别
  • 7.学习笔记-Maven进阶(P75-P89)-进度(p75-P80)
  • Python----深度学习(基于DNN的PM2.5预测)
  • Win下Pycharm运行/调试配置脚本形参执行替换Linux下终端执行,进行调试需要注意的
  • Vue Composition API 与 Options API:全面对比与使用指南
  • 《人件》第三章 正确的人
  • 2025.04.26-美团春招笔试题-第四题
  • 升级 Spring Boot CLI
  • windows上的 Vmware Workstation 环境搭建
  • cloud项目同一个服务,执行不同业务需求,nacos进行分组
  • 6.Geometric Intersection (几何求交)- Preliminary
  • LLM基础之源码一
  • 铜钴巨头洛阳钼业一季度净利润同比大增九成,最新宣布超30亿元收购黄金资产
  • 邮轮、无人机、水上运动……上海多区推动文旅商体展融合发展
  • 解放军仪仗司礼大队参加越南纪念南方解放50周年庆典活动
  • 我国风电光伏装机历史性超过火电
  • 潘功胜:央行将实施好适度宽松的货币政策,推动中国经济高质量发展
  • 中国气象局:针对山西、广西、陕西启动抗旱四级应急响应