SAP 01-初识AMDP(ABAP-Managed Database Procedure)

1. 什么是AMDP(ABAP-Managed Database Procedure)

1.)AMDP - ABAP管理数据库程序,是一种程序,我们可以使用SQLSCRIPT在AMDP内部编写代码,SQLSCRIPT是一种与SQL脚本相同的数据库语言,这种语言易于理解和编码。 将AMDP方法内的逻辑编码后,可以在ABAP报表中使用,也可以在CDS Table Function中使用AMDP方法。

2.)使用AMDP,可以将ABAP Application编写的代码通过HANA的新特性(代码下推技术),将逻辑在数据库层执行。

2. AMDP的弊端

1.)AMDP还不能在Eclipse、HANA Studio上进行Debug操作

2.)不能使用mseg表,但可以使用 MATDOC的代理对象 NSDM_V_MSEG 代替

3.)数据类型必须是表或者标准类型(INT CHAR ...)

4.)对于传入的Select-option,必须先在ABAP中用方法 cl_shdb_seltab=>combine_seltabs处理后在传入AMDP;然后在AMDP中用 APPLY_FILTER

5.)AMDP不能自动处理Client信息,使用时必须传入Client信息,并在ABDP中使用Where条件 SESSION_CONTEXT('CLIENT') 引入

3. 实现简单的AMDP Functions for AMDP Methods

1.)在Eclipse或者HANA Studio新建一个ABAP Class

2.)实现Class,必须注明实施的Interface:IF_AMDP_MARKER_HDB(目前只支持HDB,若未来支持其他DB;接口名称则为:IF_AMDP_MARKER_<DB_NAME>)

By database Procedure : 实现一个数据库过程。使用此方法,AMDP方法将自动在HANA系统中创建一个过程

FOR HDB : 指定数据库类型为 HANA database

LANGUAGE SQLSCRIPT : 指定用于实现AMDP的数据库特定语言为 SQLSCRIPT

OPTION READ-ONLY : 设置只能在数据库过程中读取

USING <table_name/view_name>: 设置使用的数据库表或视图

CLASS zamdp_demo001 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

PUBLIC SECTION.
    types:
        ty_mara type table of mara.         "这边先声明一下结构/表类型  不然下面方法exporting的type ***的时候会报一些有的没有的错误
    interfaces:
        IF_AMDP_MARKER_HDB.
    class-methods:
        get_data_back importing value(i_mandt) type mara-mandt
                      exporting value(et_mara) type ty_mara.    "如果上面没有声明,这边type会报错:The method "GET_DATA_BACK" contains a database procedure, which means that "ET_MARA" cannot have a structured type.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.



CLASS zamdp_demo001 IMPLEMENTATION.
    method get_data_back by database procedure
                         for hdb language sqlscript
                         options read-only
                         using mara makt.   "用到什么表都要写在这
*get_data   "这边左连接&右链接要加上outer,不然不能达到左连和右连的效果
    et_mara =
        with makt_tmp as ( select * from makt where maktx like '%12')
        select a.*
          from mara as a
          right outer join makt_tmp as b on a.matnr = b.matnr
            where a.mandt = :i_mandt;
    endmethod.
ENDCLASS.

4. 在ABAP中调用AMDP

*&---------------------------------------------------------------------*
*& Report ZTMP_TEST_IT029
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTMP_TEST_IT029.

DATA: lt_mara TYPE TABLE OF mara.

START-OF-SELECTION.
  IF cl_abap_dbfeatures=>use_features(
            EXPORTING
              requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method )
                                            ( cl_abap_dbfeatures=>amdp_table_function ) ) ).
    zamdp_demo001=>get_data_back(
            EXPORTING
              i_mandt = sy-mandt
            IMPORTING
              et_mara = lt_mara ).

    cl_demo_output=>display( lt_mara ).
  ELSE.
    cl_demo_output=>display( '警告!当前系统不支持AMDP.' ).
  ENDIF.
相关推荐
bin91531 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
月光水岸New2 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
晴空万里藏片云3 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一3 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球3 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7233 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql