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

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

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

http://www.xdnf.cn/news/2139.html

相关文章:

  • 【计算机视觉】CV实战项目 -深度解析PaddleSegSharp:基于PaddleSeg的.NET图像分割解决方案
  • 【专题三】二分查找(2)
  • canvas画板!随意画!!
  • egg环境搭建
  • AT6850—GNSS卫星导航定位SOC芯片
  • 【OSG学习笔记】Day 9: 状态集(StateSet)与渲染优化 —— 管理混合、深度测试、雾效等渲染状态
  • LibAI Lab闪耀AI出海峰会:技术深耕与全球化增长的双重奏
  • Q2桥门式起重机司机考试复习重点
  • 告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
  • 前馈神经网络层
  • 罗德FSP13 FSP40频谱分析仪频率13.6GHz
  • ViTMAE:掩码自编码器是可扩展的视觉学习者
  • P4017 最大食物链计数-拓扑排序
  • 国标44496详细分析
  • org.apache.ibatis.plugin.Invocation 类详解
  • 树莓派4B+Ubuntu24.04 电应普超声波传感器串口输出 保姆级教程
  • 基于AI技术的高速公路交通引流系统设计与应用研究
  • kubernets集群的安装-node节点安装-(简单可用)-超详细
  • 智能电网第8期 | 视频监控与数据同传解决方案
  • wsl联通外网
  • SQL注入高级绕过手法汇总 重点
  • 神经发育过程中大脑临界状态的图神经网络分析方法
  • 市场上常见的工作流工具
  • 浅谈OpenAIClaude LLM Tools的额外配置
  • 计算机组成原理实验(1) 算术逻辑运算单元实验
  • Java 设计模式心法之第21篇 - 命令 (Command) - 将请求封装成对象,实现操作解耦与扩展
  • verilog中实现单周期cpu的RVM指令(乘除取模)
  • 登高架设作业证考试的实操项目有哪些?
  • 前端八股 2
  • 支持私有化部署的电子合同平台——一合通