ABAP动态编程-动态调用子例程&方法及动态SQL

2023-11-08

目录

前言

一、动态调用

1.1 FORM子例程的动态调用

1.2 ABAP方法动态调用

二、动态SQL

2.1 动态OPEN SQL语句

2.2 使用ADBC类执行SQL

 总结


前言

        本文主要讲述ABAP语言中FORM子例程,方法的动态调用,以及SQL的动态使用(动态OPEN SQL 和 ADBC调用)


一、动态调用

1.1 FORM子例程的动态调用

        代码示例:

DATA:lv_formname TYPE string,
     lv_program  TYPE program. 
PERFORM (lv_formname) IN PROGRAM (lv_program) IF FOUND.

        PS: ABAP子例程的动态调用不仅可以调用当前主程序及子程序中的FORM,也可以动态指定程序调用,生成的动态子例程就用该方式调用。注意form名称及程序名必须大写。

1.2 ABAP方法动态调用

        代码示例:

DATA: lo_object    TYPE REF TO object,
      lv_class     TYPE seoclsname,
      lv_method    TYPE string,
      lt_parameter TYPE abap_parmbind_tab,
      ls_parameter TYPE abap_parmbind,
      lt_exception TYPE abap_excpbind_tab,
      ls_exception TYPE abap_excpbind.

lv_class = 'CL_DEMO_TEXT'.
lv_method = 'DISPLAY_STRING'.

lt_parameter = VALUE #( ( name = 'TEXT_STRING' kind = 'E' value = REF #( `CL_DEMO_TEXT=>DISPLAY_STRING` ) ) ).
lt_exception = VALUE #( ( name = 'OTHERS' value = 9  ) ).

TRY.
    CALL METHOD (lv_class)=>(lv_method) PARAMETER-TABLE lt_parameter EXCEPTION-TABLE lt_exception.
  CATCH cx_root. 
ENDTRY.

        展示效果:

        PS:示例为静态方法的调用,实例方法需要动态创建对象后调用,使用方式同理,另外function动态调用时参数(参数字段KIND: E,I,C,R 分别对应EXPORTING, IMPORTING, CHANGING, RECEIVING)的处理与方法一致,不再说明。注意类名和方法名需要大写。

二、动态SQL

2.1 动态OPEN SQL语句

        代码示例:

DATA: lt_data TYPE TABLE OF t001.

DATA: lv_from  TYPE string,
      lv_field TYPE string,
      lv_where TYPE string.

lv_from   = 'T001'.
lv_field  = 'BUKRS BUTXT'.
lv_where  = `BUKRS = '0001'`.


SELECT (lv_field)
  INTO CORRESPONDING FIELDS OF TABLE lt_data
  FROM (lv_from)
  WHERE (lv_where).

         效果:

        PS: 使用时注意捕捉异常

2.2 使用ADBC类执行SQL

        代码示例:

DATA: lr_result TYPE REF TO data.
DATA: lo_structdescr TYPE REF TO cl_abap_datadescr.

TRY.
    " 需要执行的SQL语句字符串
    DATA(lv_statement) = `SELECT * FROM T001 WHERE BUKRS = '0001'`.
    DATA(lo_db_connection) = cl_sql_connection=>get_connection( cl_sadl_dbcon=>get_default_dbcon( ) ).
    DATA(lo_result) = lo_db_connection->create_statement( )->execute_query( statement = lv_statement ).
    DATA(lt_md_data) = lo_result->get_metadata( ).
    DATA(lr_metadata) = lo_result->get_struct_ref( md_tab = lt_md_data
                                                      p_strict = abap_false ).

    lo_structdescr ?= cl_abap_typedescr=>describe_by_data_ref( lr_metadata ).
    DATA(lo_tabletype)     = cl_abap_tabledescr=>create( p_line_type  = lo_structdescr
                                                  p_table_kind = cl_abap_tabledescr=>tablekind_std ).

    CREATE DATA lr_result TYPE HANDLE lo_tabletype.

*     finally save the result_set in the handled tabletype
    lo_result->set_param_table( itab_ref = lr_result ) .

    lo_result->next_package( ).

    lo_db_connection->close( ).

  CATCH cx_sql_exception.

ENDTRY.

         效果:

         PS: 这里的SQL语句为底层数据库SQL,而不是OPEN SQL.


 总结

        1. 动态使用中括号标识符的使用很重要,括号表示使用的为括号中变量对用的值,而不是括号中的值。

        2. 动态调用时的动态部分注意要大写

        3. 动态调用有可能会产生dump,一定要注意异常的捕捉

关联文章:

ABAP动态编程-动态数据对象_xiefireworks的博客-CSDN博客

ABAP动态编程-动态调用子例程&方法及动态SQL_xiefireworks的博客-CSDN博客

ABAP动态编程-动态生成子例程和本地类-GENERATE SUBROUTINE POOL_xiefireworks的博客-CSDN博客

ABAP动态编程-动态生成报表、屏幕_xiefireworks的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ABAP动态编程-动态调用子例程&方法及动态SQL 的相关文章

  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • 将两个表合并为一个输出

    假设我有两张表 已知营业时间 ChargeNum CategoryID Month Hours 111111 1 2 1 09 10 111111 1 3 1 09 30 111111 1 4 1 09 50 222222 1 3 1 09
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • SQL 使用另一列的键和最大值设置列

    我需要根据同一 ID 的 duration 列的最大值更新 max register 列 将值设置为 1 其他值设置为 0 初始表 Id duration max register 1 0 0 1 7 0 1 3 0 2 10 0 2 5
  • 时间序列数据的自连接

    我需要一些帮助来完成我认为应该是相当简单的自连接查询 只需要将两条记录中匹配的开始时间和结束时间合并为一条记录 假设我的表中有以下内容 Time Event 08 00 Start 09 00 Stop 10 30 Start 10 45
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • SQL查询查找具有特定数量关联的行

    使用 Postgres 我有一个架构conversations and conversationUsers Each conversation有很多conversationUsers 我希望能够找到具有确切指定数量的对话conversati
  • 通过 C# SqlCommand 执行合并语句不起作用

    我正在第一次尝试使用临时表和MERGE语句通过更新 SQL 表SqlCommandC 中的对象 我正在开发的程序旨在首先将大量记录 最多 20k 导出到 Excel 电子表格中 然后 用户可以搜索并替换特定值 并根据需要更新任意多记录中的任
  • SQL:如何从一个表中获取另一个表中每一行的随机行数

    我有两个数据不相关的表 对于表 A 中的每一行 我想要例如表 B 中的 3 个随机行 使用光标这相当容易 但速度非常慢 那么我该如何用单个语句来表达这一点以避免 RBAR 呢 要获得 0 到 N 1 之间的随机数 可以使用 abs chec
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 如何在 SQL Server 2012 中选择除一列之外的所有列? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以选择所有列 但只选择我不想选择的特定列 我的意思是有时我会遇到这样的问题 表有数百个字段 而我只需要删除一个字段 我需要重写所有列吗 有什么窍门吗 喜欢select
  • 默认情况下在sql日期时间列中插入null/空值

    如何在 SQL Server 中创建一个表 默认日期时间为空 而不是1900 01 01 00 00 00 000我得到了 我的意思是 如果没有插入值 则默认值应该为 null 空等 如果没有插入值 默认值应该是null empty 在表定
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • CONTAINS 不适用于 Oracle Text

    我在执行此查询时遇到问题 SELECT FROM gob attachment WHERE CONTAINS gob a document java gt 0 它给了我 ORA 29902 error in executing ODCIIn
  • 如何使用 SQL 查询创建逗号分隔的列表?

    我有 3 个表 名为 应用程序 ID 名称 资源 id 名称 应用程序资源 id app id resource id 我想在 GUI 上显示所有资源名称的表格 在每一行的一个单元格中 我想列出该资源的所有应用程序 以逗号分隔 所以问题是

随机推荐

  • 沧海的孤塔-chimera

    SaikrVj 沧海的孤塔 chimera Description 为了获得连神都为之陶醉的美味 沧海淡雪糖 美食殿堂的成员决定前往 沧海的孤塔 进行探险 现在他们到达了塔的最顶层 遇上了这座遗迹的守护魔物 奇美拉 只有击败奇美拉 才可以获
  • Tslib和Qt 4.8.4与在开发板上的移植

    这篇博客算是接着Linux 下编译 安装 配置 QT这篇的 搞完PC平台的就来弄一下嵌入式平台的 Linux的东西搞起来麻烦的地方就在于太杂 太散 像QT 各版本之间都有很多差异 因此在网络上查找资料不能光看某一个 必须很多资料综合来判断
  • 卡尔曼滤波(1) 递归算法

    最近这两天 我在整卡尔曼滤波 滤波算法 我实在B站上跟着DR CAN这个主播听的他的课 讲的非常好 就是语速有些快 下面 上链接 DR CAN的个人空间 哔哩哔哩 bilibili 这个是他的B站主页 这个博主是华东理工大学毕业 美国一个大
  • Linux内存占用分析的几个方法,你知道几个?

    0 引言 系统内存是硬件系统中必不可少的部分 定时查看系统内存资源运行情况 可以帮助我们及时发现内存资源是否存在异常占用 确保业务的稳定运行 例如 定期查看公司的网站服务器内存使用情况 可以确保服务器的资源是否够用 或者发现服务器内存被占用
  • C++学习笔记10:异常

    异常处理 异常处理概述 抛出异常 异常捕获 异常接口声明 捕获所有异常 未捕获异常的处理 构造函数 析构函数与异常处理 异常匹配 标准异常及层次结构 异常处理 在编程时 不能忽略异常处理 处理异常的方法多种多样 错误处理代码分布在整个系统代
  • Linux学习-08-Linux目录常用操作命令2

    3 12 Linux cp命令 复制文件和目录 cp 命令 主要用来复制文件和目录 同时借助某些选项 还可以实现复制整个目录 以及比对两文件的新旧而予以升级等功能 cp 命令的基本格式如下 root CncLucZK cp 选项 源文件 目
  • IP地址、子网掩码、网关、DNS和端口(port)之间的关系

    1 IP地址 IP地址是32位 分为网络号和主机号 所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址 并且每台机器的 IP 在全世界是唯一的 按照TCP IP协议规定 IP地址用二进制来表示 每个IP地址长32b
  • MySQL——错误ERROR :没有选择数据库就操作表格和数据

    ERROR 1046 3D000 No database selected 解决方案一 就是使用 USE 数据库名 语句 这样接下来的语句就默认针对这个数据库进行操作 解决方案二 就是所有的表对象前面都加上 数据库
  • python 爬取中国木材价格指数网

    python 爬取中国木材价格指数网 完整代码 https github com tanjunchen SpiderProject tree master yuzhuprice usr bin env python coding utf 8
  • 分布式事务方案整理

    分布式系统有一个著名的CAP理论 即一个分布式系统要同时满足一致性 Consistency 可用性 Availablility 和分区容错 Partition Tolerance 三个特性是一件不可能的事情 CAP理论告诉架构师不要妄想设计
  • python笔记记录神器 jupyter notebook

    之前因为没有用到这款python工具 所以一直没有在号内给大家介绍 实则大部分python开发者已经在使用了 最喜欢它的地方是可以同时支持markdown和ipython的脚本脚本 那就意味着我可以一遍调试我的代码一遍加上每一部分的层级标题
  • RPA如何拓展更多实体应用场景,进一步精益流程管理?

    RPA作为一种灵活 高效 成本可控的数字化转型方式 已成为近年来关注度最高的技术趋势之一 作为企业转型的催化剂 以RPA为代表的 数字员工 通过预先构建的 智能的 高生产率的 自组织的 多任务资源等方式 能够独特地使用和访问与人类相同的IT
  • 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

    转载 http www cnblogs com fengty90 p 3768826 html 存储结构分四类 顺序存储 链接存储 索引存储 和 散列存储 顺序结构和链接结构适用在内存结构中 顺序表每个单元都是按物理顺序排列的 如果你想访问
  • Halcon清晰度检测实例(转)

    Halcon清晰度检测实例 转 2013 10 08 14 11 07 分类 halcon 举报 字号 订阅 下载LOFTER 我的照片书 此实例通过使用Halcon实现5种清晰度算法函数 1 方差算法函数 2 拉普拉斯能量函数 3 能量梯
  • kubernetes 容器获取宿主机IP

    容器如何获取到所运行的kubernetes节点IP env name HOST NODE NAME valueFrom fieldRef apiVersion v1 fieldPath spec nodeName name HOST NOD
  • 初次在idea运行ssm框架项目

    JDK 8 Tomcat 8 Maven 最新的 配环境变量 Git IDEA 安装 陪环境 编码 UTF 8 快捷方式 把自己安装的JDK Tomcat Maven git配置到IDEA中 自己下一些插件 从GitHub上倒入项目 Mav
  • 概率论与数理统计——方差分析

    文章目录 单因素试验的方差分析 单因素试验 双因素试验的方差分析 方差分析是数理统计中应用很广泛的内容 主要看两个 单因素试验的方差分析 双因素试验的方差分析 在这之前先了解几个概念 方差分析 根据试验的结果进行分析 鉴别各个有关因素对试验
  • ERP财务基础学习

    总账的账套包括会计期间 会计科目和本位币的定义 会计期间 Accounting Period Fiscal Period 又称会计分期 是指将企业川流不息的经营活动划分为若干个相等的区间 在连续反映的基础上 分期进行会计核算和编制会计报表
  • Linux定时任务-定时执行Shell脚本

    主要是使用Linux的crontab工具来实现的 有两个方法 一个放在contab 列表里面 另一个是放在contab文件里面 其实原理是一致的 crontab 列表 cd tmp 创建一个shell脚本 vim hello sh bin
  • ABAP动态编程-动态调用子例程&方法及动态SQL

    目录 前言 一 动态调用 1 1 FORM子例程的动态调用 1 2 ABAP方法动态调用 二 动态SQL 2 1 动态OPEN SQL语句 2 2 使用ADBC类执行SQL 总结 前言 本文主要讲述ABAP语言中FORM子例程 方法的动态调