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 DEFINITION
  PUBLIC
  FINAL
  CREATE 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_opensql
      IMPORTING
        VALUE(p_clnt)  TYPE s_mandt
        VALUE(p_vbeln) TYPE vbeln
        VALUE(p_posnr) TYPE posnr
        VALUE(p_matnr) TYPE matnr
      EXPORTING
        VALUE(et_vbap) TYPE tt_vbap.

    "AMDP方式1: AMDP PROCEDURE实现,直接写SQLScript从HDB获取数据 "
    " 也可直接调用已创建的数据库对象,如存储过程、视图、函数等 "
    " 该方法可以直接被ABAP程序调用,必须设置为PUBLIC "
    CLASS-METHODS get_vbap
      IMPORTING
        VALUE(p_clnt)  TYPE s_mandt
        VALUE(p_vbeln) TYPE vbeln
        VALUE(p_posnr) TYPE posnr
        VALUE(p_matnr) TYPE matnr
      EXPORTING
        VALUE(et_vbap) TYPE tt_vbap.


    "AMDP方式2-1-1: AMDP function实现,直接写SQLScript从HDB获取数据 "
    " 该方法不能直接被ABAP程序调用,只能在AMDP PROCEDURE实现中调用,建议可设置为 PRIVATE "
    CLASS-METHODS get_vbap_func
      IMPORTING
        VALUE(p_clnt)  TYPE s_mandt
*        VALUE(p_vbeln) TYPE vbeln
*        VALUE(p_posnr) TYPE posnr
*        VALUE(p_matnr) TYPE matnr
      RETURNING
        VALUE(et_vbap) TYPE tt_vbap.

    "AMDP方式2-1-2: AMDP procedure实现,调用上述的 AMDP function实现 "
    CLASS-METHODS get_vbap_by_func
      IMPORTING
        VALUE(p_clnt)  TYPE s_mandt
*        VALUE(p_vbeln) TYPE vbeln
*        VALUE(p_posnr) TYPE posnr
*        VALUE(p_matnr) TYPE matnr
      EXPORTING
        VALUE(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,
           lgort
    FROM vbap
    WHERE ( 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_vbap
    BY DATABASE PROCEDURE FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING vbap.
    et_vbap =
      select
         mandt,
         vbeln,
         posnr,
         matnr,
         werks,
         lgort
      FROM vbap
      WHERE mandt = :p_clnt;
  ENDMETHOD.

  METHOD get_vbap_func
      BY DATABASE FUNCTION FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING vbap.
    RETURN
    SELECT
      mandt,
      vbeln,
      posnr,
      matnr,
      werks,
      lgort
   FROM vbap
   WHERE mandt = :p_clnt;
  ENDMETHOD.

  METHOD get_vbap_by_func
    BY DATABASE PROCEDURE FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING 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_CDS
       BY DATABASE FUNCTION FOR HDB
       LANGUAGE SQLSCRIPT
       OPTIONS READ-ONLY
       USING vbap.
    RETURN
    SELECT
      mandt,
      vbeln,
      posnr,
      matnr,
      werks,
      lgort
   FROM vbap
   WHERE 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: #CLIENT
    p_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_opensql
      EXPORTING
        p_clnt  = sy-mandt
        p_vbeln = p_vbeln
        p_posnr = p_posnr
        p_matnr = p_matnr
      IMPORTING
        et_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,
           lgort
    FROM vbap
    WHERE ( 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_vbap
      EXPORTING
        p_clnt  = sy-mandt
        p_vbeln = p_vbeln
        p_posnr = p_posnr
        p_matnr = p_matnr
      IMPORTING
        et_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_func
     EXPORTING
       p_clnt  = sy-mandt
      IMPORTING
        et_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_VBAP
    INTO 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 ZSD0002
    INTO 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的,当然可能也是因为我只是做的普通的取数,没有复杂的计算啥的。有空了,大家可以做深入的研究

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化潮流框架——Playwright 大解密!

一说到自动化测试&#xff0c;第一个反应估计就是Pythonselenium这样的一个组合&#xff0c;其实在2020年的时候市面上就出现了另一个由微软发布的一款UI自动化测试工具&#xff0c;叫Playwright。经过几年的迭代和技术的沉淀&#xff0c;该工具受到越来越多的人重视和青睐。 B…

印度神体系与编程思维

印度神体系中存在三大主神&#xff1a;至高神梵天、毗湿奴以及湿婆。 1.神的类型抽象与神性优先级&#xff1a; 每一个神都掌握着世间中所存在的规律&#xff0c;比如天界里因陀罗&#xff08;帝释天&#xff09;等神掌控风火水电。换句话说&#xff0c;每一个可以抽象出来的世…

5-规范设计(下):commit信息风格迥异、难以阅读,如何规范?

我们在做代码开发时&#xff0c;经常需要提交代码&#xff0c;提交代码时需要填写 Commit Message&#xff08;提交说明&#xff09;&#xff0c;否则就不允许提交。 所以在 Go 项目开发时&#xff0c;一个好的 Commit Message 至关重要&#xff1a; 可以使自己或者其他开发人…

U盘文件突然消失?原因与恢复策略全解析

一、遭遇不测&#xff1a;U盘文件突然消失 在日常生活和工作中&#xff0c;U盘扮演着不可或缺的角色&#xff0c;它小巧便捷&#xff0c;能够随时随地存储和传输文件。然而&#xff0c;有时我们会遭遇一个令人头疼的问题&#xff1a;U盘中的文件突然消失。这种突如其来的变故往…

Oracle利用BBED恢复崩溃实例(ORA-01092,ORA-00704,ORA-01578)

BBED修复数据损坏引起的数据库崩溃&#xff08;ORA-01092,ORA-00704,ORA-01578&#xff09;(2021年某苏州国企的案例&#xff09; 1.Symptom 用户一个边缘系统出现数据文件损坏&#xff0c;且没有备份&#xff0c;数据库无法启动 报错如下&#xff0c;发现是oracle bootstra…

redis集群配置(精华版):主从复制模式

主从复制模式 概念&#xff1a;作用&#xff1a;为什么使用集群&#xff1a;动手实操1、环境准备2、配置redis.conf配置文件3、再次查看主从节点信息4、验证主从模式 概念&#xff1a; ​ 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器…

29 超级数据查看器 APP视频教程 查询复用

29 超级数据查看器 APP视频教程 查询复用 超级数据查看器 查询复用 最下方有 讲解稿全文 有兴趣的朋友可以看看 超级数据查看器是安卓手机上的APP&#xff0c;软件。 具有导入excel表格数据&#xff0c;存入手机内置的数据库&#xff0c;生成查询模块&#xff0c;快速查询数…

缓存和缓存的常用使用场景

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…

线程同步+理解生产者消费者模型

1.线程同步的概念 下面我们来谈一个故事理解线程同步的概念&#xff1a;假设学校里面有一个环境非常好的超级vip自习室是公共的&#xff0c;但是有个前提&#xff0c;一次只能进去一个学生&#xff0c;因为只有一把钥匙挂在超级vip自习室门外的墙上的。假设你是一个学习成绩比…

SuccessFactors 如何通过页面查询后台对应的表

一直以来都习惯SAP的查表方式&#xff0c;一直在想sf能在前台查询表是哪个&#xff0c;今天测试fiori的发现有一个debug工具很好&#xff0c;就是浏览器的F12功能。

hdfs操作java API

1.Configuration类——cof对象 &#xff08;1&#xff09;创建 Configuration conf new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSys…

GIMP - GNU 图像处理程序 - 工具栏窗口 (Toolbox) 显示

GIMP - GNU 图像处理程序 - 工具栏窗口 [Toolbox] 显示 1. File -> Open2. GIMP 主面板里&#xff0c;右击弹出菜单 -> Tools -> New Toolbox3. Windows -> Dockable Dialogs -> Tool Options4. 工具选项拖动到工具箱里面5. Always On TopReferences GIMP 是跨平…

MySQL的InnoDB引擎的事务原理以及MVCC

目录 一、事务原理 二、redo log 三、undo log 四、MVCC 1.基础概念 2.隐藏字段 3.undolog 4.readview 5.原理分析 一、事务原理 1). 事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作…

163.乐理基础-自然小调、音名为何从C开始

如果到这五线谱还没记住还不认识的话去看102.五线谱-高音谱号与103.五线谱-低音谱号这两个里&#xff0c;这里面有五线谱对应的音名&#xff0c;对比着看 如果一章没落下&#xff0c;看到这里&#xff0c;但是看不懂什么意思&#xff0c;那就强行下看&#xff0c;看着看着指不…

UE4_碰撞_射线检测不到物体原因及跳不到圈内的问题

UseSimpleAsComplex 和 UseComplexAsSimple 标记的作用和使用时间。 虚幻引擎 4 中有简单和复杂碰撞形态。 简单碰撞 是基础&#xff0c;如盒体、 球体、胶囊体和凸包。 复杂碰撞 是给定对象的三角网格图。 虚幻引擎 4 会默认创建简单和复杂两种形态&#xff0c;然后基于用户需…

某互联网公司研发人员绩效考核项目成功案例纪实

——产品不确定性强&#xff0c;如何考核研发人员 【行业】互联网行业&#xff1b;高新科技研发行业 【关键词】绩效考核&#xff1b;研发人员&#xff1b;考核指标 M公司是一家定位在高端家用智能设备研发制造的互联网公司&#xff0c;成立于2015年&#xff0c;现有研发人员…

基于springboot实现网页时装购物系统项目【项目源码+论文说明】

基于springboot实现时装购物系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;时装购物系统当然也不能排除在外。时装购物系统是以实际运用为开发背景&#xff0c…

Leetcode 剑指 Offer II 071.按权重随机选择

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个正整数数组 w &#xff0c;其中 w[i] 代表下标 i 的权重…

浅谈Spring体系的理解

浅谈Spring知识体系 Spring Framework架构图Spring家族技术生态全景图XMind汇总 本文不涉及细节&#xff0c;主要回答两个问题&#xff1a; Spring家族技术生态全景图有哪些Spring Framework架构下每个模块有哪些东西&#xff0c;以及部分模块之间的关联关系 Spring Framework架…