ABAP 快速入门之 Hello World 和 ALV 列表
ABAP 是 SAP 开发的一种编程语言,用于在 SAP 环境中对业务应用程序进行编程。得益于 ABAP 对象增强功能,ABAP 以前只是过程性语言,现在也是一种面向对象语言。
ABAP 750 文档:ABAP Keyword Documentation (sap.com)
Hello World
PROGRAM zhello_world.
START-OF-SELECTION.
WRITE 'Hello, World!'.
ABAP 不会将值打印到控制台,而是写入一个列表,一旦主逻辑执行完毕,列表就会显示出来。
ABAP 面向对象 Hello World
PROGRAM zhello_world.
CLASS main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS: start.
ENDCLASS.
CLASS main IMPLEMENTATION.
METHOD start.
cl_demo_output=>display( 'Hello World!' ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
main=>start( ).
注释
- 行注释
同一行中 "
字符之后的任何文本都会被注释掉:
DATA lv_matnr TYPE matnr. " 这里是注释
- 块注释
*
字符注释整行。*
字符必须是该行的第一个字符。
* DATA ls_booking TYPE flightb. Nothing on this line will be executed.
控制流语句相关示例
ASSERT
ASSERT
用于您想要绝对确定变量具有特定值的敏感区域。如果 ASSERT
之后的逻辑条件结果为 false,则会抛出无法处理的异常 (ASSERTION_FAILED
)。
ASSERT 1 = 1. "No Problem - Program continues
ASSERT 1 = 2. "ERROR
CASE
CASE lv_foo.
WHEN 1.
WRITE: / 'lv_foo is 1'.
WHEN 2.
WRITE: / 'lv_foo is 2'.
WHEN 3.
WRITE: / 'lv_foo is 3'.
WHEN OTHERS.
WRITE: / 'lv_foo is something else'.
ENDCASE
CHECK
CHECK
是一个简单的语句,它计算逻辑表达式,如果为假,则退出当前处理块。
METHOD do_something.
CHECK iv_input IS NOT INITIAL. "Exits method immediately if iv_input is initial
"The rest of the method is only executed if iv_input is not initial
ENDMETHOD.
COND/SWITCH
SWITCH
和 COND
提供了一种特殊形式的条件程序流。与 IF
和 CASE
不同,它们基于表达式而不是执行语句来表示不同的值。这就是为什么它们算作功能性的。
COND
当需要考虑多个条件时,COND
可以完成这项工作。语法相当简单:
COND <type>(
WHEN <condition> THEN <value>
...
[ ELSE <default> | throw <exception> ]
).
示例:
" Set screen element active depending on radio button
screen-active = COND i(
WHEN p_radio = abap_true THEN 1
ELSE 0 " optional, because type 'i' defaults to zero
).
" Check how two operands are related to each other
" COND determines its type from rw_compare
rw_compare = COND #(
WHEN op1 < op2 THEN 'LT'
WHEN op1 = op2 THEN 'EQ'
WHEN op1 > op2 THEN 'GT'
).
SWITCH
SWITCH
是一个用于映射值的简洁工具,因为它仅检查相等性,因此在某些情况下比 COND
更短。如果给出了意外的输入,也可能引发异常。语法有点不同:
SWITCH <type>(
<variable>
WHEN <value> THEN <new_value>
...
[ ELSE <default> | throw <exception> ]
).
示例:
DATA(lw_language) = SWITCH string(
sy-langu
WHEN 'E' THEN 'English'
WHEN 'D' THEN 'German'
" ...
ELSE THROW cx_sy_conversion_unknown_langu( )
).
IF/ELSEIF/ELSE
IF lv_foo = 3.
WRITE: / 'lv_foo is 3'.
ELSEIF lv_foo = 5.
WRITE: / 'lv_foo is 5'.
ELSE.
WRITE: / 'lv_foo is neither 3 nor 5'.
ENDIF.
ABAP GRID List (ALV) 相关示例
创建和显示 ALV
此示例描述了使用 cl_salv_table
类进行最简单的 ALV 创建,没有其他格式选项。附加的格式化选项将包含在 TRY
ENDTRY
块之后和 alv->display( )
方法调用之前。
使用 ABAP 对象方法创建 ALV 的所有后续示例都将使用此示例作为起点。
DATA: t_spfli TYPE STANDARD TABLE OF spfli,
alv TYPE REF TO cl_salv_table,
error_message TYPE REF TO cx_salv_msg.
" Fill the internal table with example data
SELECT * FROM spfli INTO TABLE t_spfli.
" Fill ALV object with data from the internal table
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = alv
CHANGING
t_table = t_spfli ).
CATCH cx_salv_msg INTO error_message.
" error handling
ENDTRY.
" Use the ALV object's display method to show the ALV on the screen
alv->display( ).
启用 ALV 工具栏功能
以下方法调用允许使用许多高级功能,例如排序、过滤和导出数据。
alv->get_functions( )->set_all( ).
在 ALV 中启用每隔一行条纹化
此方法通过为连续行提供交替的背景颜色阴影来提高可读性。
alv->get_display_settings( )->set_striped_pattern( if_salv_c_bool_sap=>true ).
隐藏 ALV 中的列
此示例对 ALV 隐藏 MANDT
(客户端)字段。请注意,传递给 get_column( )
的参数必须大写才能起作用。
alv->get_columns( )->get_column( 'MANDT' )->set_visible( if_salv_c_bool_sap=>false ).
优化 ALV 列宽度
此示例演示如何优化列宽,以便列标题和数据不会被截断。
alv->get_columns( )->set_optimize( ).
重命名 ALV 中的列标题
列文本可能会随着列的水平调整大小而改变。有三种方法可以实现此目的:
set_short_text
:标题最大长度 10set_medium_text
:标题最大长度 20set_long_text
:标题最大长度 40
以下示例显示了所有三个的用法。列对象被声明并实例化为对 alv->get_columns( )->get_column( 'DISTID' )
结果的引用。列名必须全部大写。这样,该方法链接仅在实例化时调用一次,而不是在每次更改列标题时执行。
DATA column TYPE REF TO cl_salv_column.
column = alv->get_columns( )->get_column( 'DISTID' ).
column->set_short_text( 'Dist. Unit' ).
column->set_medium_text( 'Unit of Distance' ).
column->set_long_text( 'Mass Unit of Distance (kms, miles)' ).
设置显示的 ALV 的标题
默认情况下,当显示 ALV 时,顶部的标题只是程序名称。此方法允许用户设置最多 70 个字符的标题。以下示例显示如何设置显示记录数的动态标题。
alv->get_display_settings( )->set_list_header( |Flight Schedule - { lines( t_spfli ) } records| ).