ABAP 7.40 新语法

文章详细列举了SAPABAP编程中的一些关键操作,包括自动创建内表、读取特定行数据、条件查询、类型转换、结构体赋值、循环与条件判断、字符串处理等。这些技巧涵盖了数据处理和转换的核心方面。

目录

"1. @DATA(表名):自动创建内表

"2. 读表lt_sales_order中的第20条数据到新建的变量ls_sales_order20中

"2.1 []中放条件

"3. 判断表lt_sales_order中vbeln = '0000000031'是否存在,存在打1

"4. 获取index

"5. 将C类型转换为xstring

"6. 利用value向结构体赋值

"7. 利用value向表赋值

"8. 利用value向表赋自定义范围值

"9. 将旧表(gt_ships)中的值根据条件(ls_ship–city)赋值到目标表(gt_citys)中

"9.1 俩条件

"10. 循环执行col1 = j col2 = j + 1 col3 = j + 2,当j>40的时候停止循环

"11. 循环表gt_itab到结构体wa中 当F1 = 'XYZ'时 x加1 i为lv_lines的type

"12. 循环表itab到结构体wa中 一共多少条 就累加多少次 求总条数

"13. reduce中可以加until for迭代 相当于java或js中的for循环

"14. 将ls_line1的内容移动到ls_line2,其中有一个匹配的列名。在没有初始化ls_line2的列。

"15. 这将使用ls_line2的现有内容作为基础,并覆盖ls_line1中匹配的列。

"16. 将创建第三个新结构(ls_line3),它基于ls_line2,但是通过匹配覆盖了它

"17. 映射允许您映射具有不同名称组件的字段,以符合数据传输的条件。

"18. EXCEPT允许列出必须从数据传输中排除的字段

"19. 字符串的宽度 布局方式(居中 居左 局右) 还有通过0来布局

"20. 不改变大小写

"21. 去前导零

"22. 加前导零

"23. 转换时间格式

"24. 根据group by条件遍历,符合条件的自动归为一组,然后再遍历group 打印输出

"25. 根据key vbeln='0000000031' 读出表一条数据到表结构体中

"26. 根据index查出表中的一条数据

"27. 定义字符串

"28. 把表里的字符串连成一行,如果想用空格格开,要用``包裹

"29. 反转字符串

"30. 从左截取两位字符

"31. 从左截取两位字符放在最后

"32. 从左截取sub的值,sub中的值必须从A开始,必须挨着:比如ABC 不可以AC

"33. 去前导零

"34. 字符串截取


"1. @DATA(表名):自动创建内表


*SELECT vbeln , posnr , matnr
*  FROM vbap
*  INTO TABLE @DATA(lt_sales_order)
*  UP TO 100 ROWS.

"2. 读表lt_sales_order中的第20条数据到新建的变量ls_sales_order20中


*DATA(ls_sales_order20) = lt_sales_order[ 20 ].

"2.1 []中放条件


*DATA(ls_sales_order21) = lt_sales_order[ vbeln = '0000000031' ].

"3. 判断表lt_sales_order中vbeln = '0000000031'是否存在,存在打1


*IF line_exists( lt_sales_order[ vbeln = '0000000031' ] ).
*  WRITE:'1'.
*ENDIF.

"4. 获取index


*DATA(idx) = line_index( lt_sales_order[ vbeln = '0000000031' ] ).
*LOOP AT lt_sales_order into data(ls_sales_order1).
*
*ENDLOOP.

"5. 将C类型转换为xstring


*DATA text TYPE i VALUE 10.
*DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ).

"6. 利用value向结构体赋值


* TYPES:  BEGIN OF ty_columns1, "Simple structure
*                     cols1 TYPE i,
*                     cols2 TYPE i,
*                   END OF ty_columns1.
* TYPES:  BEGIN OF ty_columns2,  "Nested structure
*                     coln1 TYPE i,
*                     coln2 TYPE ty_columns1,
*                   END OF ty_columns2.
*DATA: struc_nest TYPE ty_columns2.
*struc_nest = VALUE #( coln1 = 1 coln2-cols1 = 1 coln2-cols2 = 2 ).

"7. 利用value向表赋值


*TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.
*DATA itab TYPE t_itab.
*itab = VALUE #( ( 10 ) ( 1 ) ( 2 ) ).

"8. 利用value向表赋自定义范围值


*DATA itab TYPE RANGE OF i.
*
*itab = VALUE #( sign = 'I'  option = 'BT' ( low = 1  high = 10 )
*( low = 21 high = 30 )
*( low = 41 high = 50 )
*option = 'GE' ( low = 61 )  ).

"9. 将旧表(gt_ships)中的值根据条件(ls_ship–city)赋值到目标表(gt_citys)中


*DATA(gt_citys) = VALUE #( FOR ls_ship IN gt_ships ( ls_ship–city ) ).

"9.1 俩条件


*DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships
*  WHERE ( route = 'R0001' ) ( ls_ship–city ) ).

"10. 循环执行col1 = j col2 = j + 1 col3 = j + 2,当j>40的时候停止循环


*DATA(gt_itab) = VALUE #( FOR j = 11 THEN j + 10 UNTIL j > 40
*      ( col1 = j col2 = j + 1 col3 = j + 2  )
*).

"11. 循环表gt_itab到结构体wa中 当F1 = 'XYZ'时 x加1 i为lv_lines的type


*DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN gt_itab
*  WHERE ( F1 = 'XYZ' ) NEXT x = x + 1 ).

"12. 循环表itab到结构体wa中 一共多少条 就累加多少次 求总条数


*DATA(lv_sum) = REDUCE i( INIT x = 0 FOR wa IN itab NEXT x = x + wa ).

"13. reduce中可以加until for迭代 相当于java或js中的for循环


"循环将n赋值给text然后再输出
*TYPES outref TYPE REF TO if_demo_output.
*DATA(output) = REDUCE outref( INIT out  = cl_demo_output=>new( )
*                              text = `Count up:`
*                              FOR n = 1 UNTIL n > 11
*                              NEXT out = out->write( text )
*                              text = |{ n }| ).
*output->display( ).

"14. 将ls_line1的内容移动到ls_line2,其中有一个匹配的列名。在没有初始化ls_line2的列。


*ls_line2 = CORRESPONDING #( ls_line1 ).

"15. 这将使用ls_line2的现有内容作为基础,并覆盖ls_line1中匹配的列。


*ls_line2 = CORRESPONDING #( BASE ( ls_line2 ) ls_line1 ).

"16. 将创建第三个新结构(ls_line3),它基于ls_line2,但是通过匹配覆盖了它


*DATA(ls_line3) = CORRESPONDING line2( BASE ( ls_line2 ) ls_line1 ).

"17. 映射允许您映射具有不同名称组件的字段,以符合数据传输的条件。


*   … MAPPING  t1 = s1 t2 = s2

"18. EXCEPT允许列出必须从数据传输中排除的字段


*… EXCEPT  {t1 t2 …}

"19. 字符串的宽度 布局方式(居中 居左 局右) 还有通过0来布局


*WRITE / |{ 'Left'     WIDTH = 20 ALIGN = LEFT   PAD = '0' }|.
*WRITE / |{ 'Centre'   WIDTH = 20 ALIGN = CENTER PAD = '0' }|.
*WRITE / |{ 'Right'    WIDTH = 20 ALIGN = RIGHT  PAD = '0' }|.

"20. 不改变大小写


*WRITE / |{ 'Text' CASE = (cl_abap_format=>c_raw) }|.
"变大写
*WRITE / |{ 'text' CASE = (cl_abap_format=>c_upper) }|.
"变小写
*WRITE / |{ 'TEXT' CASE = (cl_abap_format=>c_lower) }|.

"21. 去前导零


*DATA(lv_vbeln) = '0000012345'.
*WRITE / |{ lv_vbeln  ALPHA = OUT }|.

"22. 加前导零


*DATA(lv_vbeln1) = '0000012345000000'.
*WRITE / |{ lv_vbeln  ALPHA = IN }|.

"23. 转换时间格式


*WRITE / |{ sy-datum DATE = ISO }|. "2019-7-23
*WRITE / |{ sy-datum DATE = USER }|. "23.07.2019
*WRITE / |{ sy-datum }|. "20190723
"语言环境的格式化设置
*WRITE / |{ sy-datum DATE = ENVIRONMENT }|.

"24. 根据group by条件遍历,符合条件的自动归为一组,然后再遍历group 打印输出


*TYPES: BEGIN OF ty_employee,
*  name TYPE char30,
*  role    TYPE char30,
*  age    TYPE i,
*END OF ty_employee,
*ty_employee_t TYPE STANDARD TABLE OF ty_employee WITH KEY name.
*DATA(gt_employee) = VALUE ty_employee_t(
*( name = 'John'     role = 'ABAP guru'       age = 34 )
*( name = 'Alice'     role = 'FI Consultant'   age = 42 )
*( name = 'Barry'    role = 'ABAP guru'       age = 54 )
*( name = 'Mary'     role = 'FI Consultant'   age = 37 )
*( name = 'Arthur'   role = 'ABAP guru'       age = 34 )
*( name = 'Mandy'  role = 'SD Consultant'  age = 64 ) ).
*DATA: gv_tot_age TYPE i,
*      gv_avg_age TYPE decfloat34.
*"Loop with grouping on Role
*LOOP AT gt_employee INTO DATA(ls_employee)
*  GROUP BY ( role  = ls_employee-role
*                     size  = GROUP SIZE
*                     index = GROUP INDEX )
*  ASCENDING
*  ASSIGNING FIELD-SYMBOL(<group>).
*  CLEAR: gv_tot_age.
*  "Output info at group level
*  WRITE: / |Group: { <group>-index } Role: { <group>-role WIDTH = 15 }| & | Number in this role: { <group>-size }|.
*   "Loop at members of the group
*   LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).
*      gv_tot_age = gv_tot_age + <ls_member>-age.
*      WRITE: /13 <ls_member>-name.
*   ENDLOOP.
*   "Average age
*   gv_avg_age = gv_tot_age / <group>-size.
*   WRITE: / |Average age: { gv_avg_age }|.
*   SKIP.
*ENDLOOP.
"将C类型转换为xstring
DATA text TYPE i value 10.
DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ).

"25. 根据key vbeln='0000000031' 读出表一条数据到表结构体中


TRY.
 DATA(ls_sales_order) = lt_sales_order[ vbeln = '0000000031' ].
*Success part
  CATCH cx_sy_itab_line_not_found.
*Failed part
ENDTRY.

"26. 根据index查出表中的一条数据


TRY.
 DATA(ls_sales_order2) = lt_sales_order[ 1 ].
*Success part
  CATCH cx_sy_itab_line_not_found.
*Failed part
ENDTRY.

"27. 定义字符串


DATA(lv_string) = 'My' && 'TEST' && 'DATA'.
DATA(lv_string_1) = |MY TEST DATA|.
DATA(lv_string_3) = 'DATA'.
DATA(lv_string2) = |MY TEST { lv_string_3 }|.

"28. 把表里的字符串连成一行,如果想用空格格开,要用``包裹


DATA: lt_table TYPE TABLE OF char100 WITH EMPTY KEY.
DATA: lv_string4 TYPE string.
APPEND 'THIS' TO lt_table.
APPEND 'IS' TO lt_table.
APPEND 'A' TO lt_table.
APPEND 'TEST' TO lt_table.
lv_string4 = concat_lines_of( table = lt_table sep = ` ` ) .

"29. 反转字符串


lv_string = reverse( lv_string ).

"30. 从左截取两位字符


DATA(lv_result_shift_1) = shift_left( val = 'ABCDEF' places = 2 ).

"31. 从左截取两位字符放在最后


DATA(lv_result_shift_2) = shift_left( val = 'ABCDEF' circular = 2 ).

"32. 从左截取sub的值,sub中的值必须从A开始,必须挨着:比如ABC 不可以AC


DATA(lv_result_shift_3) = shift_left( val = '000000000101010' sub = '0' ).
DATA(lv_result_shift_4) = shift_left( val = 'ABCEDF' sub = 'AB' ).

"33. 去前导零


DATA lv_string_11 TYPE char30 VALUE '00000000133123'.
SHIFT lv_string_11 LEFT DELETING LEADING '0'.

"34. 字符串截取


DATA(lv_result_sub_1) = substring( val = 'ABCDEFGH' off = 3 len = 4 )."从第三位开始,截取4位      DEFG
DATA(lv_result_sub_2) = substring_from( val = 'ABCDEFGH' sub = 'DEF')."从DEF开始截取直到最后     DEFGH
DATA(lv_result_sub_3) = substring_after( val = 'ABCDEFGH' sub = 'DEF')."从DEF开始截取DEF后面的   GH
DATA(lv_result_sub_4) = substring_before( val = 'ABCDEFGH' sub = 'DEF')."从DEF开始截取DEF前面的  ABC
DATA(lv_result_sub_5) = substring_to( val = 'ABCDEFGH' sub = 'D')."从左开始截取到D包括D          ABCD
 

资源下载链接为: https://pan.quark.cn/s/abbae039bf2a ABAP 语言是 SAP 系统的核心开发语言,自 20 世纪 80 年代初推出后,随着 SAP 系统版本升级不断演变。其中,ABAP 7.40 是一个关键节点,它引入了一系列语法和特性,让开发者能更高效地编写代码,提升程序性能与可读性。 一是内联声明。ABAP 7.40 支持在声明局部变量时采用内联方式,即在一行代码中同时指定变量的数据型和初始值,使代码更紧凑、便于维护和理解。 二是表达式表。版本中,表表达式更灵活强大,开发者能用似 SQL 的简洁语法操作内部表,无需传统循环结构,直接访问内部表元素。 三是转换操作符 CONVI。在 ABAP 7.40 中,该操作符得到增强,提供更丰富的型转换能力,明确直接地处理不同数据型间的转换。 四是值操作符 VALUE。它用于创建数据对象时直接赋值,简化了结构和内部表的创建与赋值过程,让代码更简洁,执行效率更高。 五是 FOR 操作符。ABAP 7.40 引入的迭代表达式,为循环结构提供直观替代方案,支持在一行内完成条件判断、范围遍历及循环结束时的特定逻辑,提升代码可读性和开发效率。 六是 REDUCE 操作符。它用于对内部表数据执行聚合操作,如求和、求极值等,使用方法和性能表现与编程语言中的“reduce”函数似。 七是条件操作符 COND 和 SWITCH。ABAP 7.40 扩展条件语句表达能力,COND 操作符让多条件判断更灵活,SWITCH 操作符则替代传统 CASE 语句,提升代码组织性和清晰度。 八是 CORRESPONDING 操作符。它能简洁地同步两个结构的字段值,减少代码编写量,提高数据同步效率,使代码更清晰。 这些特性提升了 ABAP 语言表现力,助力开发者提高生产力和应用程序质量。经验丰富的 ABAP
<think>嗯,用户想了解ABAP中REPLACE函数的语法,特别是字符串模板的使用。我需要先回忆一下ABAP语法特性,尤其是7.40版本之后引入的字符串内联操作。 记得ABAP的字符串模板是用|...|括起来的,并且可以在里面使用大括号{}嵌入变量或者表达式。对于替换操作,语法可能用到了REPLACE IN STRING TEMPLATE这样的方式,或者直接在字符串模板内进行替换。 可能需要查一下SAP官方文档,确认REPLACE函数在语法中的具体用法。比如,是否有的参数或者更简洁的写法。例如,使用正则表达式替换,或者通过偏移量和长度来指定替换位置。 用户提到的replace函数的语法例子,应该是指如何使用字符串模板结合REPLACE,或者是否有更高效的替换方法。比如,以前可能需要用多个REPLACE语句,现在可能可以在一行内完成多个替换。 还要注意语法的区别,比如旧语法可能使用REPLACE 'old' WITH 'new' INTO lv_string,而语法可能允许在字符串模板中直接操作,或者使用更简洁的函数形式。 需要确保给出的例子正确,并且符合最ABAP语法规范。例如,使用内联声明DATA(lv_result) = REPLACE(...)这样的形式,以及正则表达式替换的例子。 另外,用户可能还关心性能方面的优化,比如语法是否在底层有更高效的实现,或者是否有其他需要注意的地方,比如区分大小写、替换次数等参数。 最后,应该建议用户查阅SAP官方文档,特别是ABAP关键字文档,以获取最权威的信息和更多示例。同时,提醒他们在使用正则表达式时需要注意转义字符和匹配规则。</think>在ABAP 7.40及更高版本中,`REPLACE`函数的语法结合字符串模板技术,可通过更简洁的方式实现字符串操作。以下是三种典型使用场景的示例: **1. 基础替换语法(支持链式操作)** ```abap DATA(str) = |Hello #World#|. REPLACE ALL OCCURRENCES OF '#' IN str WITH '❤' IN CHARACTER MODE. " 结果:Hello ❤World❤ ``` **2. 正则表达式替换(需启用正则表达式标志)** ```abap DATA(json) = `{"name":"John","age":30}`. REPLACE PCRE `("\w+")` IN json WITH `<tag>$1</tag>` RESULTS(result_tab). " XML标签转换 ``` **3. 带偏移量的精准替换** ```abap DATA(iban) = 'DE89370400440532013000'. REPLACE SECTION OFFSET 4 LENGTH 8 IN iban WITH '****'. " 敏感信息脱敏 ``` **特性亮点:** - 支持`RESULTS`子句返回替换统计信息(如匹配次数、偏移量)[^1] - 可通过`IN BYTE|CHARACTER MODE`指定字符/字节处理模式[^2] - 允许使用`SUBSTRING`子句实现动态内容替换 - 正则表达式支持PCRE语法(Perl兼容正则) **注意事项:** - 旧语法`REPLACE ... INTO`仍兼容,但语法性能更优 - 使用`REGEX`时需注意ABAP的转义规则(如双反斜杠) - 字符串模板中可使用`|{ replace(...) }|`进行内联替换
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值