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.