AMDP允许开荒者直接在ABAP中写数据仓库储存款和储蓄进程,不可能利用ABAP

ABAP处理下的数据库存款和储蓄进程(ABAP-Managed Database
Procedure,以下简称英特尔P)是在APAP on SAP
HANA开拓中的1种优化方式。AMDP使用数据库语言书写,比如Native
SQL恐怕是SQL
Script,并且在英特尔P类的英特尔P方法内完成。因而用它开辟数据仓库储存款和储蓄进度就有一点类似于编辑ABAP类。

Core data services(以下简称CDS)能够指两样东西,一个是HANA
CDS,一个是ABAP CDS

简易,AMDP允许开荒者直接在ABAP中写数据仓库储存款和储蓄进度。

如笔者辈所知,HANA CDS只扶助HANA数据库,ABAP
CDS理论上扶助各类数据库供应商,结果是,ABAP
CDS相比较之下要少一些效应。由此,在少数情状下,不可能使用ABAP
CDS消除难点时,能够应用一种退换的形式,即通过ABAP Managed Database
Procedures
(AMDP)创建ABAP CDS Table Function

 

 

本文链接:http://www.cnblogs.com/hhelibeb/p/7976533.html

正文链接:http://www.cnblogs.com/hhelibeb/p/8057788.html

转发请注明

注:本文的要紧理论内容已经包含在前头的英特尔P介绍文章:ABAP中的AMDP(ABAP-Managed
Database Procedures )

中,相比较它,本文更像三个step by step教程。

何以使用AMDP?

按SAP的官方建议,在能够行使Open
SQL完结内需的作用或优化指标的时候,不提出采纳AMDP。而在急需采用Open
SQL不设有的表征,也许是大气管理流和分析导致了数据库和应用服务器之间有双重的多量数目传输的意况下,则应该接纳速龙P。

切切实实的例证能够看看:AMDP, Comparison of SQLScript with Open
SQL

,

          SAP HANA, Currency Conversion with
SQLScript

   

AMDP还是能够提供以下好处:

  • SQL Script的静态代码检查
  • 语法高亮(扶助pretty printer格式优化器) 
  • 在IntelP内访问此外英特尔P方法、ABAP字典的视图和表 
  • 可以像平时的ABAP方法一致调用(不蕴含英特尔P function)  
  • 运用ST2贰举行运作时不当的详细分析    

介绍视频

ABAP CDS视图

在普通的ABAP
CDS视图开荒进度中,大家经过编辑器(平日是ADT)在ABAP层注脚了我们的字段结商谈annotations。激活后,系统会自动地在数码库层生成所有的SQL视图。

图片 1

ABAP
CDS视图提供三种SQL命令和函数的扶助,要是你想要精通细节和全路的可用特性,提出您看那篇文章:ABAP
CDS Feature
Matrix

语法

英特尔P在英特尔P类中完成,须要一个正式的静态方法或许实例方法,可知性放肆:

CLASS <my_amdp_class> DEFINITION.

  PUBLIC SECTION.
* 指定的Marker接口
  INTERFACES IF_AMDP_MARKER_<DB_TYPE>.
   ...

  METHODS <my_amdp_method>.
   ...

ENDCLASS.


CLASS <my_amdp_class> IMPLEMENTATION.

...

* AMDP 方法 
  METHOD <my_amdp_method> BY DATABASE PROCEDURE 
        FOR <db_type>
        LANGUAGE <db_language>
         OPTIONS <db_options>  
         USING   <db_entity>.

      "使用数据库语言实现存储过程
     ...

  ENDMETHOD.
    ...

ENDCLASS.

英特尔P类正是平常的类,并完毕IF_AMDP_MARKER_<DB_TYPE>接口。假诺是HANA数据库,那么正是贯彻接口IF_AMDP_MARKER_HDB。但是,即使条件上AMDP是为了协助种种数据库的仓库储存进程而存在的,但到如今(ABAP
7.5二)结束,英特尔P只协助SAP
HANA数据库。能够应用类CL_ABAP_DBFEATURES中的常量CALL_AMDP_METHOD来承认速龙P对近期数据库的援救。

ABAP CDS Table Function

在ABAP CDS Table
Function的成本进度中,大家将字段结构、参数(可选)、association等通过类/方法定义为实体。通过英特尔P大家能够一贯在ABAP层写存款和储蓄进度,并且把它封装在类/方法中,越来越多介绍能够看从前的稿子:ABAP中的AMDP(ABAP-Managed
Database Procedures

图片 2

因为英特尔P间接运转数据库脚本,所以须求做多少个附加的步骤并且会选择到脚本语言(在HANA中即SQL
Script)。稍后在演示部分大家构和论配备的细节。

经过上文介绍的那三种开垦技巧,大家能够发轫开辟1个本事演示了。按本文的事例做下去,你将会能够创造你自身的ABAP
CDS Table Function
,并且为不能够一直通过ABAP
CDS达成的要求提供消除方案。为了兑现示例,大家会利用数据库视图SFLIGHTS,这一视图提供了航班连接的底细。

简言之示例

示例类CL_DEMO_AMDP_SCAPAJERO奥迪Q3绑定了接口IF_AMDP_MARKER_HDB,并且带有英特尔P方法SELECT_SCARPRADO来从表SCA中华VCR-V中获取数据(我近些日子尚未对号入座的遇到,所以写了个ztest_amdp来替代示例):

CLASS ztest_amdp DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-DATA: scarr_tab TYPE ty_scarr.
    METHODS select_scarr IMPORTING VALUE(clnt)      TYPE mandt
                         EXPORTING VALUE(scarr_tab) TYPE ty_scarr.
ENDCLASS.


CLASS ztest_amdp IMPLEMENTATION.
  METHOD select_scarr
         BY DATABASE PROCEDURE FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING scarr.
    scarr_tab =
    SELECT *
           FROM "SCARR"
           WHERE mandt = clnt
           ORDER BY carrid;
  ENDMETHOD.
ENDCLASS.

 

以下代码能够用来调用方法、获取结果:

DATA result TYPE ty_scarr.

NEW ztest_amdp( )->select_scarr(
  EXPORTING clnt = sy-mandt
  IMPORTING scarr_tab = result ).

cl_demo_output=>display( result ). 

场景

各类航空集团提供世界上分裂城市的航班连接,用户想要在单一字段中来看某一特定航空集团协助的有着城市,内容以逗号分隔。因为每家航空集团的都市数是差异的,大家需求贰个逻辑来拼接城市们,无论有查询结果多少条数据。

在平日的ABAP
CDS内我们可以使用CONCAT函数,然则利用它的时候,我们须要定义固定数量的字段,既然CDS视图无法达成此处须求的管理动态逻辑,要怎么着管理吧?

那是3个行使ABAP CDS Table
Function的绝佳场景,因为我们得以应用简便的数据库函数STRING_AGG(String
Aggregation)。这些效应在SQL Script中可用,然而当前还是不协助ABAP
CDS视图。

AMDP方法

AMDP方法有三种达成,一种是AMDP
procedure
福如东海;另1种是AMDP
function
实现。

开发

开辟你的HANA Studio(可能ADT),创造3个新的Core Data Services ->
Data Definitio。

慎选project,package并且定义名字和描述:

图片 3

接纳传输请求,然后点击Next。在模板中挑选最终叁个取舍“Define Table
Function with Parameters”,然后点击Finish:

图片 4

 编辑生成的实体,包括以下内容:

  • 字段:
    • Client
    • Airline Code
    • Airline Name
    • Cities To
  • :
    ZCL_FLIGHTS_DEMO_CDS
  • 方法:
    FLIGHTS_CONNECTIONS

结果应该是:

define table function ZDEMO_FLIGHTS_TABLE_FUNCTION
returns
{
  client       : abap.clnt;
  airline_code : s_carr_id;
  airline_name : s_carrname;
  cities_to    : abap.string;
}
implemented by method
  ZCL_FLIGHTS_DEMO_CDS=>FLIGHTS_CONNECTIONS;

 当然,现在ZCL_FLIGHTS_DEMO_CDS还不存在。下一步,让大家创制它:

图片 5

让类包括IF_AMDP_MARKER_HDB接口。这一步会把您的ABAP类调换为英特尔P类,并且同目的在于类的办法内写存款和储蓄进程。

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

在措施达成中大家需求引进有些配置选项:

  • BY DATABASE FUNCTION: 会将艺术标志为table
    function,还有三个选取是因而 BY DATABASE
    PROCEDURE
    标识为存款和储蓄进程.
  • FOR HDB: 设定数据库类型为HDB (HANA数据库).
  • LANGUAGE SQLSCRIPT: HANA数据仓库储存储的语言.
  • OPTIONS READ-ONLY: 存款和储蓄进程内不允许修改数据.
  • USING: 定义table
    function中消费的多寡库表、视图恐怕存储进程。在本例中,只访问SFLIGHTS
    视图.

    METHOD flights_connections

    BY DATABASE FUNCTION
    FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING sflights.
    
    <<你的代码>>
    

    ENDMETHOD.

让大家筹划好查询分割逻辑的七个SELECT语句。

第一个SLECT须求获得Client, Airline Code, Airline Name和City
To字段,并由此DISTINCT关键字去重,因为大家会找到在区别的连接日期的一律的宇宙航行公司的都会记录,如图:

图片 6

速龙P的帮助和益处之一是你能够将SELECT的询问结果传输至“内表”,并且能够举行新的SELECT来读取它的数码。让大家应用那1效果的独到之处,并且将率先个SELECT的话语的查询结果命名叫itab_cities.

    itab_cities =
      SELECT DISTINCT 
             sflights.mandt    as client,
             sflights.carrid   as airline_code,
             sflights.carrname as airline_name,
             sflights.cityto   as city_to
        FROM sflights;

在其次个SELECT中,大家要从itab_cities中读取数据并且完结数据库方法STRING_AGG来聚合七个城市和飞行公司。为了贯彻那1功力我们供给基于Client,Airline
Code和Name字段GROUP BY条约。写法是:

    RETURN
      SELECT client,
             airline_code,
             airline_name,
             STRING_AGG(city_to, ', ' ORDER BY city_to) as cities_to
        FROM :itab_cities
       GROUP BY client,
                airline_code,
                airline_name;

注意:table
function应永远有重返参数,所以记着在最后一个SELECT语句前放贰个RETU福特ExplorerN语句。其它,注意大家将字段名调换为前文中ABAP
CDS Table
Function注脚的字段名,假令你从未提供2个正好的别称,激活的时候编写翻译器会付出提醒。

 

ZCL_FLIGHTS_DEMO_CDS的末尾版本是那样的:

CLASS zcl_flights_demo_cds DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

    CLASS-METHODS:
      flights_connections FOR TABLE FUNCTION zdemo_flights_table_function.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_flights_demo_cds IMPLEMENTATION.

  METHOD flights_connections
    BY DATABASE FUNCTION
    FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING sflights.

    itab_cities =
      SELECT DISTINCT 
             sflights.mandt    as client,
             sflights.carrid   as airline_code,
             sflights.carrname as airline_name,
             sflights.cityto   as city_to
        FROM sflights;

    RETURN
      SELECT client,
             airline_code,
             airline_name,
             STRING_AGG(city_to, ', ' ORDER BY city_to) as cities_to
        FROM :itab_cities
       GROUP BY client,
                airline_code,
                airline_name;

  ENDMETHOD.

ENDCLASS.

在Data Preview中的结果:

图片 7

 

英文原稿:Concatenate multiple records in a single field using ABAP CDS
Table
Function

某些许改换

AMDP procedure实现

亟待采纳Method语句的附加项BY DATABASE
PROCEDURE。例子见上文。这种达成形式写成的章程和平日的ABAP对象方法在选取方式上没分别。

AMDP function实现

内需选取Method语句的附加项BY DATABASE
FUNCTION。它将英特尔P方法完毕为1个table function。

tips: table function

  table function是只读的用户定义的方法,可以接收多个输入参数。接收单一的表返回值。

  在SQL Scitpt中,table function可以在与数据库表或者视图相同的位置使用。

 

示范代码:

REPORT demo_amdp_functions_inpcl.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    IF NOT cl_abap_dbfeatures=>use_features(
          EXPORTING
            requested_features =
              VALUE #( ( cl_abap_dbfeatures=>call_amdp_method )
                       ( cl_abap_dbfeatures=>amdp_table_function ) ) ).
      cl_demo_output=>display(
        `System does not support AMDP or CDS table functions` ).
      RETURN.
    ENDIF.

    DATA carrid TYPE s_carr_id VALUE 'LH'.
    cl_demo_input=>request( CHANGING field = carrid ).
    carrid = to_upper( carrid ).

    "Database function selected in database procedure
    TRY.
        NEW cl_demo_amdp_functions_inpcl( )->select_get_scarr_spfli(
          EXPORTING clnt   = sy-mandt
                    carrid = carrid
          IMPORTING scarr_spfli_tab = DATA(result1) ).
      CATCH cx_amdp_error INTO DATA(amdp_error).
        cl_demo_output=>display( amdp_error->get_text( ) ).
        RETURN.
    ENDTRY.

    cl_demo_output=>display( result1 ).

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

 

地点这些事例访问的AMDP
function可以在类CL_DEMO_AMDP_FUNCTIONS_INPCL中看到。

方法GET_SCARR_SPFLI是二个AMDP
function实现,它是不可能从来在ABAP中做客的:

METHOD get_scarr_spfli BY DATABASE FUNCTION FOR HDB
                       LANGUAGE SQLSCRIPT
                       OPTIONS READ-ONLY
                       USING scarr spfli.
  RETURN SELECT sc.carrname, sp.connid, sp.cityfrom, sp.cityto
                FROM scarr AS sc
                  INNER JOIN spfli AS sp ON sc.mandt = sp.mandt AND
                                            sc.carrid = sp.carrid
                  WHERE sp.mandt = :clnt AND sp.carrid = :carrid
                  ORDER BY sc.mandt, sc.carrname, sp.connid;

ENDMETHOD.

 

而方法SELECT_GET_SCARR_SPFLI是一个英特尔P
procedure达成,它利用select从地点的function完结中获取数据。代码如下:

METHOD select_get_scarr_spfli
       BY DATABASE PROCEDURE FOR HDB
       LANGUAGE SQLSCRIPT
       OPTIONS READ-ONLY
       USING cl_demo_amdp_functions_inpcl=>get_scarr_spfli.
  SCARR_SPFLI_TAB =
  SELECT *
         FROM "CL_DEMO_AMDP_FUNCTIONS_INPCL=>GET_SCARR_SPFLI"(
                clnt => :clnt,
                carrid => :carrid );
ENDMETHOD.

 

也可以将英特尔P function达成为CDS table function。这里就不贴示例了。

 

有关AMDP实现的摄像教程

AMDP异常

英特尔P
procedure达成的不胜名前缀是CX_英特尔P。那一个非常都在目录CX_DYNAMIC_CHECK之下,必须使用RASING显式地在英特尔P
procedure达成的定义中宣称。

CX_ROOT
  |
  |–CX_DYNAMIC_CHECK
       |
       |–CX_AMDP_ERROR
           |
           |–CX_AMDP_VERSION_ERROR
           |    |
           |    |–CX_AMDP_VERSION_MISMATCH
           |
           |–CX_AMDP_CREATION_ERROR
           |    |
           |    |–CX_AMDP_CDS_CLIENT_MISMATCH
           |    |
           |    |–CX_AMDP_DBPROC_GENERATE_FAILED
           |    |
           |    |–CX_AMDP_DBPROC_CREATE_FAILED
           |    |
           |    |–CX_AMDP_NATIVE_DBCALL_FAILED
           |    |
           |    |–CX_AMDP_WRONG_DBSYS
           |
           |–CX_AMDP_EXECUTION_ERROR
           |    |
           |    |–CX_AMDP_EXECUTION_FAILED
           |    |
           |    |–CX_AMDP_IMPORT_TABLE_ERROR
           |    |
           |    |–CX_AMDP_RESULT_TABLE_ERROR
           |
           |–CX_AMDP_CONNECTION_ERROR
                |
                |–CX_AMDP_NO_CONNECTION
                |
                |–CX_AMDP_NO_CONNECTION_FOR_CALL
                |
                |–CX_AMDP_WRONG_CONNECTION

小心:速龙P
function未有相当类。

工具协理

速龙P在SAP NetWeaver AS ABAP 7.40
SP0伍版本中被引进。唯有基于Eclipse的开垦工具(即ADT,版本要不低于二.1九)才支撑英特尔P的编写制定,SAP
GUI上边的SE80是不提供编辑效率的,只可以用来阅读代码。

有关AMDP调试的摄像教程

总结

采取ABAP Managed Database Procedure(英特尔P)和CDS开辟,属于自上而下的ABAP
for
HANA开采情势。在行使层即ABAP程序中管理数据测算逻辑和建立模型,激活后会在HANA中开创相应的数据库对象。比较于旧有的Database
Procedure Proxy,英特尔P提供了简易的调用SQL Script等数据库语言的秘技。

 

参照他事他说加以调查作品:

[1] AMDP – ABAP Managed Database
Procedures

[2] ABAP Managed Database Procedures –
Introduction

[3] ABAP Development for SAP
HANA

[4] How to use AMDP Function implementation for a CDS Table Function
as a data source in CDS
views

任何材质:

SAP HANA SQL Script
Reference

ABAP CDS Table
Function介绍与示范

 

相关文章