Tuesday, 20 April 2021

BAdI Implementation in ABAP on HANA for BW Extractors

Introduction:

BAdI Enhancement for BW Extractors in S/4 HANA system.

The Logic for the enhancement of BW datasource is traditionally written in ABAP Function Module Exit or ABAP BAdI. But, now with S/4 HANA, BAdI is the default place to write the logic for Enhancement (Function Module Exit is still available but might not be going forward).

With S/4 HANA we have a flexibility to write logic in HANA Optimized ABAP code using new coding techniques (New Open SQL syntax).

The new HANA approach is to push our code to the database layer where all the data resides, do the calculations at database layer and bring only the relevant records to presentation layer.

This blog gives approach from a BW Consultant Perspective on BAdI development for BW extractor in ABAP on HANA

Requirement:-

In our Project we had requirement to enhance the 0FI_ACDOCA_10 extractors in S/4 HANA (Central Finance) System.

We were not be using the traditional ABAP as we can leverage more power from ABAP on HANA.

Development:-

To start the development we have to know the fields which are going to be enhanced and the base table for that fields. In our example we have taken NETDT (Net Due Date) field from ACDOCA table itself. (This field is not present in extractor itself and hence we are doing Append in Structure)

Step 1: Append the Structure of Datasource 0FI_ACDOCA_10

Go to the Eclipse ABAP Perspective and find extract structure for the datasource 0FI_ACDOCA_10.

Then create an Append structure and provide the field details.

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

The Structure ZAFINS_ACDOCA_BW is created for single field ZZNETDT.

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

When the structure is created first, the Line number 2 will say: #NOT_EXTENSIBLE, change this to :#EXTENSIBLE_CHARACTER_NUMERIC then only it will allow to extend the structure

Once the Structure is enhanced, a small icon will appear in the left of define structure, that Icon is enhancement indicator/append indicator to see if we have any extension to this structure.

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

The Structure can be seen by scrolling on the icon.

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

If required, we can also switch back to SAP GUI familiar screen by right clicking in the blank space and navigate to SAP GUI.

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

Now the Extract structure of the datasource is enhanced, next Step is create a Class Implementation.

Step 2: Create a Class and Method in SE18/19 – GUI

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

Step 3: Write the logic to populate the data in the Appended field in ABAP Perspective..

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

The logic is written in new HANA Optimized ABAP code, this code will do the calculation in the database layer result in performance improvement.

BAdI Implementation Code:

Below is the Code for BAdI written in Eclipse:-

  FIELD-SYMBOLS:  <l_s_data> TYPE FINS_ACDOCA_BW.

  Case i_datasource.
        WHEN '0FI_ACDOCA_10'.

     LOOP AT C_T_DATA ASSIGNING <l_s_data>.
       select from ACDOCA AS a
       FIELDS a~netdt
        WHERE a~rldnr  = @<l_s_data>-rldnr
         and  a~rbukrs = @<l_s_data>-rbukrs
         and  a~gjahr  = @<l_s_data>-gjahr
         and  a~belnr  = @<l_s_data>-belnr
         and  a~docln  = @<l_s_data>-docln
        INTO ( @<l_s_data>-zznetdt ).
       ENDSELECT.
     ENDLOOP.
  ENDCASE.

Explanation of Code:-

In this new approach of coding, the variables have a prefix @, this a new annotation based coding which can also be seen in ABAP CDS view.

This is a simple level of code where select statement in written under loop. In normal ABAP it will be an expensive statement, but with ABAP on HANA this will work pretty fast.

But if you are dealing with a more than 100 millions or billions of records, then this logic can also start giving performance impact.

How can we optimize this:-

In normal ABAP we use to select the relevant records from required table with respect of all the entries present in our C_T_DATA, and then we loop the C_T_DATA and read the internal table to populate the newly enhance field .

“For All Entries” statement is nothing but an inner-join between the two tables.

Hence, please find the optimized code below:-

types: begin of ls_acdoca,

         rldnr type fins_ledger,
         rbukrs type bukrs,
         gjahr type gjahr,
         belnr type belnr_d,
         docln type docln6,
         netdt type netdt,

       end of ls_acdoca.

  DATA: it_acdoca TYPE STANDARD TABLE OF ls_acdoca,
        SOURCE_DATA TYPE STANDARD TABLE OF FINS_ACDOCA_BW,
         wa_data TYPE FINS_ACDOCA_BW.
  FIELD-SYMBOLS: <fs_acdoca> type ls_acdoca,
                 <l_s_data> TYPE FINS_ACDOCA_BW.

sort SOURCE_DATA BY rldnr rbukrs gjahr belnr docln.

  Case i_datasource.
        WHEN '0FI_ACDOCA_10'.

IF C_T_DATA is not initial.
SOURCE_DATA[] = C_T_DATA[].

      select a~rldnr, a~rbukrs, a~gjahr, a~belnr, a~docln, a~netdt
      from acdoca as a
      INNER JOIN @SOURCE_DATA AS b
      ON  a~rldnr  = b~rldnr
      AND a~rbukrs = b~rbukrs
      AND a~gjahr  = b~gjahr
      AND a~belnr  = b~belnr
      AND a~docln  = b~docln
      into TABLE @it_acdoca.
ENDIF.

SORT it_acdoca BY rldnr rbukrs gjahr belnr docln.

LOOP AT C_T_DATA ASSIGNING <l_s_data>.
     READ TABLE it_acdoca
     ASSIGNING <fs_acdoca>
     with key rldnr  = <l_s_data>-rldnr
              rbukrs = <l_s_data>-rbukrs
              gjahr  = <l_s_data>-gjahr
              belnr  = <l_s_data>-belnr
              docln  = <l_s_data>-docln.
        if sy-subrc = 0.
             <l_s_data>-zznetdt = <fs_acdoca>-netdt.
         endif.
     ENDLOOP.

    clear SOURCE_DATA.

  ENDCASE.

Explanation of Code:

Required fields are selected from the table ACDOCA with all entries in the C_T_DATA on Key Fields of the table.

As discussed above “For All Entries” statement is nothing but an inner-join between the two tables.

Hence you can see inner join between table ACDOCA and SOURCE_DATA (Copied from C_T_DATA) in the code. It will select only required records from ACDOCA table and stores in internal table. The internal table will read when looping the C_T_DATA to populate the field ZZNETDT.

This blogs gives the basics of coding done in ABAP on HANA approach from a BW Consultant Perspective.

Result of the Extractor

SAP ABAP Certification, SAP ABAP Tutorial and Material, SAP ABAP Preparation, SAP ABAP Career, SAP HANA Exam, SAP HANA Career

The field ZZNETDT is populated as shown in the screenshot

No comments:

Post a Comment