DATA: r_bukrs TYPE RANGE OF bkpf-bukrs. r_bukrs = VALUE #( ( sign = 'I' option = 'EQ' low = '1000' ) ). SUBMIT zreport WITH s_bukrs IN r_bukrs AND RETURN.
范围表必须包含字段:SIGN、OPTION、LOW、HIGH。
CALL TRANSACTION
语法和附加项
附加项
用途
AND SKIP FIRST SCREEN
如果必填字段已预填,则跳过初始屏幕
MODE mode
控制屏幕显示:A(全部)、E(仅错误)、N(不显示)
UPDATE upd
更新模式:A(异步)、S(同步)、L(本地更新)
USING bdc_tab
使用批输入表驱动事务
MESSAGES INTO itab
将所有消息收集到内表中
1 2 3 4 5
CALL TRANSACTION 'MM01' USING lt_bdcdata MODE 'N' UPDATE 'S' MESSAGES INTO lt_messages.
FORM process USING p_data TYPE any. " p_data 继承实际参数的类型 ENDFORM.
PERFORM process USING lv_string. " p_data 表现为 STRING PERFORM process USING lv_int. " p_data 表现为 I
上下文
类型解析
FORM ... USING p TYPE any
调用时从实际参数
方法参数 TYPE any
调用时从实际参数
FM 参数 TYPE any
调用时从实际参数
泛型类型字段符号
字段符号从赋值的数据对象继承其类型:
1 2 3 4
FIELD-SYMBOLS: <fs> TYPE any.
ASSIGN lv_string TO <fs>. " <fs> 现在表现为 STRING ASSIGN lv_int TO <fs>. " <fs> 现在表现为 I
💡字段符号与泛型
泛型类型的字段符号是一个”占位符”,采用所赋值对象的类型和值。这是泛型数据访问的主要机制。
泛型数据引用
1
DATA: dref TYPE REF TO data.
属性
行为
声明
TYPE REF TO data 创建泛型数据引用
赋值
可通过 GET REFERENCE OF ... INTO dref 指向任何数据对象
解引用
不能直接使用 dref->*;必须使用 ASSIGN
⚠️泛型数据引用解引用
TYPE REF TO data 变量不能直接用 ->* 解引用。必须使用 ASSIGN dref->* TO <fs> 来访问被引用的数据。
1 2 3 4 5 6
DATA: dref TYPE REF TO data. FIELD-SYMBOLS: <fs> TYPE any.
CREATE DATA dref TYPE string. ASSIGN dref->* TO <fs>. " 正确:使用 ASSIGN <fs> = 'Hello'. " 通过字段符号访问
使用字段符号的类型转换
ASSIGN … CASTING
将赋值数据对象的内存区域视为具有不同类型:
1 2 3
FIELD-SYMBOLS: <hex> TYPE x.
ASSIGN lv_string TO <hex> CASTING. " 将字符串内存解释为原始字节
CASTING 变体
语法
效果
隐式类型
ASSIGN dobj TO <fs> CASTING
使用字段符号的声明类型
显式类型
ASSIGN dobj TO <fs> CASTING TYPE typ
使用指定类型
显式小数
ASSIGN dobj TO <fs> CASTING TYPE p DECIMALS 2
带小数的压缩数
💡CASTING 不转换数据
CASTING 以不同类型重新解释相同的内存内容。它不转换数据。实际类型转换请使用转换函数。
ASSIGN … CASTING TYPE(动态)
1
ASSIGN lv_data TO <fs> CASTING TYPE (lv_type_name).
类型名称在运行时动态解析。
动态 ASSIGN
结构中的动态组件访问
1 2 3 4 5 6 7 8 9 10
FIELD-SYMBOLS: <comp> TYPE any.
" 按组件索引 ASSIGN COMPONENT 3 OF STRUCTURE ls_struct TO <comp>.
" 按组件名(动态) ASSIGN COMPONENT 'FIELD_NAME' OF STRUCTURE ls_struct TO <comp>.
" 按变量名 ASSIGN COMPONENT lv_comp_name OF STRUCTURE ls_struct TO <comp>.
变体
语法
使用场景
按索引
ASSIGN COMPONENT n OF STRUCTURE
遍历所有组件
按名称(字面量)
ASSIGN COMPONENT 'NAME' OF STRUCTURE
已知组件名,静态
按名称(变量)
ASSIGN COMPONENT lv_name OF STRUCTURE
组件名在运行时确定
动态属性访问
1 2 3 4 5 6 7
FIELD-SYMBOLS: <attr> TYPE any.
" 动态访问类属性 ASSIGN (lcl_my_class=>lv_attr_name) TO <attr>.
" 通过对象引用访问实例属性 ASSIGN oref->('ATTRIBUTE_NAME') TO <attr>.
📌动态名称的括号语法
括号中的类/属性名遵循与其他动态令牌相同的规则:(name),内部不能有空格。
动态结构组件访问模式
1 2 3 4 5 6 7 8 9 10 11 12
" 泛型:处理任意结构的所有组件 FIELD-SYMBOLS: <comp> TYPE any. DATA: lo_struct TYPE REF TO cl_abap_structdescr. DATA: lt_comp TYPE cl_abap_structdescr=>component_table.
TYPES: BEGIN OF ty_struc, id TYPE i, name TYPE string, dept TYPE string, END OF ty_struc.
TYPES: ty_employees TYPE STANDARD TABLE OF ty_struc WITH NON-UNIQUE KEY id WITH NON-UNIQUE SORTED KEY sec_name COMPONENTS name WITH UNIQUE HASHED KEY sec_dept COMPONENTS dept.
使用
1 2 3 4 5 6 7 8 9 10
DATA: lt_emp TYPE ty_employees.
" 使用次键读取 READ TABLE lt_emp INTO ls_wa USING KEY sec_name WITH KEY name = 'Smith'.
" 使用次键循环 LOOP AT lt_emp INTO ls_wa USING KEY sec_name. " 按 name 顺序处理 ENDLOOP.
" 隐式(dref 必须有类型,如 TYPE REF TO string) CREATE DATA dref. " 创建 STRING 类型的对象
" 显式静态 CREATE DATA dref TYPE string. " 创建 STRING
" 显式命名类型 CREATE DATA dref TYPE zmy_structure. " 创建 DDIC 结构
" 动态类型名称 DATA(lv_type) = 'STRING'. CREATE DATA dref TYPE (lv_type). " 运行时解析类型
" 表类型 CREATE DATA dref TYPE STANDARD TABLE OF string WITH EMPTY KEY.
" RTTC 句柄(最灵活) DATA(lo_elem) = cl_abap_elemdescr=>get_string( ). CREATE DATA dref TYPE HANDLE lo_elem. " 从描述符创建 STRING
访问匿名数据对象
1 2 3 4 5
FIELD-SYMBOLS: <fs> TYPE any.
CREATE DATA dref TYPE string. ASSIGN dref->* TO <fs>. <fs> = 'Dynamic content'.
⚠️始终使用 ASSIGN 访问
CREATE DATA 后,匿名数据对象只能通过数据引用访问。使用 ASSIGN dref->* TO <fs> 来操作内容。
RTTC 类型创建方法
CL_ABAP_ELEMDESCR – 基本类型
方法
创建类型
参数
GET_I()
i
无
GET_F()
f
无
GET_C( len )
c
长度
GET_STRING()
string
无
GET_X( len )
x
长度
GET_XSTRING()
xstring
无
GET_P( len decimals )
p
长度、小数位
GET_N( len )
n
长度
GET_D()
d
无
GET_T()
t
无
1 2 3
" 创建带 10 位数字和 2 位小数的压缩类型 DATA(lo_p) = cl_abap_elemdescr=>get_p( p_length = 5 p_decimals = 2 ). CREATE DATA dref TYPE HANDLE lo_p.
CL_ABAP_STRUCTDESCR – 结构类型
从组件列表创建结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
DATA: lt_comp TYPE cl_abap_structdescr=>component_table. DATA: lo_struct TYPE REF TO cl_abap_structdescr.
" 构建组件表 APPEND VALUE #( name = 'ID' type = cl_abap_elemdescr=>get_i( ) ) TO lt_comp. APPEND VALUE #( name = 'NAME' type = cl_abap_elemdescr=>get_string( ) ) TO lt_comp. APPEND VALUE #( name = 'AMT' type = cl_abap_elemdescr=>get_p( p_length = 8 p_decimals = 2 ) ) TO lt_comp.
DDIC / 已有类型 | v describe_by_name() 或 describe_by_data() | v 行类型描述符 (CL_ABAP_STRUCTDESCR) | v CL_ABAP_TABLEDESCR=>create( line_type, key, ... ) | v 表类型描述符 (CL_ABAP_TABLEDESCR) | v CREATE DATA dref TYPE HANDLE <descriptor> | v ASSIGN dref->* TO <ft> | v 像普通内表一样使用 <ft>