在ABAP(Advanced Business Application Programming)中,赋值语句用于将一个值或表达式的结果赋给变量。ABAP提供了几种不同的赋值方式,取决于变量的类型和所需的操作。以下是一些常见的赋值语句示例:
基本赋值:
使用=符号将值赋给变量。
DATA: lv_variable TYPE i.
lv_variable = 10.
在这个例子中,我们声明了一个整数类型的变量lv_variable,并将其赋值为10。
字段符号赋值:
字段符号(field symbols)是引用类型的数据对象,可以指向任何类型的数据对象。使用ASSIGN语句将实际数据对象的引用赋给字段符号。
FIELD-SYMBOLS: <fs_variable> TYPE any.
DATA: lv_actual TYPE i VALUE 20.
ASSIGN lv_actual TO <fs_variable>.
在这个例子中,字段符号<fs_variable>被赋值为指向lv_actual的引用。
内表赋值:
对于内表(internal tables),可以使用APPEND、INSERT、MODIFY等语句来添加或修改行。
DATA: gt_table TYPE TABLE OF string.
APPEND 'Hello' TO gt_table.
LOOP at gt_table INTO DATA(gs_table).
WRITE: /'内表赋值:',gs_table.
ENDLOOP.
在这个例子中,字符串’Hello’被添加到内表gt_table中。
结构赋值:
对于结构(structures),可以直接给结构的组件赋值,或者使用VALUE构造函数来创建并初始化一个结构。
TYPES: BEGIN OF ty_structure,
field1 TYPE i,
field2 TYPE string,
END OF ty_structure.
DATA: ls_structure TYPE ty_structure.
ls_structure-field1 = 30.
ls_structure-field2 = 'World'. " 或者使用VALUE构造函数
DATA(ls_new_structure) = VALUE ty_structure( field1 = 40 field2 = 'ABAP' ).
使用MOVE语句:
MOVE语句是另一种赋值方式,它在某些情况下比=更灵活,特别是在处理不同类型的数据时。MOVE会尝试进行类型转换。
DATA: lv_source TYPE p DECIMALS 2 VALUE '123.45',
lv_target TYPE i.
MOVE lv_source TO lv_target. " 这里会进行类型转换,但可能会丢失精度
注意:在使用MOVE时,如果源数据类型和目标数据类型不兼容,可能会导致运行时错误或数据丢失。
条件赋值:
ABAP还提供了条件表达式来进行赋值,例如使用IF语句或内联条件表达式。
DATA: lv_num TYPE i VALUE 5.
DATA: lv_result TYPE string.
IF lv_num > 0.
lv_result = 'Positive'.
ELSEIF lv_num = 0.
lv_result = 'Zero'.
ELSE.
lv_result = 'Negative'.
ENDIF. " 或者使用内联条件表达式
lv_result = COND #( WHEN lv_num > 0 THEN 'Positive' WHEN lv_num = 0 THEN 'Zero' ELSE 'Negative' ).
MOVE-CORRESPONDING:
该语句用于结构体变量之间的赋值,它只会对不同结构体中的相同字段进行赋值。这对于处理具有相同或相似结构的复杂数据类型非常有用。
DATA: BEGIN OF ls_source,
field1 TYPE i VALUE 1,
field2 TYPE string VALUE 'Source',
END OF ls_source.
DATA: BEGIN OF ls_target,
field1 TYPE i,
field2 TYPE string,
END OF ls_target.
MOVE-CORRESPONDING ls_source TO ls_target.
WRITE: /'MOVE-CORRESPONDING:',ls_target-field1,ls_target-field2.
在这个例子中,ls_source结构体中的field1和field2字段的值被复制到ls_target结构体中对应的字段。
WRITE TO:
虽然WRITE语句通常用于输出,但它也可以用于赋值操作。使用WRITE TO可以将源字段的内容写入目标字段,同时可以进行一些格式化操作。需要注意的是,WRITE TO赋值会将变量的值和类型一起赋给目标变量,这样目标变量的格式将会被强制转换。
DATA: lv_source1(10) TYPE C VALUE '123',
lv_target1(10) TYPE N.
WRITE lv_source1 TO lv_target1. " 这里会尝试将字符串'123'转换为数字文本并赋给lv_target1
WRITE: /'WRITE TO:',lv_target1.
在这个例子中,字符串’123’被转换为整数并赋给lv_target。然而,如果源字段的内容无法被目标字段的类型所接受,这可能会导致运行时错误。
使用参数(PARAMETERS)语句声明的变量赋值:
在ABAP程序中,可以使用PARAMETERS语句声明程序参数,这些参数可以在程序运行时由用户输入。虽然PARAMETERS语句本身不用于赋值,但声明的参数可以在程序中使用,并可以通过用户输入或其他方式获得值
PARAMETERS: p_input TYPE string. " 在程序的其他部分,可以使用p_input参数的值
在这个例子中,p_input是一个由用户输入的字符串参数。
动态赋值:
ABAP允许使用动态赋值,即在运行时确定要赋值的变量和值。这通常通过使用字段符号(field symbols)和ASSIGN语句来实现。
FIELD-SYMBOLS: <fs_var> TYPE any.
DATA: lv_var_name TYPE string VALUE 'LV_TARGET',
lv_value TYPE i VALUE 42. " 假设LV_TARGET已经声明并存在
ASSIGN (lv_var_name) TO <fs_var>.
<fs_var> = lv_value. " 动态地将lv_value的值赋给LV_TARGET
WRITE: /'动态赋值:<fs_var>',<fs_var>,'LV_TARGET:',LV_TARGET.
在这个例子中,变量名LV_TARGET被存储在字符串lv_var_name中,然后使用ASSIGN语句将LV_TARGET的引用赋给字段符号<fs_var>。最后,使用<fs_var>将值42动态地赋给LV_TARGET。
*&---------------------------------------------------------------------*
*& Report ZPMF_PX_002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZPMF_PX_002.
DATA: lv_variable TYPE i.
lv_variable = 10.
WRITE: '基本赋值:',lv_variable.
FIELD-SYMBOLS: <fs_variable> TYPE any.
DATA: lv_actual TYPE i VALUE 20.
ASSIGN lv_actual TO <fs_variable>.
WRITE: /'字段符号赋值:',<fs_variable>.
DATA: gt_table TYPE TABLE OF string.
APPEND 'Hello' TO gt_table.
LOOP at gt_table INTO DATA(gs_table).
WRITE: /'内表赋值:',gs_table.
ENDLOOP.
TYPES: BEGIN OF ty_structure,
field1 TYPE i,
field2 TYPE string,
END OF ty_structure.
DATA: ls_structure TYPE ty_structure.
ls_structure-field1 = 30.
ls_structure-field2 = 'World'. " 或者使用VALUE构造函数
DATA(ls_new_structure) = VALUE ty_structure( field1 = 40 field2 = 'ABAP' ).
WRITE: /'结构赋值:',ls_new_structure-field1,ls_new_structure-field2.
DATA: lv_source TYPE p DECIMALS 2 VALUE '123.45',
lv_target TYPE i.
MOVE lv_source TO lv_target. " 这里会进行类型转换,但可能会丢失精度
WRITE: /'使用MOVE语句::',lv_target.
DATA: lv_num TYPE i VALUE 5.
DATA: lv_result TYPE string.
IF lv_num > 0.
lv_result = 'Positive'.
ELSEIF lv_num = 0.
lv_result = 'Zero'.
ELSE.
lv_result = 'Negative'.
ENDIF. " 或者使用内联条件表达式
lv_result = COND #( WHEN lv_num > 0 THEN 'Positive' WHEN lv_num = 0 THEN 'Zero' ELSE 'Negative' ).
WRITE: /'条件赋值:',lv_result.
DATA: BEGIN OF ls_source,
field1 TYPE i VALUE 1,
field2 TYPE string VALUE 'Source',
END OF ls_source.
DATA: BEGIN OF ls_target,
field1 TYPE i,
field2 TYPE string,
END OF ls_target.
MOVE-CORRESPONDING ls_source TO ls_target.
WRITE: /'MOVE-CORRESPONDING:',ls_target-field1,ls_target-field2.
DATA: lv_source1(10) TYPE C VALUE '123',
lv_target1(10) TYPE N.
WRITE lv_source1 TO lv_target1. " 这里会尝试将字符串'123'转换为数字文本并赋给lv_target1
WRITE: /'WRITE TO:',lv_target1.
FIELD-SYMBOLS: <fs_var> TYPE any.
DATA: lv_var_name TYPE string VALUE 'LV_TARGET',
lv_value TYPE i VALUE 42. " 假设LV_TARGET已经声明并存在
ASSIGN (lv_var_name) TO <fs_var>.
<fs_var> = lv_value. " 动态地将lv_value的值赋给LV_TARGET
WRITE: /'动态赋值:<fs_var>',<fs_var>,'LV_TARGET:',LV_TARGET.
需要注意的是,不同的赋值语句适用于不同的场景和数据类型。在选择赋值语句时,应根据具体的应用场景和需求进行选择。同时,应确保赋值操作不会导致数据类型不兼容或运行时错误。
标签:WRITE,DATA,lv,ABAP,详解,ls,SAP,TYPE,赋值 From: https://blog.csdn.net/baidu_35680696/article/details/145185280