Skip to Content
Previous

Create a Global ABAP Class

By D028018

You will learn how to create a global ABAP class, in which you will retrieve data from a database.

Details

Now, you will put all these together: In the ABAP program, you will:
- create a global class
- …which retrieves data from the back end by using the Data Preview and SQL tools
- … then uses the ABAP structure as a type for the returning parameter.
Encapsulating the data retrieval logic in a global ABAP class enables you to separate concerns properly and become familiar with a wider tool set.
Finally, you will learn how to display the data in a SAP List Viewer (“ALV Grid”).


Step 1: Open your ABAP program

First, open your ABAP program, ZSO_INVOICE_ITEMS_EURO which you created in the previous tutorial, Create and run an ABAP application.

Image depicting step1-open-abap-program
Please log in to access this content.
Step 2: Delete the WRITE statement

In the program ZSO_INVOICE_ITEMS_EURO, remove the WRITE statement: Delete the whole line, by placing the cursor somewhere in the WRITE statement and choosing Ctrl+D:

Image depicting step2-delete-write
Please log in to access this content.
Step 3: Create the global class

Now create the global class for the data retrieval:

a. In the run method, create a local variable of the type type ref to zcl_invoice_retrieval:

data: invoices type ref to zcl_invoice_retrieval.

b. Since this class does not yet exist, you will get a syntax error. To create the class, place the cursor on the class name and open the Quick Assist by choosing Ctrl+1. In the Quick Assist menu, double-click on Create global class zcl_invoice_retrieval:

Image depicting step3-create-class

c. A wizard will appear to create a new ABAP class. Enter:
- a name ZCL_INVOICE_RETRIEVAL
- a description invoice Retrieval

d. Choose Finish:

Image depicting step3a-create-class-wizard

A new editor will be opened showing the class you have created, ZCL_INVOICE_RETRIEVAL.

Please log in to access this content.
Step 4: Check the syntax

If necessary, go back to your program and trigger the syntax check using the keyboard shortcut Ctrl+F2.

The syntax error should no longer occur.

Please log in to access this content.
Step 5: Instantiate the class

Still in your program, create an instance of class zcl_invoice_retrieval using the new operator:

Image depicting step5-instantiate-class
Please log in to access this content.
Step 6: Create a method to get the database records

To read the records from the database, you need to call a method get_items_from_db.
This method does not yet exist so we will create it with a Quick Assist as follows:

a. Still in your program, enter a method call:

invoices->get_items_from_db

b. Since the method does not exist, you will get an error. Position the cursor on the name of the missing method and choose Quick Assist (Ctrl+1). In the Quick Assist menu, choose Create method get_items_from_db

Image depicting step6a-create-method

c. In the Create class wizard that appears, create a public method without parameters, simply by choosing Finish:

Image depicting step6b-finish

In the class ZCL_INVOICE_RETRIEVAL, the Quick Assist creates:
- a method definition
- an empty method implementation :

Image depicting step6c-empty-method
Please log in to access this content.
Step 7: Add the method implementation

In a previous tutorial (Display database content and run SQL queries), you generated a SELECT statement using the SQL console. The advantage of using the SQL console is that you can reduce errors by defining clauses - like JOIN, WHERE, or ORDER BY - simply by manipulating the Data Preview. The SQL Console automatically generates the correct SELECT statement for you.
You will now use this generated SELECT statement in your class to retrieve the data from the database.
Note: We strongly recommend that you gain an understanding of the SQL Console by working through this previous tutorial. However, if you no longer have the SQL console open, you can simply copy the following SELECT statement into the method implementation (see step c. below).

a. Go back to the SQL console:

Image depicting step9-sql-console-bar

b. Resize the query section and copy the Open SQL statement using the shortcut Ctrl+C:

Image depicting step8-sql-console

c. Now, in your class ZCL_INVOICE_RETRIEVAL, paste the statement into the method implementation of get_items_from_db (using Ctrl+V):

The code from the SQL console should look like this. Note that the SQL Console query section automatically adds the INTO clause INTO TABLE @DATA(LT_RESULT) :

SELECT
   SNWD_BPA~COMPANY_NAME,
   SNWD_SO_INV_ITEM~GROSS_AMOUNT,
   SNWD_SO_INV_ITEM~CURRENCY_CODE,
   SNWD_SO_INV_HEAD~PAYMENT_STATUS
 FROM
  SNWD_SO_INV_ITEM JOIN SNWD_SO_INV_HEAD ON SNWD_SO_INV_ITEM~PARENT_KEY = SNWD_SO_INV_HEAD~NODE_KEY JOIN SNWD_BPA ON SNWD_SO_INV_HEAD~BUYER_GUID = SNWD_BPA~NODE_KEY
 WHERE
  SNWD_SO_INV_ITEM~CURRENCY_CODE = 'USD'
 ORDER BY  SNWD_BPA~COMPANY_NAME
 INTO TABLE @DATA(LT_RESULT).
 UP TO 100 ROWS.

The statement UP TO 100 ROWS will cause an error. You will fix this in the next step.

Please log in to access this content.
Step 8: Format the code

Now you can format (that is, “pretty-print”) the source code: Open the Source menu and choose Format. (Alternatively you can use the shortcut Shift+F1).

If you want to specify your formatting settings, you can do this in the project’s properties. Right-click on the Project in the Project Explorer and choose Properties.

Image depicting step9-pretty-print

a. Delete the addition UP TO 100 ROWS.

b. To make the SELECT statement more readable, add some line breaks in the JOIN conditions:

Image depicting step9a-pretty-print-2
Please log in to access this content.
Step 9: Declare the local variable explicitly

In a previous tutorial (Create a structure), you created an ABAP Data Dictionary structure. Now, you will use this structure:
First, we will declare a local variable, lt_result, explicitly. Then, using this structure, we will define the type. of the returning parameter for your method get_items_from_db.
a. First position the cursor on the inline declared variable lt_result and open Quick Fix by choosing Ctrl+1:

Image depicting step9a-select-local-variable

b. Select Declare local variable lt_result explicitly by double clicking in the Quick Fix menu:

Image depicting step9b-declare-explicitly

This creates a local variable referring to a local type and automatically generates the following code:

```ABAP

TYPES: BEGIN OF helper_type,
company_name TYPE snwd_bpa-company_name,
gross_amount TYPE snwd_so_inv_item-gross_amount,
currency_code TYPE snwd_so_inv_item-currency_code,
payment_status TYPE snwd_so_inv_head-payment_status,
END OF helper_type.
DATA: lt_result TYPE STANDARD TABLE OF helper_type.`

```

It also replaces INTO TABLE @DATA(lt_result) with INTO TABLE @lt_result

Please log in to access this content.
Step 10: Replace helper_type with Dictionary structure

In the next steps, you will replace the local type helper_type with the Data Dictionary structure that you created (in the previous tutorial Create an ABAP Data Dictionary structure).

Still in the editor of your invoice retrieval class ZCL_INVOICE_RETRIEVAL :
a. In the method get_items_from_db, change the type of the variable lt_result to a standard table of zso_invoice_item:

Image depicting step13-replace-helper-type

b. Remove the local type helper_type:

Image depicting step13a-remove-helper-type
Please log in to access this content.
Step 11: Declare the local variable as a returning parameter

Your method still does not return any data. Therefore, you will use another Quick Assist to convert your local variable as a returning parameter - so that you can access the result from your program:

a. To do so place the cursor on the variable lt_result and get the Quick Assist by entering Ctrl+1.

b. Choose Convert lt_result to returning parameter:

Image depicting step13b-convert-lt_result_correct

Note that the returning parameter was added to the method and an additional table type based on the structure was generated:

Image depicting step11-parameter-and-type-added
Please log in to access this content.
Step 12: Save and Activate your class

Save ( Ctrl+S ) and Activate ( Ctrl+F3 ) your class.

Please log in to access this content.
Step 13: Use the returning parameter in the program

Now, in your program, declare an inline declared variable, data(invoice_items), to receive the result of the returning parameter invoices->get_items_from_db( ) as follows:

Image depicting step12-declare-inline-variable
Please log in to access this content.
Step 14: Generating the ALV Grid

Finally, you can display the invoice items as a SAP List Viewer (“ALV Grid”)using the class cl_salv_table.

In your program, ZSO_INVOICE_ITEMS_EURO:
a. Enter cl_salv_table=> and get the code completion proposals by entering Ctrl+SPACE
b. Select the static method factory and …
c. Insert the full signature of the method call by pressing Shift+Enter :

Image depicting step12-insert-alv-grid-v2

If you prefer to insert the full signature by default, you can change the behavior of the code completion in the Preferences. Select Window in the menu and click on Preferences. In the Preferences Dialog enter code completion in the filter field or open the following path ABAP Development > Editors > Source Code Editors > Code Completion. In the Code Completion settings, you can activate a checkbox to Always insert full signature on completion.

Please log in to access this content.
Step 15: Adapt the ALV Grid factory method

In the method call that you have generated:

a. Remove the commented exporting parameters list_display, r_container, and container_name using the shortcut Ctrl+D

b. Uncomment the importing parameter r_salv_table using the shortcut Ctrl+7 and manually assign an inline variable alv_table to it

c. Assign the variable invoice_items to the changing parameter t_table

d. Then call the display method of ALV_TABLE : alv_table->display( ) :

Your method should look like this:

cl_salv_table=>factory(

         IMPORTING
           r_salv_table   =     data(alv_table)

          CHANGING
            t_table        = invoice_items ).

       alv_table->display(  ).
Please log in to access this content.
Step 16: Save and activate the program

Activate your program by clicking the activation icon in the toolbar or using the keyboard shortcut Ctrl+F3.
Now run the program. You should get a SAP List Viewer roughly like this:

Image depicting step23-display-in-alv-grid

Your program code should now look like this:

*&---------------------------------------------------------------------*
*& Report z_invoice_items_euro
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_invoice_items_euro.

class lcl_main definition create private.

  public section.
    CLASS-METHODS create
      RETURNING
        value(r_result) TYPE REF TO lcl_main.

    methods run.

  protected section.
  private section.

endclass.

class lcl_main implementation.
  method create.
    create object r_result.
  endmethod.

  method run.
    data: invoices type ref to zcl_invoice_retrieval.
    invoices = new ZCL_INVOICE_RETRIEVAL( ).

    data(invoice_items) = invoices->get_items_from_db( ).

       cl_salv_table=>factory(

         IMPORTING
           r_salv_table   =     data(alv_table)

          CHANGING
            t_table        = invoice_items ).

       alv_table->display(  ).

 endmethod.
endclass.

start-of-selection.
lcl_main=>create( )->run( ).

Your class code should now look like this:

CLASS zcl_invoice_retrieval DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    TYPES: ty_table_of_zso_invoice_item TYPE STANDARD TABLE OF zso_invoice_item WITH DEFAULT KEY.

    METHODS get_items_from_db
              RETURNING
                VALUE(lt_result) type ty_table_of_zso_invoice_item.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_invoice_retrieval IMPLEMENTATION.

  METHOD get_items_from_db.

  SELECT
    snwd_bpa~company_name,
    snwd_so_inv_item~gross_amount,
    snwd_so_inv_item~currency_code,
    snwd_so_inv_head~payment_status

  FROM
   snwd_so_inv_item
   JOIN snwd_so_inv_head ON snwd_so_inv_item~parent_key = snwd_so_inv_head~node_key
   JOIN snwd_bpa ON snwd_so_inv_head~buyer_guid = snwd_bpa~node_key

   INTO TABLE @lt_result

  WHERE
   snwd_so_inv_item~currency_code = 'USD'

  ORDER BY
   snwd_bpa~company_name.

    ENDMETHOD.
ENDCLASS.

Please log in to access this content.

Next Steps: Optional

Updated 08/02/2017

Time to Complete

30 Min

Beginner

Tags

Prerequisites

Next
Back to top