You will learn
ALV Grid
”)Step 1: Open your ABAP program and remove the WRITE statement
First, open your ABAP program, ZSO_INVOICE_ITEMS_EURO
which you created in the previous tutorial, Create and run an ABAP application.
Remove the existing method implementation for the run
method.
完成
Step 2: Create an instance of a new global class
Now you will create the an object with the type of a new global class, for retrieving backend data.
run
method, create an instance of class zcl_invoice_retrieval
using the new
operator:ABAP
Copy
data(invoices) = new ZCL_INVOICE_RETRIEVAL( ).
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
:
A wizard will appear to create a new ABAP class. Enter:
ZCL_INVOICE_RETRIEVAL
Choose Finish:
A new editor will be opened showing the class you have created, ZCL_INVOICE_RETRIEVAL
.
Since release 7.40, ABAP permits inline declarations. For more information, see: - Old and new ABAP syntax – overview sheet - 7.4 Release News - Inline Declaration I
完成
Step 3: 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.
完成
Step 4: 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:
Still in your program, enter an instance method call:
ABAP
Copy
data(invoice_items) = invoices->get_items_from_db( ).
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
In the Create class wizard that appears, create a public method without parameters, simply by choosing Finish:
In the class ZCL_INVOICE_RETRIEVAL
, the Quick Assist creates:
完成
Step 5: 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 using 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 3. below).
Go back to the SQL console:
Resize the query section and copy the Open SQL statement using the shortcut Ctrl+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)
.
ABAP
Copy
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. Delete it.
完成
Step 6: Format your code
Now you can format (that is, “pretty-print”) the source code.
Open the Source menu and choose Format (or 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.
To make the SELECT
statement more readable, add some line breaks in the JOIN
conditions:
完成
Step 7: 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 an internal table, lt_result
explicitly. Then we will define the type of the returning parameter for your method get_items_from_db
.
First position the cursor on the inline declared variable lt_result
and open Quick Fix by choosing Ctrl+1:
Select Declare local variable lt_result
explicitly by double clicking in the Quick Fix menu:
This creates an internal table referring to a local type and automatically generates the following code:
ABAP
Copy
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
.The @
character is simply an escape character to comply with the new Open SQL syntax. For more information, see: - 7.4 Release News - Inline Declaration I
完成
Step 8: 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
:
In the method get_items_from_db
, change the type of the variable lt_result
to a standard table of zso_invoice_item
:
Remove the local type helper_type
:
完成
Step 9: 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.
To do so place the cursor on the variable lt_result
and get the Quick Assist by entering Ctrl+1.
Choose Convert lt_result
to returning parameter:
Note that the returning parameter was added to the method and an additional table type based on the structure was generated:
完成
Step 10: Save and activate your class
Save ( Ctrl+S ) and Activate ( Ctrl+F3 ) your class.
完成
Step 11: 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:
完成
Step 12: 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
:
cl_salv_table=>
and get the code completion proposals by entering Ctrl+SPACEfactory
and …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.
完成
Step 13: Adapt the ALV Grid factory method
In the method call that you have generated:
list_display, r_container, and container_name
using the shortcut Ctrl+Dr_salv_table
using the shortcut Ctrl+7 and manually assign an inline variable alv_table
to itinvoice_items
to the changing parameter t_table
ALV_TABLE
: alv_table->display( )
:Your method should look like this:
ABAP
Copy
cl_salv_table=>factory(
IMPORTING
r_salv_table = data(alv_table)
CHANGING
t_table = invoice_items ).
alv_table->display( ).
完成
Step 14: Check your code
Your program code should now look like this:
ABAP
Copy
*&---------------------------------------------------------------------*
*& Report zjp_invoice_items_euro
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zjp_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) = 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:
ABAP
Copy
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.
完成
Step 15: 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:
完成
Step 16: Test yourself
Using the METHODS statement, create the definition of an instance method get_customers_from_db
that returns a value result
of type ty_table_of_customers
(similar to lines 358-360 of the code above.)
Do not indent your code.
Enter your code in the box below and choose Submit Answer.