首页 > 其他分享 >SAP-ABAP赋值语句详解及举例

SAP-ABAP赋值语句详解及举例

时间:2025-01-17 11:28:51浏览次数:3  
标签:WRITE DATA lv ABAP 详解 ls SAP TYPE 赋值

在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

相关文章

  • SAP-ABAP内表操作详解
    SAP-ABAP内表操作详解内表定义:内表是在ABAP程序中定义的一种数据结构,用于在内存中存储和处理数据。它类似于数据库中的表或其他编程语言中的数组或列表,可以存储一系列具有相同数据结构的数据行。内表特点:内表中的数据是临时的,仅在程序运行期间存在。ABAP运行时系统动态地......
  • 条件卷积condconv模型详解及代码复现
    基本原理条件卷积(CondConv)是一种创新的卷积方法,它通过动态计算卷积核来克服传统静态卷积的局限性。这种方法的核心思想是将卷积核参数化为多个专家(卷积核)的线性组合,具体公式如下:Output(x)=σ((α1⋅W1+...+αn⋅Wn)∗x)在这个公式中:x:表示输入特征图αi:是通过可学......
  • 深度学习图像算法中的网络架构:Backbone、Neck 和 Head 详解
    深度学习已经成为图像识别领域的核心技术,特别是在目标检测、图像分割等任务中,深度神经网络的应用取得了显著进展。在这些任务的网络架构中,通常可以分为三个主要部分:Backbone、Neck和Head。这些部分在整个网络中扮演着至关重要的角色,它们各自处理不同的任务,从特征提取到最......
  • C语言break和continue用法详解(跳出循环,新手必看)
    使用while或for循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字。C语言break关键字在我原创教程里的《C语言switchcase语句》一文中,我讲了:用 break来跳出switch语句。当break关键字用于while、for循环时,会终止循......
  • C语言typedef用法详解(新手必看)
    C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是stu,要想定义一个结构体变量就得这样写:structstustu1;struct看起来就是多余的,但不写又会报错。如果为structstu起了......
  • STM32 RTC 功能详解与代码示例
    一、引言STM32微控制器的实时时钟(RTC)功能在许多应用中都非常重要,它允许设备保持精确的时间和日期信息,即使在系统断电或复位后,只要有备用电源(如锂电池)为RTC供电,就能继续运行。这对于需要时间戳、定时任务、日历功能以及其他需要精确时间信息的应用程序来说是必不可少的,例......
  • oracle job每隔一天,Oracle JOB间隔时间详解
    Oracle JOB间隔时间详解INTERVAL参数设置:每天运行一次                       'SYSDATE+1'每小时运行一次                    'SYSDATE+1/24'每10分钟运行一次                'SYSDATE+10/(60*24)'......
  • DuckDB-Wasm 库详解
    DuckDB-Wasm详解DuckDB-Wasm是一种浏览器端实现的DuckDB数据库技术,旨在将DuckDB的强大功能移植到浏览器环境中,通过WebAssembly技术在浏览器内运行SQL查询。它为处理本地数据、快速分析和交互式数据探索提供了一种高效的解决方案,避免了服务器端依赖。1.DuckDB......
  • C++中线程同步与互斥的四种方式介绍及对比详解
    引言在C++中,当两个或更多的线程需要访问共享数据时,就会出现线程安全问题。这是因为,如果没有适当的同步机制,一个线程可能在另一个线程还没有完成对数据的修改就开始访问数据,这将导致数据的不一致性和程序的不可预测性。为了解决这个问题,C++提供了多种线程同步和互斥的机制。互斥......
  • C++ open()和read()函数使用详解
    对于Framework工程师来说,必要C或者C++编程能力是必须的,像对设备节点的操作是最基本的操作,那么我们便会用到open和read函数。open()函数用于打开文件,而read()函数用于从打开的文件中读取数据。open()函数open()函数是C/C++标准库中的一个POSIX标准函数,用于打开一个文件并返回......