版权声明:本文为CSDN博主「王独秀儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42959207/article/details/97015531
"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
————————————————