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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个 ABAP RSA 加密代码的示例: ``` DATA: lv_key_string TYPE string, lv_input_string TYPE string, lv_output_string TYPE string. DATA(lv_key) = cl_abap_rsa_public_key_util=>create_public_key( lv_key_string ). cl_abap_rsa_util=>encrypt( public_key = lv_key input = lv_input_string output = lv_output_string ). ``` 在这个代码示例中,lv_key_string 是公钥字符串,lv_input_string 是要加密的字符串,lv_output_string 将存储加密后的字符串。 首先使用 `cl_abap_rsa_public_key_util=>create_public_key` 函数创建公钥对象,然后使用 `cl_abap_rsa_util=>encrypt` 函数对输入字符串进行加密。 希望这个示例对你有帮助!如果你有更多问题,请随时追问。 ### 回答2: ABAP语言中的RSA加密代码示例如下: DATA: lv_private_key TYPE string, " 私钥 lv_public_key TYPE string, " 公钥 lv_plain_text TYPE string, " 明文 lv_encrypted_text TYPE string. " 加密后的密文 lv_private_key = '私钥值' . " 设置私钥 lv_public_key = '公钥值' . " 设置公钥 lv_plain_text = '需要加密的明文' . " 设置需要加密的明文 " 使用RSA类库进行加密 TRY. CALL METHOD cl_abap_rsa=>encrypt EXPORTING i_text = lv_plain_text " 需要加密的明文 i_rkey_priv = lv_private_key " 私钥 i_rkey_pub = lv_public_key " 公钥 RECEIVING e_encrypted_text = lv_encrypted_text. " 加密后的密文 CATCH cx_sy_conversion_error. " 失败处理 ENDTRY. 以上代码首先设置了需要使用的私钥和公钥,然后设置需要加密的明文。之后使用ABAP提供的RSA类库的encrypt方法进行加密操作,将明文、私钥和公钥作为输入参数,将加密后的密文存储在lv_encrypted_text变量中。在异常处理部分,可以添加相应的错误处理逻辑。 需要注意的是,为了能够执行该代码,系统必须支持RSA类库,并且需要正确配置私钥和公钥的值。 ### 回答3: ABAP是一个高级商务应用编程语言,RSA是一种非对称加密算法。 下面是一个ABAP示例代码,演示如何使用RSA加密: 1. 导入所需类和接口: ```abap DATA: lr_rsa TYPE REF TO if_crypt. DATA: lx_exception TYPE REF TO cx_root. TRY. cl_crypt_provider=>create_by_algorithm( EXPORTING algorithm = 'RSA' RECEIVING provider = lr_rsa ). CATCH cx_root INTO lx_exception. WRITE 'Error occurred when creating RSA provider: ' && lx_exception->get_text( ). EXIT. ENDTRY. ``` 2. 生成RSA密钥对: ```abap DATA: lr_key_pair TYPE REF TO if_crypt_keypair. TRY. lr_key_pair = lr_rsa->generate_keypair( i_key_length = 2048 ). CATCH cx_root INTO lx_exception. WRITE 'Error occurred when generating RSA key pair: ' && lx_exception->get_text( ). EXIT. ENDTRY. DATA(lv_private_key) = lr_key_pair->get_private_key( ). DATA(lv_public_key) = lr_key_pair->get_public_key( ). ``` 3. 使用公钥加密数据: ```abap DATA: lv_data TYPE string VALUE 'Hello RSA Encryption!'. DATA: lv_encrypted TYPE string. TRY. lv_encrypted = lr_rsa->encrypt( EXPORTING i_key = lv_public_key i_algorithm = 'RSA' i_encrypting_data = lv_data ). CATCH cx_root INTO lx_exception. WRITE 'Error occurred when encrypting data with RSA: ' && lx_exception->get_text( ). EXIT. ENDTRY. ``` 4. 使用私钥解密数据: ```abap DATA: lv_decrypted TYPE string. TRY. lv_decrypted = lr_rsa->decrypt( EXPORTING i_key = lv_private_key i_algorithm = 'RSA' i_encrypting_data = lv_encrypted ). CATCH cx_root INTO lx_exception. WRITE 'Error occurred when decrypting data with RSA: ' && lx_exception->get_text( ). EXIT. ENDTRY. WRITE lv_decrypted. ``` 这个示例展示了如何在ABAP中使用RSA加密算法。首先,我们创建了一个RSA加密提供者,然后使用它生成了一个RSA密钥对。接下来,我们使用公钥对数据进行加密,然后使用私钥对其进行解密并输出结果。 请注意,这只是一个简单的示例代码,实际使用中可能需要进一步处理异常情况和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值