关于 sap-abap
sap-abap 是用于编写、审查和排查 ABAP 的开发参考技能,涵盖从 7.40 SP08 到 ABAP Cloud 的版本。内容包括语法指导、常见模式、兼容性说明和专题参考文件。
主要功能
- 01按版本提供 ABAP 语法
- 02ABAP SQL 与内表操作
- 03RAP 和 EML 指导
- 04单元测试与性能参考
- 05ABAP Cloud 兼容模式
适用场景
- 01现代化经典 ABAP 代码
- 02编写 ABAP SQL 和内表操作
- 03排查运行时及语法问题
- 04检查代码的版本兼容性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ secondsky/ sap-skills --skill sap-abap安装后在 Claude Code 中输入/sap-abap确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdagents/openai.yamlreferences/abap-dictionary.mdabap-sql.mdamdp.mdauthorization.mdbits-bytes.mdbuiltin-functions.mdcds-views.mdcloud-development.mdconstructor-expressions.mddate-time.mddesign-patterns.mddynamic-programming.mdexceptions.mdgenerative-ai.mdinternal-tables.mdnumeric-operations.mdobject-orientation.mdperformance.mdprogram-flow.mdrap-eml.mdreleased-classes.mdsap-luw.mdskill-reference-guide.mdsql-hierarchies.mdstring-processing.mdtable-grouping.mdunit-testing.mdwhere-conditions.md详细介绍
SAP ABAP 开发技能
相关技能
- sap-abap-cds:用于为基于 ABAP 的 Fiori 应用开发 CDS 视图,或使用注解定义数据模型
- sap-btp-cloud-platform:用于在 BTP 上使用 ABAP Environment,或将 ABAP 应用部署到云端
- sap-cap-capire:用于将 ABAP 系统连接到 CAP 应用,或与 OData 服务集成
- sap-fiori-tools:用于开发带 ABAP 后端的 Fiori 应用,或使用来自 ABAP 系统的 OData 服务
- sap-api-style:用于编写 ABAP API 文档,或遵循 SAP API 文档标准
适用场景
编写或审查 ABAP 代码、将经典 ABAP 现代化为兼容 ABAP Cloud 的模式、使用 RAP 或 EML、实现 ABAP SQL、设计单元测试,或排查不同受支持 ABAP 版本中的语言/运行时行为时,请使用此技能。
版本兼容性
此技能涵盖从 7.40 SP08 到 ABAP Cloud 的 ABAP 语法。要求更高版本的功能会在代码示例中使用行内注释 " [7.xx+] 标注,或在参考文件中注明。下表汇总了主要版本界限。
| 功能 | 7.40 SP02 | 7.40 SP05 | 7.40 SP08 | 7.50 | 7.51 | 7.52 | 7.54 |
|---|---|---|---|---|---|---|---|
行内声明 DATA(...) | x | x | x | x | x | x | x |
| 构造运算符(VALUE、NEW、CONV、COND、SWITCH、REF、EXACT、CAST) | x | x | x | x | x | x | x |
内表表达式 itab[...] | x | x | x | x | x | x | x |
| 字符串模板 | x | x | x | x | x | x | x |
WITH EMPTY KEY | x | x | x | x | x | x | x |
line_exists()、line_index() | x | x | x | x | x | x | x |
ABAP SQL:@ 主机变量 | x | x | x | x | x | x | |
| ABAP SQL:逗号分隔列表 | x | x | x | x | x | x | |
| ABAP SQL:SELECT 中的 SQL 表达式 | x | x | x | x | x | x | |
CORRESPONDING 运算符 | x | x | x | x | x | x | |
内表推导(FOR) | x | x | x | x | x | x | |
LET 表达式 | x | x | x | x | x | x | |
REDUCE 运算符 | x | x | x | x | x | ||
FILTER 运算符 | x | x | x | x | x | ||
BASE 添加项 | x | x | x | x | x | ||
LOOP AT ... GROUP BY | x | x | x | x | x | ||
ABAP SQL:SELECT 中的 dbtab~* | x | x | x | x | x | ||
ABAP SQL:RIGHT OUTER JOIN | x | x | x | x | x | x | |
| 带参数的 CDS 视图 | x | x | x | x | x | ||
FINAL(...) 行内声明 | x | x | x | x | |||
主机表达式 @( expr ) | x | x | x | x | |||
SELECT 中的 UNION | x | x | x | x | |||
IS INSTANCE OF/CASE TYPE OF | x | x | x | x | |||
int8 类型 | x | x | x | x | |||
| CDS 表函数 | x | x | x | x | |||
| CDS 访问控制(隐式) | x | x | x | x | |||
$session.user/client/system_language | x | x | x | x | |||
测试缝(TEST-SEAM) | x | x | x | x | |||
公用表表达式(WITH) | x | x | x | ||||
SELECT 中的 OFFSET | x | x | x | ||||
CDS 中的 UPPER/LOWER | x | x | x | ||||
| 枚举类型 | x | x | x | ||||
作为数据源的内表 FROM @itab | x | x | |||||
WITH PRIVILEGED ACCESS | x | x | |||||
utclong 类型及函数 | x |
在 7.40 系统上:将所有 FINAL(...) 替换为 DATA(...),并避免使用上文加粗标记的 7.50+ 功能。大多数现代 ABAP 语法(VALUE、NEW、CONV、行内声明、内表表达式、REDUCE、FILTER、GROUP BY)自 7.40 SP08 起即可使用。
目录
快速参考
数据类型和声明
" Elementary types
DATA num TYPE i VALUE 123.
DATA txt TYPE string VALUE `Hello`.
DATA flag TYPE abap_bool VALUE abap_true.
" Inline declarations
DATA(result) = some_method( ).
FINAL(immutable) = `constant value`. " [7.50+] Use DATA(...) on 7.40
" Structures
DATA: BEGIN OF struc,
id TYPE i,
name TYPE string,
END OF struc.
" Internal tables
DATA itab TYPE TABLE OF string WITH EMPTY KEY.
DATA sorted_tab TYPE SORTED TABLE OF struct WITH UNIQUE KEY id.
DATA hashed_tab TYPE HASHED TABLE OF struct WITH UNIQUE KEY id.
内部表 - 基本操作
" Create with VALUE
itab = VALUE #( ( col1 = 1 col2 = `a` )
( col1 = 2 col2 = `b` ) ).
" Read operations
DATA(line) = itab[ 1 ]. " By index
DATA(line2) = itab[ col1 = 1 ]. " By key
READ TABLE itab INTO wa INDEX 1.
READ TABLE itab ASSIGNING FIELD-SYMBOL(<fs>) WITH KEY col1 = 1.
" Modify operations
MODIFY TABLE itab FROM VALUE #( col1 = 1 col2 = `updated` ).
itab[ 1 ]-col2 = `changed`.
" Loop processing
LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>).
<line>-col2 = to_upper( <line>-col2 ).
ENDLOOP.
" Delete
DELETE itab WHERE col1 > 5.
DELETE TABLE itab FROM VALUE #( col1 = 1 ).
ABAP SQL 基础
" SELECT into table
SELECT * FROM dbtab INTO TABLE @DATA(result_tab). " @ syntax: 7.40 SP05+
" SELECT with conditions
SELECT carrid, connid, fldate " comma syntax: 7.40 SP05+
FROM zdemo_abap_fli
WHERE carrid = 'LH'
INTO TABLE @DATA(flights).
" Aggregate functions
SELECT carrid, COUNT(*) AS cnt, AVG( price ) AS avg_price
FROM zdemo_abap_fli
GROUP BY carrid
INTO TABLE @DATA(stats).
" JOIN operations
SELECT a~carrid, a~connid, b~carrname
FROM zdemo_abap_fli AS a
INNER JOIN zdemo_abap_carr AS b ON a~carrid = b~carrid
INTO TABLE @DATA(joined).
" Modification statements
INSERT dbtab FROM @struc.
UPDATE dbtab FROM @struc.
MODIFY dbtab FROM TABLE @itab.
DELETE FROM dbtab WHERE condition.
构造表达式
" VALUE - structures and tables
DATA(struc) = VALUE struct_type( comp1 = 1 comp2 = `text` ).
DATA(itab) = VALUE itab_type( ( a = 1 ) ( a = 2 ) ( a = 3 ) ).
" NEW - create instances
DATA(dref) = NEW i( 123 ).
DATA(oref) = NEW zcl_my_class( param = value ).
" CORRESPONDING - structure/table mapping
target = CORRESPONDING #( source ).
target = CORRESPONDING #( source MAPPING target_field = source_field ).
" COND/SWITCH - conditional values
DATA(text) = COND string( WHEN flag = abap_true THEN `Yes` ELSE `No` ).
DATA(result) = SWITCH #( code WHEN 1 THEN `A` WHEN 2 THEN `B` ELSE `X` ).
" CONV - type conversion
DATA(dec) = CONV decfloat34( 1 / 3 ).
" FILTER - table filtering
DATA(filtered) = FILTER #( itab WHERE status = 'A' ).
" REDUCE - aggregation
DATA(sum) = REDUCE i( INIT s = 0 FOR wa IN itab NEXT s = s + wa-amount ).
面向对象 ABAP
" Class definition
CLASS zcl_example DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor IMPORTING iv_name TYPE string.
METHODS get_name RETURNING VALUE(rv_name) TYPE string.
CLASS-METHODS factory RETURNING VALUE(ro_instance) TYPE REF TO zcl_example.
PRIVATE SECTION.
DATA mv_name TYPE string.
ENDCLASS.
CLASS zcl_example IMPLEMENTATION.
METHOD constructor.
mv_name = iv_name.
ENDMETHOD.
METHOD get_name.
rv_name = mv_name.
ENDMETHOD.
METHOD factory.
ro_instance = NEW #( `Default` ).
ENDMETHOD.
ENDCLASS.
" Interface implementation
CLASS zcl_impl DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES zif_my_interface.
ENDCLASS.
异常处理
TRY.
DATA(result) = risky_operation( ).
CATCH cx_sy_zerodivide INTO DATA(exc).
DATA(msg) = exc->get_text( ).
CATCH cx_root INTO DATA(any_exc).
" Handle any exception
CLEANUP.
" Cleanup code
ENDTRY.
" Raising exceptions
RAISE EXCEPTION TYPE zcx_my_exception
EXPORTING textid = zcx_my_exception=>error_occurred.
" With COND/SWITCH
DATA(val) = COND #( WHEN valid THEN result
ELSE THROW zcx_my_exception( ) ).
字符串处理
" Concatenation
DATA(full) = first && ` ` && last.
txt &&= ` appended`.
" String templates
DATA(msg) = |Name: { name }, Date: { date DATE = ISO }|.
" Functions
DATA(upper) = to_upper( text ).
DATA(len) = strlen( text ).
DATA(found) = find( val = text sub = `search` ).
DATA(replaced) = replace( val = text sub = `old` with = `new` occ = 0 ).
DATA(parts) = segment( val = text index = 2 sep = `,` ).
" FIND/REPLACE statements
FIND ALL OCCURRENCES OF pattern IN text RESULTS DATA(matches).
REPLACE ALL OCCURRENCES OF old IN text WITH new.
动态编程
" Field symbols
FIELD-SYMBOLS <fs> TYPE any.
ASSIGN struct-component TO <fs>.
ASSIGN struct-(comp_name) TO <fs>. " Dynamic component
" Data references
DATA dref TYPE REF TO data.
dref = REF #( variable ).
CREATE DATA dref TYPE (type_name).
dref->* = value.
" RTTI - Get type information
DATA(tdo) = cl_abap_typedescr=>describe_by_data( dobj ).
DATA(components) = CAST cl_abap_structdescr( tdo )->components.
" RTTC - Create types dynamically
DATA(elem_type) = cl_abap_elemdescr=>get_string( ).
CREATE DATA dref TYPE HANDLE elem_type.
捆绑资源
此技能包含 28 个全面的参考文件,涵盖 ABAP 开发的各个方面:
相关技能
- sap-abap-cds:用于 CDS 视图开发和 ABAP Cloud 数据建模
- sap-btp-cloud-platform:用于 ABAP Environment 设置和 BTP 部署
- sap-cap-capire:用于 CAP 服务集成和 ABAP 系统连接
- sap-fiori-tools:用于使用 ABAP 后端开发 Fiori 应用
- sap-api-style:用于 API 文档标准和最佳实践
快速访问
- 参考指南:
references/skill-reference-guide.md- 所有参考文件的完整指南 - 内部表:
references/internal-tables.md- 完整的表操作 - ABAP SQL:
references/abap-sql.md- 全面的 SQL 参考 - 面向对象:
references/object-orientation.md- 类和接口
开发主题
references/constructor-expressions.md- VALUE、NEW、COND、REDUCEreferences/rap-eml.md- RAP 和 EML 操作references/cds-views.md- CDS 视图开发references/string-processing.md- 字符串函数和正则表达式references/unit-testing.md- ABAP Unit 框架references/performance.md- 优化技巧- ... 以及另外 18 个专项参考文件
常见模式
安全的表访问(避免异常)
" Using VALUE with OPTIONAL
DATA(line) = VALUE #( itab[ key = value ] OPTIONAL ).
" Using VALUE with DEFAULT
DATA(line) = VALUE #( itab[ 1 ] DEFAULT VALUE #( ) ).
" Check before access
IF line_exists( itab[ key = value ] ).
DATA(line) = itab[ key = value ].
ENDIF.
函数式方法链
DATA(result) = NEW zcl_builder( )
->set_name( `Test` )
->set_value( 123 )
->build( ).
FOR 迭代表达式
" Transform table
DATA(transformed) = VALUE itab_type(
FOR wa IN source_itab
( id = wa-id name = to_upper( wa-name ) ) ).
" With WHERE
DATA(filtered) = VALUE itab_type(
FOR wa IN source WHERE ( status = 'A' )
( wa ) ).
" With INDEX INTO
DATA(numbered) = VALUE itab_type(
FOR wa IN source INDEX INTO idx
( line_no = idx data = wa ) ).
ABAP Cloud 兼容性
" Use released APIs only
DATA(uuid) = cl_system_uuid=>create_uuid_x16_static( ).
DATA(date) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.
DATA(time) = xco_cp=>sy->time( )->as( xco_cp_time=>format->iso_8601_extended )->value.
" Output in cloud (if_oo_adt_classrun)
out->write( result ).
" Avoid: sy-datum, sy-uzeit, DESCRIBE TABLE, WRITE, MOVE...TO
ABAP 7.40 兼容性
面向 ABAP 7.40 系统时,请使用以下模式替换 7.50+ 语法:
" Instead of FINAL (7.50+):
FINAL(value) = `constant`. " 7.50+
DATA(value) = `constant`. " 7.40 compatible
" Instead of host expressions (7.50+):
SELECT * FROM dbtab WHERE col = @( lv_val ). " 7.50+
SELECT * FROM dbtab WHERE col = @lv_val. " 7.40 compatible
" Instead of UNION (7.50+):
SELECT a FROM tab1 UNION SELECT a FROM tab2. " 7.50+
" Use two separate SELECTs on 7.40 and combine in ABAP:
SELECT a FROM tab1 INTO TABLE @DATA(r1).
SELECT a FROM tab2 INTO TABLE @DATA(r2).
DATA(combined) = VALUE itab_type( FOR l1 IN r1 ( l1 )
FOR l2 IN r2 ( l2 ) ).
" Instead of IS INSTANCE OF (7.50+):
IF oref IS INSTANCE OF zcl_my_class. " 7.50+
" 7.40 alternative — use typed CAST with exception handling:
TRY.
DATA(lo) = CAST zcl_my_class( oref ). " 7.40+
CATCH cx_sy_move_cast_error.
" oref is not compatible with zcl_my_class
ENDTRY.
" Instead of CTEs WITH (7.51+):
WITH +cte AS ( SELECT ... ) SELECT ... " 7.51+
" Use subqueries or temporary tables on 7.40
错误目录
CX_SY_ITAB_LINE_NOT_FOUND
原因:表表达式访问了不存在的行
解决方案:使用 OPTIONAL、DEFAULT,或通过 line_exists( ) 检查
CX_SY_ZERODIVIDE
原因:除数为零 解决方案:运算前检查除数
CX_SY_RANGE_OUT_OF_BOUNDS
原因:子字符串访问无效或数组越界 解决方案:访问前验证偏移量和长度
CX_SY_CONVERSION_NO_NUMBER
原因:字符串无法转换为数字 解决方案:转换前验证输入格式
CX_SY_REF_IS_INITIAL
原因:取消引用未绑定的引用
解决方案:取消引用前检查 IS BOUND
性能提示
- 频繁按键访问时使用 SORTED/HASHED 表
- 在循环中修改数据时,优先使用字段符号而非工作区
- 对于大型 SELECT 结果,使用 PACKAGE SIZE
- 避免在循环中使用 SELECT - 使用 FOR ALL ENTRIES 或 JOIN
- 针对不同访问模式使用辅助键
- 尽量减少 CORRESPONDING 调用 - 显式赋值速度更快
来源文档
所有内容均基于 SAP 官方 ABAP Cheat Sheets:
- 仓库:https://github.com/SAP-samples/abap-cheat-sheets
- SAP Help(最新):https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm
- SAP Help(7.40):https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/index.htm
- ABAP 发行说明:https://github.com/SAP-samples/abap-cheat-sheets/blob/main/33_ABAP_Release_News.md