ABAP 新语法(1)
但是这个项目,周边小孩都比我小十来岁,人家还是很喜欢研究新东西的,而且项目里很多代码,确实都是用的新语法。另外一个demo,里面有个大括号{}的使用。跟直接&& 拼接有空格的差别。SQL语句:这个有点意思,原来这种截取取数还挺麻烦的。CORRESPONDING 还是有区别的哈。我自己多多少少有点怀旧,不太使用新语法。参考资料(不完全统计哈,可能随手给关了)先整理这些吧,别的我回头查查继续补充。比较

我自己多多少少有点怀旧,不太使用新语法。
但是这个项目,周边小孩都比我小十来岁,人家还是很喜欢研究新东西的,而且项目里很多代码,确实都是用的新语法。
不用也得能看懂吧。索性也鼓捣鼓捣。
比较简单的,不用提前定义声明的情况
*oldDATALT_DATA TYPE TABLE OF SPFLI.SELECT* FROM SPFLI INTO TABLE LT_DATA.
* newSELECT* FROM SPFLI INTO TABLE @DATA(LT_DATA).
-----------------------------------------------*oldDATALT_DATA TYPE TABLE OF SPFLI. DATA LS_DATA LIKE LINE OF LT_DATA.LOOPAT LT_DATA INTO LS_DATA. ENDLOOP. READ TABLE LT_DATA INTO LS_DATA INDEX 1.* newLOOPAT LT_DATA INTO DATA(LS_DATA).ENDLOOP.READTABLE LT_DATA INTO DATA(LS_DATA) INDEX 1.
READTABLE LT_DATA ASSIGNING FIELD-SYMBOL(<ls_data>) INDEX 1.
内表赋值:
RANGES RT_BUKRS FOR T001-BUKRS.
RT_BUKRS[] = VALUE #(( SIGN = 'I' OPTION = 'BT' LOW = '1001' HIGH = '1099' )( SIGN = 'I' OPTION = 'EQ' LOW = '2001' ) ).
CL_DEMO_OUTPUT=>DISPLAY( RT_BUKRS[] ).

base:内表基础上附加额外数据
RANGES RT_BUKRS FOR T001-BUKRS.
RT_BUKRS[] = VALUE #(( SIGN = 'I' OPTION = 'BT' LOW = '1001' HIGH = '1099' )( SIGN = 'I' OPTION = 'EQ' LOW = '2001' ) ).
"内表基础上附加额外数据RT_BUKRS[] = VALUE #( BASE RT_BUKRS[] ( SIGN = 'I' OPTION = 'EQ' LOW = '3001' ) ).CL_DEMO_OUTPUT=>DISPLAY( RT_BUKRS[] ).

关于 CORRESPONDING
DATA:LS_TMP1 TYPE SBOOK.DATA:LS_TMP2 TYPE SBOOK.DATA:LS_TMP3 TYPE SBOOK.SELECT SINGLE * FROM SFLIGHT INTO @DATA(LS_DATA) WHERE CARRID = 'AA'.
LS_TMP1-BOOKID = '99999999'.LS_TMP1-CUSTOMID = '88888888'.LS_TMP1-FLDATE = '20210101'.
LS_TMP2-BOOKID = '99999999'.LS_TMP2-CUSTOMID = '88888888'.LS_TMP2-FLDATE = '20210101'.
LS_TMP3-BOOKID = '99999999'.LS_TMP3-CUSTOMID = '88888888'.LS_TMP3-FLDATE = '20210101'.
LS_TMP1 = CORRESPONDING #( BASE ( LS_TMP1 ) LS_DATA ). "不指定BASE 初始值会丢失LS_TMP2 = CORRESPONDING #( LS_DATA ). "不指定BASE 初始值会丢失MOVE-CORRESPONDING LS_DATA TO LS_TMP3.
CL_DEMO_OUTPUT=>WRITE( LS_TMP1 ).CL_DEMO_OUTPUT=>WRITE( LS_TMP2 ).CL_DEMO_OUTPUT=>WRITE( LS_TMP3 ).CL_DEMO_OUTPUT=>DISPLAY( ).
效果:

CORRESPONDING # 跟 MOVE-CORRESPONDING 还是有区别的哈。
Width/Alignment/Padding 宽度/对齐/填充
DATA:LV_MANTR1 TYPE MATNR VALUE '11'.DATA:LV_MATNR2 TYPE MATNR .DATA:LV_MATNR3 TYPE MATNR .DATA:LV_MATNR4 TYPE MATNR .
*Width/Alignment/Padding 宽度/对齐/填充LV_MATNR2 = |{ LV_MANTR1 WIDTH = 18 ALIGN = RIGHT PAD = '0' }|.
CALLFUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGINPUT = LV_MANTR1IMPORTINGOUTPUT = LV_MATNR3EXCEPTIONSLENGTH_ERROR = 1OTHERS = 2.IFSY-SUBRC <> 0.*Implement suitable error handling hereENDIF.
LV_MATNR4 = |{ LV_MATNR3 ALPHA = OUT }|.
CL_DEMO_OUTPUT=>WRITE( 'LV_MANTR1:' && LV_MANTR1 ).CL_DEMO_OUTPUT=>WRITE( 'LV_MATNR2:' && LV_MATNR2 ).CL_DEMO_OUTPUT=>WRITE( 'LV_MATNR3:' && LV_MATNR3 ).CL_DEMO_OUTPUT=>WRITE( 'LV_MATNR4:' && LV_MATNR4 ).
CL_DEMO_OUTPUT=>DISPLAY( ).
效果图

日期格式
DATA(P_DATE) = SY-DATUM.
WRITE/ |{ P_DATE DATE = ISO }|. "Date Format YYYY-MM-DDWRITE/ |{ P_DATE DATE = USER }|. "As per user settingsWRITE/ |{ P_DATE DATE = ENVIRONMENT }|. "Formatting setting of language environment

字符串内表拼接
SELECT WERKS FROM t001w INTOTABLE @DATA(gt_data).
DATA(lv_concat_lines) = concat_lines_of( table = gt_data sep = '/' ).
DATA:lt_tmp like gt_data.SPLIT lv_concat_lines AT'/'INTOTABLE lt_tmp.
CL_DEMO_OUTPUT=>WRITE( lv_concat_lines ).CL_DEMO_OUTPUT=>WRITE( lt_tmp[] ).
CL_DEMO_OUTPUT=>DISPLAY( ).
效果图

关于内表的几个操作
SELECT * FROM SPFLI INTOTABLE @DATA(GT_DATA) WHERE carrid = 'AZ'.
"输出查询结果CL_DEMO_OUTPUT=>WRITE( GT_DATA ).
"找到数据DATA(LV_INDEX) = LINE_INDEX( GT_DATA[ CARRID = 'AZ' CONNID = '0788' ] ).
IF LV_INDEX NE 0AND LINE_EXISTS( GT_DATA[ LV_INDEX ] ) .DATA(LS_DATA) = GT_DATA[ LV_INDEX ]. "取该行数据ENDIF.
CL_DEMO_OUTPUT=>WRITE( LS_DATA ).
"看看多条记录的时候,找到的第几条SORT GT_DATA by CITYFROM.DATA(LV_INDEX_tmp) = LINE_INDEX( GT_DATA[ CITYFROM = 'ROME' ] ).
CL_DEMO_OUTPUT=>WRITE( LV_INDEX_tmp ).
CL_DEMO_OUTPUT=>DISPLAY( ).
效果图


另外一个demo,里面有个大括号{}的使用。跟直接&& 拼接有空格的差别。
SELECT * FROM SPFLI INTO TABLE @DATA(GT_DATA) WHERE CARRID = 'AZ'.
CL_DEMO_OUTPUT=>WRITE( GT_DATA ).CL_DEMO_OUTPUT=>WRITE( GT_DATA[ CONNID = '0788' ] ).CL_DEMO_OUTPUT=>WRITE( GT_DATA[ CONNID = '0788' ]-CONNID ).
CL_DEMO_OUTPUT=>WRITE( |CONNID: { GT_DATA[ CONNID = '0788' ]-CONNID }| ).
CL_DEMO_OUTPUT=>WRITE( 'CONNID:'&& GT_DATA[ CONNID = '0788' ]-CONNID ).
CL_DEMO_OUTPUT=>DISPLAY( ).

内表 filter
REPORT ZLM_FILTER.
TYPES: BEGINOF TY_FILTER, CITYFROM TYPE SPFLI-CITYFROM, CITYTO TYPE SPFLI-CITYTO,ENDOF TY_FILTER,
*& 需要是排序表或者哈希表* TY_FILTER_TAB TYPE SORTED TABLEOF TY_FILTER WITHUNIQUEKEY CITYFROM CITYTO. TY_FILTER_TAB TYPE HASHED TABLEOF TY_FILTER WITHUNIQUEKEY CITYFROM CITYTO.
*& 查询所有数据SELECT * FROM SPFLI INTOTABLE @DATA(LT_SPLFI).SORT LT_SPLFI by CITYFROM.
*筛选数据DATA(LT_FILTER) = VALUE TY_FILTER_TAB( ( CITYFROM = 'NEW YORK' CITYTO ='SAN FRANCISCO' ) ( CITYFROM = 'FRANKFURT' CITYTO = 'NEW YORK' ) ).
DATA(LT_RESULT) = FILTER #( LT_SPLFI IN LT_FILTERWHERE CITYFROM = CITYFROMAND CITYTO = CITYTO ).
*排除DATA(LT_EXCEPT) = FILTER #( LT_SPLFI EXCEPT IN LT_FILTERWHERE CITYFROM = CITYFROMAND CITYTO = CITYTO ).
CL_DEMO_OUTPUT=>WRITE( LT_SPLFI ).
CL_DEMO_OUTPUT=>WRITE( LT_RESULT ).
CL_DEMO_OUTPUT=>WRITE( LT_EXCEPT ).
CL_DEMO_OUTPUT=>DISPLAY( ).
效果图:

*版权声明:本文为CSDN博主「尤其是十月的风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。*原文链接:https://blog.csdn.net/qq_34060435/article/details/117109771*---------------------------------------------------------------------** LET关键字可以使用在VALUE,SWITCH,COND等语句中;*与 FOR 语句类似,LET 语句中定义的临时变量同样只能在当前语句中使用,*在其他语句中使用时会检查出语法错误*---------------------------------------------------------------------*TYPES: BEGIN OF TY_DATA,MATNRTYPE MARA-MATNR,MTARTTYPE MARA-MTART,MATKLTYPE MARA-MATKL,TEXT1TYPE CHAR50,ENDOF TY_DATA.
DATALT_DATA TYPE TABLE OF TY_DATA.
LT_DATA = VALUE #((MATNR = 'MATRIAL-001'MTART = 'WATR'MATKL = '1020'TEXT1 = 'FIRST material' )(MATNR = 'MATRIAL-002'MTART = 'FOOD'MATKL = '1030'TEXT1 = 'SECOND material' )(MATNR = 'MATRIAL-003'MTART = 'WATR'MATKL = '1040'TEXT1 = 'THIRD material' )).
DATA(LW_LINE) = VALUE TY_DATA( LETLW_DATA = VALUE #( LT_DATA[ MATNR = 'MATRIAL-001' ] OPTIONAL )LV_STR = 'Date:' && SY-DATUMINMATNR = LW_DATA-MATNRMTART = LW_DATA-MTARTMATKL = LW_DATA-MATKLTEXT1 = LV_STR).
CALLMETHOD CL_DEMO_OUTPUT=>DISPLAY( LW_LINE ).
效果:

Group by
DATA LT_TMP TYPE TABLE OF SFLIGHT.
START-OF-SELECTION.
SELECT * FROM SFLIGHT INTOTABLE @DATA(LT_SFLIGHT)WHERE PLANETYPE = 'A340-600'. LOOPAT LT_SFLIGHT INTODATA(LS_SFLIGHT)GROUPBY ( CARRID = LS_SFLIGHT-CARRID CONNID = LS_SFLIGHT-CONNID ) ASCENDING INTODATA(LT_GROUP) .LOOPATGROUP LT_GROUP INTODATA(LS_GROUP). APPEND LS_GROUP TO LT_TMP. ENDLOOP. CL_DEMO_OUTPUT=>WRITE( LT_TMP ).CLEAR LT_TMP[]. ENDLOOP. CL_DEMO_OUTPUT=>DISPLAY( ).
效果图

SQL语句:这个有点意思,原来这种截取取数还挺麻烦的。
SELECT * FROM spfliWHERELEFT( CARRID , 1 ) = 'A'INTOTABLE @DATA(gt_data).
CL_DEMO_OUTPUT=>WRITE( gt_data ).
SELECT * FROM spfliWHERERIGHT( CARRID , 1 ) = 'Z'INTOTABLE @DATA(gt_data2).
CL_DEMO_OUTPUT=>WRITE( gt_data2 ).
SELECT * FROM spfliWHERESUBSTRING( CARRID , 1,1 ) = 'A'INTOTABLE @DATA(gt_data3).CL_DEMO_OUTPUT=>WRITE( gt_data3 ).
SELECT * FROM spfliWHERESUBSTRING( CARRID , 2,1 ) = 'Z'INTOTABLE @DATA(gt_data4).CL_DEMO_OUTPUT=>WRITE( gt_data4 ).
CL_DEMO_OUTPUT=>display( ).
效果图

先整理这些吧,别的我回头查查继续补充。
最后附上网上的一张图:

参考资料(不完全统计哈,可能随手给关了)
https://www.cnblogs.com/learnning/p/10647174.html
https://blog.csdn.net/zhongguomao/article/details/104544092
https://blog.csdn.net/Qunending/article/details/124927276?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-124927276-blog-104544092.pc_relevant_multi_platform_featuressortv2removedup&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-124927276-blog-104544092.pc_relevant_multi_platform_featuressortv2removedup&utm_relevant_index=11
推荐阅读:
《使用cl_gui_docking_container 实现多ALV》
《DEMO:S/4 1809 FAGLL03H 增加字段增强》
《几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了》
《SAP Parallel Accounting(平行分类账业务)配置+操作手册+BAPI demo程序》
《CC02修改确认日期BAPI:Processing of change number was canceled》
《RESTful DEMO 一:SAP 如何提供 RESTful Web 服务》
更多推荐



所有评论(0)