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程序。这种方法提高了代码的效率和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS的媒体查询:响应式布局的利器

关于CSS的媒体查询 CSS媒体查询是CSS层叠样式表(Cascading Style Sheets)中的一个核心功能&#xff0c;它使得开发者能够根据不同的设备特性和环境条件来应用不同的样式规则。这是实现响应式网页设计的关键技术&#xff0c;确保网站或应用能够在多种设备上&#xff0c;包括桌面…

YOLOV8图像分割预测后输出mask图

训练一个yolov8后&#xff0c;用官方的预测脚本一般是&#xff1a; results model.predict(img_path, saveTrue, save_diroutput_folder) 运行此代码会直接在run里面生成一个文件夹&#xff0c;保存预测图像。如果要获取分割后的mask点&#xff0c;或mask的轮廓点&#xff0…

nacos使用shared-configs设置多个配置文件后,配置中修改无法动态更新 解决办法

问题描述 今天使用nacos去做配置分离&#xff0c;启动成功了&#xff0c;配置也读取了&#xff0c;但是当我修改nacos中的配置时&#xff0c;发现数据无法动态更新 下面是测试接口的调用 可以看到我修改配置后&#xff0c;接口返回的参数依然是老参数 问题排查 首先检查了…

C++实现一个简单的Qt信号槽机制

昨天写这个文章《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候就在想&#xff0c;是不是也能在这套反射逻辑的基础上&#xff0c;实现一个类似Qt的信号槽机制&#xff1f; Qt信号槽机制简介 所谓的Qt的信号槽&#xff08;Signals …

基于VUE3+VITE+SpringBoot+Nginx部署项目之跨域配置等问题

前言&#xff1a;遇到问题&#xff0c;解决问题。 第一部分&#xff1a;VUE 配置 1、vite.config.js 文件 server: {proxy: {/api: {target: env.VITE_BASE_URL,changeOrigin: true,secure: false,rewrite: path > path.replace(/^\/api/, )}}}, 2、.env 文件 VITE_BAS…

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息&#xff0c;在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…

气象相关图表制作-字体图标、图片、折线的堆叠

开发工作中有个需要展示气温&#xff08;折线&#xff09;、天气&#xff08;图片&#xff09;、风羽&#xff08;字体图标&#xff09;的图表展示需求&#xff0c;之前用过highcharts的关于类似的chart&#xff0c;里面的风雨用的是自带的图片&#xff0c;但是现在要求风羽需要…

Windows环境本地部署开源在线演示文稿应用PPTist并实现远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Elasticsearch exists 和 missing 查询:检查字段是否存在或缺失

在Elasticsearch中&#xff0c;数据通常以文档的形式存储&#xff0c;而每个文档又包含多个字段。在查询数据时&#xff0c;我们经常需要知道某个字段是否存在或者是否缺失。为了满足这种需求&#xff0c;Elasticsearch提供了exists和missing查询&#xff0c;它们允许我们基于字…

Linux双网卡默认路由的metric设置不正确,导致SSH连接失败问题定位

测试环境 VMware虚拟机 RockyLinux 9 x86_64 双网卡&#xff1a;eth0(访问外网): 10.206.216.92/24; eth1(访问内网) 192.168.1.4/24 问题描述 虚拟机重启后&#xff0c;SSH连接失败&#xff0c;提示"Connection time out"&#xff0c;重启之前SSH连接还是正常的…

基础指标 派生指标 计算指标 这些指标的区别是什么?

基础指标、派生指标、计算指标这些指标的区别是什么&#xff1f; 基础指标、派生指标和计算指标在数据分析和业务度量中各自扮演着不同的角色&#xff0c;它们之间的区别主要体现在定义、构建方式和用途上。 基础指标&#xff08;基础指标/原子指标&#xff09;&#xff1a; …

基于Spring Boot医护人员排班系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及查询操作。具体界面…

SS8870T-3.6A 扫地机和滚刷电机的大电流电机驱动

扫地机器人已经成为现代家庭清洁的必备工具&#xff0c;而其中的关键部件——电机&#xff0c;对于其性能和用户体验起着至关重要的作用。为了确保扫地机器人的高效清洁和稳定运行&#xff0c;至少需要使用7个直流电机&#xff0c;包括行走轮、滚轮、边刷和吸尘等功能的驱动。 …

Python接口测试课程,每天学会一个Python小知识!

第一天: Python基础 Python简介、环境搭建及包管理 Python简介&#xff1a; 特点&#xff1a;Python是一门动态、解释型、强类型语言 动态&#xff1a;在运行期间才做数据检查&#xff08;不用提前声明变量&#xff09;- 静态语音(C/Java)&#xff1a;编译时检查数据类型&…

根据指定日期自定义el-date-picker日期选择器样式

需求 功能需要在DatePicker日期选择器中&#xff0c;对有数据的日期下方添加小圆点提示样式&#xff0c;后台会返回按年份查询的日期数据 dayjs插件 dayjs中文网&#xff1a;https://dayjs.fenxianglu.cn/ npm install dayjs实现点 配置picker-options对象中的cellClassName属性…

django 逆向生成对应数据库表的models模型类 —— python

一&#xff0c;在setting.py中配置好连接数据库的参数 在setting中的DATABASESZ中配置默认参数&#xff0c;并在INSTALLED_APPS中导入模块名。 DATABASES {default:{ENGINE: django.db.backends.mysql, # 数据库引擎NAME: jljupcs, # 数据库名称HOST: 127.0.0.1, # 数据库…

亚马逊商品详情的 API 接口获取与分析:挖掘商业价值的关键技术

在当今竞争激烈的电商领域&#xff0c;获取和分析准确的商品详情信息对于企业和开发者来说至关重要。亚马逊作为全球领先的电商平台&#xff0c;其丰富的商品资源和庞大的用户群体为商业决策提供了极具价值的数据。通过 API 接口获取亚马逊商品详情并进行深入分析&#xff0c;已…

检索增强生成RAG系列1--RAG的实现

大模型出现涌现能力之后&#xff0c;针对大模型的应用也如雨后春笋般。但是&#xff0c;在大模型真正落地之前&#xff0c;其实还需要做好最后一公里&#xff0c;而这个最后一公里&#xff0c;其中不同应用有着不同的方法。其中prompt、微调和RAG都是其中方法之一。本系列就是针…

网络协议 -- IP、ICMP、TCP、UDP字段解析

网络协议报文解析及工具使用介绍 1. 以太网帧格式及各字段作用 -------------------------------- | Destination MAC Address (48 bits) | -------------------------------- | Source MAC Address (48 bits) …

JVM 知识总结

是什么 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息&#…