加载中…
个人资料
SAP刘梦
SAP刘梦
  • 博客等级:
  • 博客积分:0
  • 博客访问:13,971
  • 关注人气:96
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ABAP新语法(1)

(2022-09-03 13:58:43)
标签:

abap

alv

f4

liumeng

sap

我自己多多少少有点怀旧,不太使用新语法。

但是这个项目,周边小孩都比我小十来岁,人家还是很喜欢研究新东西的,而且项目里很多代码,确实都是用的新语法。

不用也得能看懂吧。索性也鼓捣鼓捣。

比较简单的,不用提前定义声明的情况



* old  DATA LT_DATA TYPE TABLE OF SPFLI.  SELECT * FROM SPFLI INTO TABLE LT_DATA.
new SELECT * FROM SPFLI INTO TABLE @DATA(LT_DATA). ----------------------------------------------- * old DATA LT_DATA TYPE TABLE OF SPFLI.  DATA LS_DATA LIKE LINE OF LT_DATA. LOOP AT LT_DATA INTO LS_DATA.  ENDLOOP.  READ TABLE LT_DATA INTO LS_DATA INDEX 1.new LOOP AT LT_DATA INTO DATA(LS_DATA). ENDLOOP. READ TABLE LT_DATA INTO DATA(LS_DATA) INDEX 1.
READ TABLE LT_DATA ASSIGNING FIELD-SYMBOL() 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' }|.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' EXPORTING INPUT = LV_MANTR1 IMPORTING OUTPUT = LV_MATNR3 EXCEPTIONS LENGTH_ERROR = 1 OTHERS = 2.IF SY-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 INTO TABLE @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 '/' INTO TABLE lt_tmp.
CL_DEMO_OUTPUT=>WRITE( lv_concat_lines ).CL_DEMO_OUTPUT=>WRITE( lt_tmp[] ).
CL_DEMO_OUTPUT=>DISPLAY( ).


关于内表的几个操作



SELECT * FROM SPFLI INTO TABLE @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 0 AND 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( ).


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有