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

ABAP开发:动态Open SQL编程案例介绍

  动态Open SQL是Open SQL的扩展。它不是要求整个SQL语句都是动态指定的。通过熟悉的静态ABAP编码表达静态已知的部分,动态元素的部分通过动态标记指定。动态片段不明确包含在ABAP源代码中,而是源代码包含一个ABAP变量,用括号括起来作为占位符。程序必须包含创建动态片段的ABAP源代码的编码,并将其存储在该变量中。在运行时,动态片段的ABAP源代码被解析并混合到语句的静态部分中。动态和静态部分对数据库来说看起来像一个单一的语句。这个过程对数据库是完全透明的。

     以下通过两个程序案例来展示如何在ABAP中使用动态Open SQL来解决数据库访问问题。

案例一:动态表名
问题描述:用户需要查询一个数据库表,但表名在运行时才确定。

解决方案:使用动态Open SQL,我们可以在运行时动态构建SQL语句,包括表名和WHERE子句。

程序代码:

REPORT Y_DEMO_TEST_139.
data: tabname type tabname,count   type i.start-of-selection.write: / 'SPFLI', / 'SFLIGHT', / 'SBOOK'.at line-selection.
read current line line value into tabname.
select count(*) from (tabname) into count.write: 'The table', tabname(7), 'contains', count, 'entries.'

在SELECT语句中,数据库表的名称不是静态指定的。相反,子句from (tabname)表示数据库表的名称将从变量tabname中读取并替换到SELECT语句中:

 select count(*) from (tabname) INTO count.

在事件行选择时,所选行的内容被读入字段tabname中。

程序执行结果:

   在这个例子中,用户可以通过界面选择一个表名,程序会根据用户的选择动态构建SQL语句,并执行查询。

案例二:动态SELECT和GROUP BY子句

问题描述:用户需要根据选择的列和聚合条件,动态生成报表。

解决方案:通过动态Open SQL,我们可以在运行时动态构建SELECT和GROUP BY子句,以满足用户的需求。

程序代码:

type-pools abap.parameters: lt radiobutton group 1 default 'X',gt radiobutton group 1,value type i.data: begin of wa,
count type i.
include type spfli.
data: end of wa.data: checked,
name type fieldname,
lines type i,descr_ref type ref to cl_abap_structdescr,sel_list type table of edpline,group_list type table of edpline,
having type string.field-symbols: <fs> type any,<comp_wa> type abap_compdescr.start-of-selection.set pf-status 'MAIN'.* get all components of table 'SPFLI'descr_ref ?=cl_abap_typedescr=>describe_by_name( 'SPFLI' ).loop at descr_ref->components assigning <comp_wa>.
name = <comp_wa>-name.write: / checked as checkbox, name.endloop.
lines = lines( descr_ref->components ).at user-command.* determine selected columns
clear: sel_list, group_list.append 'count(*) as count' to sel_list.
do lines times.
read line sy-index field value checked.
if checked = 'X'.
read line sy-index field value name.append name to: sel_list, group_list.endif.enddo.* determine operator
if gt = 'X'.
having = 'count(*) > value'.else.
having = 'count(*) < value'.endif.select (sel_list)
from spfli up to 20 rows
into corresponding fields of wa
group by (group_list)having (having). * write all components to listwrite: / wa-count.
loop at group_list into name.assign component name of structure wa to <fs>.write: <fs>.endloop.endselect.

在程序代码16、17行中,
16          sel_list   type table of edpline,
17       group_list type table of edpline,
声明了两个内部表——sel_list和group_list——来保存动态SELECT和
GROUP BY子句的源代码:
代码的41到48行,在用户命令事件中,count()被添加到SELECT列表中作为第一个字段。别名count与工作区wa的组件count匹配。然后,从列表中提取复选框的值来确定所选的列。为此,我们循环遍历列表,并根据复选框的值将所选列的名称附加到sel_list和group_list中。因为SELECT列表包含聚合函数count(),所以我们必须在sel_list和group_list中包含所有列标识符: 


41   append 'count(*) as count' to sel_list.
42   do lines times.
43     read line sy-index field value checked.
44     if checked = 'X'.
45       read line sy-index field value name.
46       append name to: sel_list, group_list.
47     endif.
48   enddo.接下来,根据group_list对数据进行分组,并根据having_clause
过滤中间结果集:57   select (sel_list)
58       from spfli up to 20 rows
59       into corresponding fields of wa
60       group by (group_list)
61       having (having).最后,将结果集按列显示:
63 * 写所有组件到列表
64     write: / wa-count.
65     loop at group_list into name.
66       assign component name of structure wa to <fs>.
67       write: <fs>.
68     endloop.
69   endselect.为了成功执行,程序必须有一个GUI状态“MAIN”,它定义了一个带有功能代码“ONLI”的按钮,如下图:
  • 总之,结果随勾选字段的不同而不同。     

  • 在这个例子中,用户可以在界面上选择要包含在报表中的列,并设置聚合条件。程序会根据用户的选择动态构建SQL语句,并执行查询,生成报表。       

  • 动态Open SQL提供了一种强大的方法来处理在编译时无法确定的数据库访问问题,适合解决大多数需要通用数据库访问的编程情况。大多数Open SQL语句的子句——表名、SELECT、WHERE、GROUP BY、HAVING和ORDER BY——都可以动态指定。通过动态构建SQL语句的各个部分,我们可以编写出更加灵活和适应性强的ABAP程序。这种方法提高了代码的效率和可维护性。

相关文章:

  • elasticsearch 8.14.1 和 Spring Data elasticsearch 实例演示
  • React 中 useState 和 useReducer 的联系和区别
  • spring security + vue,登录功能
  • 2024鲲鹏昇腾创新大赛集训营Ascend C算子学习笔记
  • docker k8s
  • CentOS 7 内存占用过大导致 OOM Killer 杀掉了 Java 进程
  • AI是在帮助开发者还是取代他们?
  • 2024.06.30 刷题日记
  • 解决 VM 虚拟机网络连接异常导致的 Finalshell 无法连接及 ifconfig 中 ens33 丢失问题
  • 基于C++实现的EventLoop与事件驱动编程
  • 【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】
  • 【大模型LLM面试合集】大语言模型基础_llm概念
  • 由监官要求下架docker hub镜像导致无法正常拉取镜像
  • qt QTreeView的简单使用(多级子节点)
  • SpringCloud分布式微服务链路追踪方案:Skywalking
  • 《深入 React 技术栈》
  • Android系统模拟器绘制实现概述
  • Angular4 模板式表单用法以及验证
  • es6--symbol
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git同步原始仓库到Fork仓库中
  • java概述
  • Java教程_软件开发基础
  • php的插入排序,通过双层for循环
  • STAR法则
  • uva 10370 Above Average
  • 服务器从安装到部署全过程(二)
  • 离散点最小(凸)包围边界查找
  • 那些年我们用过的显示性能指标
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 实现简单的正则表达式引擎
  • 详解NodeJs流之一
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 走向全栈之MongoDB的使用
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • gunicorn工作原理
  • Linux权限管理(week1_day5)--技术流ken
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 移动端高清、多屏适配方案
  • "无招胜有招"nbsp;史上最全的互…
  • #ifdef 的技巧用法
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (09)Hive——CTE 公共表达式
  • (2.2w字)前端单元测试之Jest详解篇
  • (力扣)循环队列的实现与详解(C语言)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十六)串口UART
  • (十五)使用Nexus创建Maven私服
  • (一)Dubbo快速入门、介绍、使用
  • (原创)可支持最大高度的NestedScrollView
  • (转) ns2/nam与nam实现相关的文件
  • (转)Sql Server 保留几位小数的两种做法
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .cfg\.dat\.mak(持续补充)
  • .Net FrameWork总结