ABAP AMDP 示例
AMDP 是HANA开发中的一种优化模式
按SAP的官方建议,在可以使用Open SQL实现需要的功能或优化目标的时候,不建议使用AMDP。而在需要使用Open SQL不支持的特性,或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况下,则应当使用AMDP。
下面我举例几种AMDP的实现方法,并且比较一下效率
示例代码如下
"! <p class="shorttext synchronized" lang="en">demo for select for vbap</p>
CLASS zcl_amdp_vbap DEFINITIONPUBLICFINALCREATE PUBLIC .PUBLIC SECTION.INTERFACES if_amdp_marker_hdb .TYPES: BEGIN OF ty_vbap,mandt TYPE s_mandt,vbeln TYPE vbeln_va,posnr TYPE posnr_va,matnr TYPE matnr,werks TYPE werks_d,lgort TYPE lgort_d,END OF ty_vbap.TYPES: tt_vbap TYPE STANDARD TABLE OF ty_vbap WITH EMPTY KEY.DATA: gt_vbap TYPE STANDARD TABLE OF ty_vbap." 常规方法:Open SQL "CLASS-METHODS get_vbap_by_opensqlIMPORTINGVALUE(p_clnt) TYPE s_mandtVALUE(p_vbeln) TYPE vbelnVALUE(p_posnr) TYPE posnrVALUE(p_matnr) TYPE matnrEXPORTINGVALUE(et_vbap) TYPE tt_vbap."AMDP方式1: AMDP PROCEDURE实现,直接写SQLScript从HDB获取数据 "" 也可直接调用已创建的数据库对象,如存储过程、视图、函数等 "" 该方法可以直接被ABAP程序调用,必须设置为PUBLIC "CLASS-METHODS get_vbapIMPORTINGVALUE(p_clnt) TYPE s_mandtVALUE(p_vbeln) TYPE vbelnVALUE(p_posnr) TYPE posnrVALUE(p_matnr) TYPE matnrEXPORTINGVALUE(et_vbap) TYPE tt_vbap."AMDP方式2-1-1: AMDP function实现,直接写SQLScript从HDB获取数据 "" 该方法不能直接被ABAP程序调用,只能在AMDP PROCEDURE实现中调用,建议可设置为 PRIVATE "CLASS-METHODS get_vbap_funcIMPORTINGVALUE(p_clnt) TYPE s_mandt
* VALUE(p_vbeln) TYPE vbeln
* VALUE(p_posnr) TYPE posnr
* VALUE(p_matnr) TYPE matnrRETURNINGVALUE(et_vbap) TYPE tt_vbap."AMDP方式2-1-2: AMDP procedure实现,调用上述的 AMDP function实现 "CLASS-METHODS get_vbap_by_funcIMPORTINGVALUE(p_clnt) TYPE s_mandt
* VALUE(p_vbeln) TYPE vbeln
* VALUE(p_posnr) TYPE posnr
* VALUE(p_matnr) TYPE matnrEXPORTINGVALUE(et_vbap) TYPE tt_vbap."AMDP方式2-2-1: AMDP procedure实现,为 TABLE FUNCTION CDS编写具体实现逻辑 "" 该方法无法直接被ABAP程序调用,但是对应的CDS可以被ABAP调用。 "" 此处对应的CDS名为:YCDS_INVENTORY,需要另外单独定义 "" 定义为 TABLE FUNCTION CDS 时,方法必须为 PUBLIC CLASS-METHODS "CLASS-METHODS get_vbap_for_cds FOR TABLE FUNCTION zcds_admp_demo_vbap.ENDCLASS.CLASS zcl_amdp_vbap IMPLEMENTATION.METHOD get_vbap_by_opensql.SELECT mandt,vbeln,posnr,matnr,werks,lgortFROM vbapWHERE ( vbeln = @p_vbeln OR @p_vbeln = '' )OR ( posnr = @p_posnr OR @p_posnr = '' )OR ( matnr = @p_matnr OR @p_matnr = '' )INTO CORRESPONDING FIELDS OF TABLE @et_vbap.ENDMETHOD.METHOD get_vbapBY DATABASE PROCEDURE FOR HDBLANGUAGE SQLSCRIPTOPTIONS READ-ONLYUSING vbap.et_vbap =selectmandt,vbeln,posnr,matnr,werks,lgortFROM vbapWHERE mandt = :p_clnt;ENDMETHOD.METHOD get_vbap_funcBY DATABASE FUNCTION FOR HDBLANGUAGE SQLSCRIPTOPTIONS READ-ONLYUSING vbap.RETURNSELECTmandt,vbeln,posnr,matnr,werks,lgortFROM vbapWHERE mandt = :p_clnt;ENDMETHOD.METHOD get_vbap_by_funcBY DATABASE PROCEDURE FOR HDBLANGUAGE SQLSCRIPTOPTIONS READ-ONLYUSING zcl_amdp_vbap=>get_vbap_func.et_vbap =select *from "ZCL_AMDP_VBAP=>GET_VBAP_FUNC"(p_clnt => :p_clnt);ENDMETHOD.METHOD GET_VBAP_FOR_CDSBY DATABASE FUNCTION FOR HDBLANGUAGE SQLSCRIPTOPTIONS READ-ONLYUSING vbap.RETURNSELECTmandt,vbeln,posnr,matnr,werks,lgortFROM vbapWHERE mandt = :p_clnt;ENDMETHOD.ENDCLASS.
ZCDS_ADMP_DEMO_VBAP table function
@EndUserText.label: 'ZCDS_ADMP_DEMO_VBAP'
define table function ZCDS_ADMP_DEMO_VBAP
with parameters @Environment.systemField: #CLIENTp_clnt : abap.clnt
returns {mandt : abap.clnt;vbeln : vbeln;posnr : posnr;matnr : matnr;werks : werks_d;lgort : lgort_d;}
implemented by method zcl_amdp_vbap=>get_vbap_for_cds;
ZCDS_VIEW_VBAP CDS VIEW
@AbapCatalog.sqlViewName: 'ZSD0002'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'ZCDS_VIEW_VBAP'
define view ZCDS_VIEW_VBAP as select from vbap
{vbap.mandt,vbap.vbeln,vbap.posnr,vbap.matnr,vbap.werks,vbap.lgort}
程序执行代码:
*&---------------------------------------------------------------------*
*& Report z_test_amdp_vbap
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_test_amdp_vbap.
TYPES: BEGIN OF ty_vbap,mandt TYPE s_mandt,vbeln TYPE vbeln_va,posnr TYPE posnr_va,matnr TYPE matnr,werks TYPE werks_d,lgort TYPE lgort_d,END OF ty_vbap.
TYPES: tt_vbap TYPE STANDARD TABLE OF ty_vbap WITH EMPTY KEY.
DATA: gt_vbap TYPE STANDARD TABLE OF ty_vbap WITH EMPTY KEY .
DATA: p_vbeln TYPE vbeln.
DATA: p_posnr TYPE posnr.
DATA: p_matnr TYPE matnr.
DATA: lv_begin TYPE tzonref-tstampl.
DATA: lv_end TYPE tzonref-tstampl.
DATA: lv_open TYPE char100.
DATA: lv_abap TYPE char100.
DATA: lv_proc TYPE char100.
DATA: lv_func TYPE char100.
DATA: lv_cds TYPE char100.
DATA: lv_cds2 TYPE char100.PARAMETERS: p_open TYPE char01 AS CHECKBOX DEFAULT 'x'.
PARAMETERS: p_abap TYPE char01 AS CHECKBOX DEFAULT 'x'.
PARAMETERS: p_proc TYPE char01 AS CHECKBOX DEFAULT 'x'.
PARAMETERS: p_func TYPE char01 AS CHECKBOX DEFAULT 'x'.
PARAMETERS: p_cds TYPE char01 AS CHECKBOX DEFAULT 'x'.
PARAMETERS: p_cds2 TYPE char01 AS CHECKBOX DEFAULT 'x'.START-OF-SELECTION.IF p_open IS NOT INITIAL .GET TIME STAMP FIELD lv_begin.CALL METHOD zcl_amdp_vbap=>get_vbap_by_opensqlEXPORTINGp_clnt = sy-mandtp_vbeln = p_vbelnp_posnr = p_posnrp_matnr = p_matnrIMPORTINGet_vbap = gt_vbap.GET TIME STAMP FIELD lv_end.lv_open = ( lv_end - lv_begin ) * 100000.ENDIF.IF p_abap IS NOT INITIAL .CLEAR:gt_vbap,lv_begin,lv_end.GET TIME STAMP FIELD lv_begin.SELECT mandt,vbeln,posnr,matnr,werks,lgortFROM vbapWHERE ( vbeln = @p_vbeln OR @p_vbeln = '' )OR ( posnr = @p_posnr OR @p_posnr = '' )OR ( matnr = @p_matnr OR @p_matnr = '' )INTO CORRESPONDING FIELDS OF TABLE @gt_vbap.GET TIME STAMP FIELD lv_end.lv_abap = ( lv_end - lv_begin ) * 100000.ENDIF.IF p_proc IS NOT INITIAL .CLEAR:gt_vbap,lv_begin,lv_end.GET TIME STAMP FIELD lv_begin.CALL METHOD zcl_amdp_vbap=>get_vbapEXPORTINGp_clnt = sy-mandtp_vbeln = p_vbelnp_posnr = p_posnrp_matnr = p_matnrIMPORTINGet_vbap = gt_vbap.GET TIME STAMP FIELD lv_end.lv_proc = ( lv_end - lv_begin ) * 100000.ENDIF.IF p_func IS NOT INITIAL .CLEAR:gt_vbap,lv_begin,lv_end.GET TIME STAMP FIELD lv_begin.CALL METHOD zcl_amdp_vbap=>get_vbap_by_funcEXPORTINGp_clnt = sy-mandtIMPORTINGet_vbap = gt_vbap..GET TIME STAMP FIELD lv_end.lv_func = ( lv_end - lv_begin ) * 100000.ENDIF.IF p_cds IS NOT INITIAL .CLEAR:gt_vbap,lv_begin,lv_end.GET TIME STAMP FIELD lv_begin.SELECT * FROM ZCDS_ADMP_DEMO_VBAPINTO CORRESPONDING FIELDS OF TABLE @gt_vbap.GET TIME STAMP FIELD lv_end.lv_cds = ( lv_end - lv_begin ) * 100000.ENDIF.IF p_cds2 IS NOT INITIAL .CLEAR:gt_vbap,lv_begin,lv_end.GET TIME STAMP FIELD lv_begin.SELECT * FROM ZSD0002INTO CORRESPONDING FIELDS OF TABLE @gt_vbap.GET TIME STAMP FIELD lv_end.lv_cds2 = ( lv_end - lv_begin ) * 100000.
ENDIF.WRITE 'open sql 执行时间:' && lv_open.WRITE '应用层 SQL 执行时间:' && lv_abap.WRITE 'amdp procedure 执行时间:' && lv_proc.WRITE 'amdp func 执行时间:' && lv_func.WRITE 'table function cds 执行时间:' && lv_cds.WRITE 'cds 执行时间:' && lv_cds2.
执行结果如下:
这里我们用的VBAP中总共的条目是3,825
从执行结果上来看,可以看出CDS view 是 效率是优于 amdp的,当然可能也是因为我只是做的普通的取数,没有复杂的计算啥的。有空了,大家可以做深入的研究
相关文章:

ABAP AMDP 示例
AMDP 是HANA开发中的一种优化模式 按SAP的官方建议,在可以使用Open SQL实现需要的功能或优化目标的时候,不建议使用AMDP。而在需要使用Open SQL不支持的特性,或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况…...
发票查验接口C++语言如何集成、发票OCR
说起发票查验工作,繁琐的发票信息录入与反复查验令财务人员头疼不已。数字化时代,企业财务管理的自动化需求越来越高,翔云发票查验API搭配发票识别接口为企业提供一种高效的财务管理解决方案。仅需上传发票图片即可快速提取发票四要素信息&am…...

【图论 | 数据结构】用链式前向星存图(保姆级教程,详细图解+完整代码)
一、概述 链式前向星是一种用于存储图的数据结构,特别适合于存储稀疏图,它可以有效地存储图的边和节点信息,以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起,通过数组的方式连接(类似静态数组实现链表)。这种方法的优点是存储空间小,查询速度快,尤其适…...
【蓝桥杯3.23小白赛】(详解)
第一题签到题不多说 【二进制王国】 #include <iostream> #include <vector> #include <algorithm> using namespace std;//int Cmp(string s1, string s2)测试了一下时间差确实很明显,还是用下面的内个 int Cmp(const string &s1,const st…...

设计模式之抽象工厂模式精讲
概念:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类。 抽象工厂模式是工厂方法模式的升级版本。在存在多个业务品种或分类时,抽象工厂模式是一种更好的解决方式。 抽象工厂模式的UML类图如下: 可以看…...

初识云原生、虚拟化、DevOps
文章目录 K8S虚拟化DevOpsdevops平台搭建工具大数据架构 K8S master 主节点,控制平台,Master节点负责核心的调度、管理和运维,不需要很高性能,不跑任务,通常一个就行了,也可以开多个主节点来提高集群可用度…...
怎麼實現Nginx反向代理?
Nginx是一款開源軟體,可以作為Web伺服器、負載均衡器和反向代理使用,是高性能的HTTP和反向代理伺服器。其中反向代理是Nginx的一項重要特性。接下來,我們詳細講一下Nginx反向代理的實現和應用。 反向代理是什麼? 代理一詞通常指的…...
IOS面试题编程机制 71-75
71. 简述有哪几种手势通知方法?-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event; -(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event; -(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event; -(void)touchesCanceled:(NSSet*)touchedw…...

JMeter元件作用域和执行顺序
JMeter元件作用域和执行顺序 元件的基本介绍基本元件总结 作用域的基本介绍作用域的原则元件执行顺序Jmeter第一个案例: Jmeter三个重要组件(重点)线程组特点线程组分类线程组的属性案例分析 HTTP请求案例一(使用HTTP请求路径来传…...
Jmeter 聚合报告之 90% Line 正确理解
今天看了些关于Jmeter 聚合报告之 90% Line 的一些博客 关于90% Line 的算法各有各自的见解 。 90%Line可以用公式计算: 100/总个数每一个所占的百分比,90%/每一个所占的百分比90%Line的序号(从小到大排) 例如:1.2.3.…...

2024 解决 Failed to launch process [ElasticSearch]
操作系统:centos 7 (x86) sonarQube不能使⽤root账号进⾏启动,所以需要创建普通⽤户及其⽤户组 一、问题描述:使用root启动时,一直反馈 SonarQube is not running 问题原因:不能够使用root用户进行启动 解决方案…...
平台介绍-搭建赛事运营平台(4)
存储结构是赛事运营平台的核心设计内容。平台整体采用分库结构,各赛事独立享有自己的数据库。但是选手、家长、赛事组织机构、培训机构、老师、志愿者信息都是存储在核心库中。新增报名时,家长或老师首先看自己名下有无该选手信息(对照关系也…...

系列学习前端之第 7 章:一文掌握 AJAX
1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML(中文名:阿贾克斯),就是异步的 JS 和 XML。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。AJAX 可以在浏览器中向服务器发送异步请求…...

iOS - Runtime - Class的结构
文章目录 iOS - Runtime - Class的结构前言1. Class的结构1.1 Class的结构1.1.1 objc_class1.1.2 class_rw_t1.1.3 class_ro_t 1.2 class_rw_t和class_ro_t的区别1.3 class_rw_t和class_ro_t的关系1.3.1 分析关系1.3.2 原因 1.4 method_t1.4.1 Type Encoding1.4.2 types iOS - …...

MySQL高阶语句(一)
一、常用查询 (增、删、改、查) 对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等 1、按关键字排序 PS:类比于windows 任务管理器 使用 SELECT 语…...
MySQL知识总结
一条 SQL 语句过来的流程是什么样的? ①当客户端连接到 MySQL 服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过 SSL 证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。 ②在正式…...

Go-Gin-Example 第八部分 优化配置接口+图片上传功能
文章目录 前情提要本节目标 优化配置结构讲解落实修改配置文件优化配置读取及设置初始化顺序第一步 验证 抽离file 实现上传图片接口图片名加密封装image的处理逻辑编写上传图片的业务逻辑增加图片上传的路由 验证实现前端访问 http.FileServerr.StaticFS修改文章接口新增、更新…...

阿里云国际DDoS高防的定制场景策略
DDoS高防的定制场景策略允许您在特定的业务突增时段(例如新业务上线、双11大促销等)选择应用独立于通用防护策略的定制防护策略模板,保证适应业务需求的防护效果。您可以根据需要设置定制场景策略。 背景信息 定制场景策略提供基于业务场景…...

v4l2采集视频
Video4Linux2(v4l2)是用于Linux系统的视频设备驱动框架,它允许用户空间应用程序直接与视频设备(如摄像头、视频采集卡等)进行交互。 linux系统下一切皆文件,对视频设备的操作就像对文件的操作一样ÿ…...

Spring Cloud 八:微服务架构中的数据管理
Spring Cloud 一:Spring Cloud 简介 Spring Cloud 二:核心组件解析 Spring Cloud 三:API网关深入探索与实战应用 Spring Cloud 四:微服务治理与安全 Spring Cloud 五:Spring Cloud与持续集成/持续部署(CI/C…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...