Cerca nel blog

mercoledì 21 settembre 2022

AMDP - ABAP Managed Database Procedures

 

AMDP 

Prerequisiti:

·       Strumento ADT in Eclipse o HANA Studio

·       SAP HANA Db 1.0 o versioni successive

·       SAP NW AS ABAP 7.5 o versioni successive

AMDP - ABAP Managed Database Procedures, è una procedura dove possiamo scrivere codice all'interno utilizzando SQLSCRIPT che è un linguaggio di database uguale allo script SQL, questo linguaggio è facile da capire e codificare. Dopo aver codificato la logica all'interno del metodo AMDP, è possibile utilizzarla nel report ABAP o utilizzare AMDP come metodo delegato nella funzione tabella CDS.

Limitazioni:

Possiamo solo creare, eseguire il debug di AMDP nel bundle ADT o nello studio HANA.

Con AMDP, non possiamo usare la tabella MSEG. Quindi, possiamo invece utilizzare la tabella MATDOC o l'oggetto proxy (NSDM_V_MSEG).

Il tipo di dati del parametro deve essere di tipo tabella o scalare (Int, char,...).

Con i parametri dell'opzione select, dobbiamo convertire in valore stringa utilizzando il metodo cl_shdb_seltab=>combine_seltabs nel programma ABAP, quindi passarlo ai parametri. Successivamente, utilizzeremo APPLY_FILTER per filtrare questa condizione all'interno del metodo AMDP

AMDP non gestisce il client automatico. È necessario aggiungere client come valore del parametro o utilizzare SESSION_CONTEXT('CLIENT') nella condizione di where.

Primo programma con AMDP

1.     Crea una classe utilizzando lo strumento Eclipse.

Innanzitutto, dobbiamo fare clic con il pulsante destro del mouse su un Package -> New -> ABAP Class per creare una nuova classe.



     Inseriamo un Nome della classe (ad esempio >ZCL_AMDP_MARA) e descrizione (due campi obbligatori),

   quindi fare clic su Avanti.


 

Crea una nuova richiesta di trasporto e compila il campo della descrizione (se hai già TR, magari usalo). Quindi, fai clic su Avanti

 

Fare clic su Fine per completare questo processo e abbiamo creato la classe con successo.

 

2.     Dichiarare il metodo AMDP in classe

 

Poiché il tipo di struttura e tabella verrà riutilizzato nel programma ABAP, quindi lo creerò nella GUI SAP (tcode SE11).

Creare la struttura ZST_MARA



Creare il tipo tabella  ZTT_MARA.


 

Quando si utilizza AMDP, è necessario aggiungere l'interfaccia IF_AMDP_MARKER_HDB (obbligatorio), se non la si aggiunge, non è possibile utilizzare alcuna funzionalità del metodo AMDP.

In Eclipse modifichiamo la classe ZCL_AMDP_MARA creata in precedenza in questo  modo:

 

- Dobbiamo aggiungere alcune opzioni al metodo AMDP (nell'implementazione della classe):

- By database Procedure per implementare una procedura per banca dati. In questa opzione, il tuo metodo AMDP creerà automaticamente una procedura nel sistema HANA

- FOR HDB per indicare il database HANA

- LANGUAGE SQLSCRIPT per indicare il linguaggio specifico del database in cui è implementato AMDP

- OPTION READ-ONLY indica che possiamo leggere solo nella procedura del database

- USING di <nome tabella/vista>: se si utilizzano tabelle in questa procedura, indicare il nome della tabella in questa opzione

 

CLASS zcl_amdp_mara DEFINITION

  PUBLIC

  FINAL

  CREATE PUBLIC .

   PUBLIC SECTION.

*  1. Creare la dichiarazione dell'Interfaccia per usare il metodo AMDP

    INTERFACES:

        IF_AMDP_MARKER_HDB.

 *    2. Dichiarare il metodo STATICO. Questo metodo AMDP legge di dati

*       dalla tabella MARA e mostra il risultato in un programma ABAP

        CLASS-METHODS:

            GET_DATA_FROM_MARA

                IMPORTING

                    VALUE(IP_MANDT) type MARA-MANDT

                    VALUE(IP_MATNR) type MARA-MATNR

                    VALUE(IP_SPRAS) type MAKT-SPRAS DEFAULT 'I'

                EXPORTING

                    VALUE(ET_MARA) type ZTT_MARA.

   PROTECTED SECTION.

  PRIVATE SECTION.

ENDCLASS.

 

CLASS zcl_amdp_mara IMPLEMENTATION.

  METHOD get_data_from_mara

    BY DATABASE PROCEDURE

    FOR HDB LANGUAGE SQLSCRIPT

    OPTIONS READ-ONLY

    USING MARA MAKT.

 *  Dichiarazione variabile

   DECLARE lv_test NVARCHAR( 5 );

   lv_test := '->';

 *  LEGGO I DATI DALLA TABELLA MARA e MAKT

   ET_MARA =

        SELECT T1.MATNR,

               T1.MATKL,

               ( :lv_test || T2.MAKTX) AS MAKTX,

               T2.SPRAS

          FROM MARA AS T1

         INNER JOIN MAKT AS T2

                 ON T2.MANDT = T1.MANDT AND

                    T2.MATNR = T1.MATNR

         WHERE T2.SPRAS = :IP_SPRAS

           and T1.MANDT = :IP_MANDT

           and T1.MATNR = :IP_MATNR;

  ENDMETHOD.

ENDCLASS.

  

Salviamo e attiviamo.

NOTE:

All'interno del metodo AMDP, recupereremo i dati da MARA e MAKT (dichiarati in precedenza all'istruzione USING) con le condizioni specifiche che sono passate prima per parametro nella definizione della classe,

NCHAR( 32 ) come uno spazio nei caratteri ASCII. Voglio concatenare il codice materiale e la descrizione del materiale e separarli tra due valori per spazio, quindi userò NCHAR( 32 )

Poiché AMDP non può gestire il client, quindi è necessario passare il valore MANDT alla clausola where per ottenere esattamente il valore in questo sistema

Se vuoi creare una variabile all'interno del metodo AMDP, puoi usare DECLARE per creare. All'interno di AMDP, puoi creare sia il tipo SQL che il tipo in SAP.

Usando la funzione integrata LTRIM, rimuoverò lo zero iniziale prima del codice materiale (se presente)

Quindi, controlla la sintassi e attiva questa classe/metodo. Quindi, puoi richiamarlo nel programma ABAP

 

3.     Sviluppare un report ABAP per utilizzare il metodo AMDP

 

Crea il report utilizzando lo strumento Eclipse.

Innanzitutto, dobbiamo fare clic con il pulsante destro del mouse su un Package -> New -> Other ABAP Repository Object.

 


Nella pop-up successiva, selezionare ABAP Program .



Inserire il nome del programma (ad esempio: ZPRG_USING_AMDP) e la descrizione. quindi fare clic su Avanti



Crea una nuova richiesta di trasporto e compila il campo della descrizione (se hai già TR, magari usalo). Quindi, fai clic su Avanti

Fare clic su Fine per completare questo processo e abbiamo creato la classe con successo. 

In questo programma. Dobbiamo verificare che il sistema soddisfi i requisiti o meno, utilizzando la classe CL_ABAP_DB_FEATURES. Se non controlli, il sistema potrebbe rilevare problemi.

Dopo il controllo, chiamerai il tuo metodo AMDP e passerai i parametri corrispondenti (controlla il materiale nel tuo sistema e ottieni del codice materiale per passare questo metodo).

Utilizzo della classe CL_DEMO_OUTPUT per visualizzare il risultato sullo schermo.

Modifichiamo il nostro report in questo modo:

 

*&---------------------------------------------------------------------*

*& Report zprg_using_amdp

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

REPORT zprg_using_amdp.

TABLES: MARA.

SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.

SELECTION-SCREEN SKIP 1.

 

PARAMETERS: P_MATNR TYPE MARA-MATNR OBLIGATORY.

SELECTION-SCREEN: END OF BLOCK blk1.

data: GT_MARA type ZTT_MARA.

 

START-OF-SELECTION.

    FREE: GT_MARA[].

    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. PLEASE USE ANOTHER WAYS' ).

    ELSE.

        ZCL_AMDP_MARA=>GET_DATA_FROM_MARA(

            EXPORTING

                IP_MANDT = SY-MANDT

                IP_MATNR = P_MATNR

                IP_SPRAS = 'I'

            IMPORTING

                ET_MARA = GT_MARA

         ).

 

         CL_DEMO_OUTPUT=>DISPLAY_DATA(

            EXPORTING

                VALUE = GT_MARA[]

         ).

    ENDIF.

Esegui il programma



Questo è il risultato






Nessun commento:

Posta un commento