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的,当然可能也是因为我只是做的普通的取数,没有复杂的计算啥的。有空了,大家可以做深入的研究

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

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

相关文章

Java JSON字符串相关问题

一、依赖包 <!--json包--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15</version></dependency> 二、举例 1.实体对象转Json字符串 1.1 代码实现 Dog.java: pack…

HarmonyOS实战开发-Stage模型下Ability的创建和使用

介绍 本篇Codelab基于Stage模型&#xff0c;对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability&#xff0c;并使用UIAbilityContext启动另一个Ability&#xff0c;然后借助Want&#xff0c;在Ability之间传递参数&#xf…

Autosar-EcuM配置详解(免费)-1

1.1创建EcuM模块 按以下步骤完成EcuM的创建。 创建完成后&#xff0c;在Bsw_Modules下面会生成EcuM模块&#xff0c;如下所示&#xff1a; 在工程根目录下会创建一个“EcucModuleConfiguration.arxml”文件&#xff0c;文件名字在上面第6个步骤上输入。后面所有EcuM的配置都将…

[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换&#xff0c;是将某个范围的灰度值映射到另一个范围内&#xff0c;一般是通过灰度的对调&#xff0c;突出想要查看的灰度区间。 S …

二、Java语法基础

1、Java语言的关键字、标识符及命名规范 1)java关键字 2)标识符 3)JAVA中的命名规范 包名的命名规范:域名.公司名称.项目名称.模块名称 类的命名规范:首字母大写,第二个单词的首字母大写,以此类推。 2、进制间的转换(二进制、十进制) 1)十进制->二进制 采用…

答题小程序功能细节揭秘:如何提升用户体验和满足用户需求?

答题小程序功能细节体现 随着移动互联网的快速发展&#xff0c;答题小程序成为了用户获取知识、娱乐休闲的重要平台。一款优秀的答题小程序不仅应该具备简洁易用的界面设计&#xff0c;更应该在功能细节上做到极致&#xff0c;以提升用户体验和满足用户需求。本文将从题库随机…

stable diffusion如何下载模型?

文件夹里面有14个模型&#xff0c;把这些模型复制到SD文件夹里 具体位置:SD文件>models>ControlNet

芯片测试介绍

一、芯片测试的目的 芯片测试的目的就两个&#xff1a; 1、确认芯片与产品手册上写的内容一致&#xff0c;就是看做出来的芯片跟设计的是不是一致的&#xff1b; 2、把芯片的边界条件测出来&#xff0c;就是看芯片有多耐操。 二、芯片测试分类 大家听到最多的测试可能就是…

LLaMA-Factory参数的解答

打开LLaMA-Factory的web页面会有一堆参数 &#xff0c;但不知道怎么选&#xff0c;选哪个&#xff0c;这个文章详细解读一下&#xff0c;每个参数到底是什么含义这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数不对请反馈一下&#xff0c;或者有补充的…

dnf手游攻略:如何利用PVP竞技赛季赚取泰拉与金币?

在DNF手游中&#xff0c;PVP竞技赛季是玩家赚取泰拉和金币的重要途径之一。本攻略将介绍如何通过参与PVP竞技赛季来获取丰厚的游戏收益&#xff0c;帮助玩家在游戏中获得更多的经济收益和游戏资源。 一、认识PVP竞技赛季 PVP竞技赛季是DNF手游中的一个重要活动&#xff0c;每个…

HarmonyOS实战开发-如何构建多种样式弹窗

介绍 本篇Codelab将介绍如何使用弹窗功能&#xff0c;实现四种类型弹窗。分别是&#xff1a;警告弹窗、自定义弹窗、日期滑动选择器弹窗、文本滑动选择器弹窗。需要完成以下功能&#xff1a; 点击左上角返回按钮展示警告弹窗。点击出生日期展示日期滑动选择器弹窗。点击性别展…

FPGA----ZCU106的petalinux 2019.1使用USB传输数据

1、实际项目中需要用到开发板的串口进行数据交互&#xff0c;之前讲的几节只是启动了网口&#xff08;如下链接&#xff09;。因此&#xff0c;本次给大家带来的官方自带串口例程的使用方法&#xff0c;本文的vivado工程和下述连接一样&#xff0c;PL端什么配置都没有。 FPGA-…