相比其他语言,ABAP可能有很多特有的长处,但简洁从来就不是它的优点之一。
不像其他语言通过Library提供常用功能,ABAP大量使用内置声明(Built-In Statement) 来完善自身,这也是为什么其代码看起来非常“冗长(verbose)”的原因。但是ABAP的作者还是有一直作改进的努力。
笔者在一些Infinity开发系统上经常看到对新语法的介绍。
本文就推荐几个自己积累的,比较有用的新语法,权当抛砖引玉。希望大家多按F1,会有很多惊喜。
NOTE: 这些Statement不同程度依赖于ABAP运行版本,对于需要做Downport或为客户提供服务的同学,请谨慎使用。
-
1.class->method( ):
-
这个大家应该都了解。在这里只是说明一下CALL METHOD已经是不推荐使用的Statement,刨去兼容性的问题不说大家都应该放弃这种调用method的方法。
-
2. DATA(var) or FEILD-SYMBOL(<fs>):
-
这是一种声明变量的方式,叫做Inline Declaration。想必大家都遇到过类似的情况:需要用一个临时变量来记录个什么东西,于是不得不在方法前面插入一条声明变量。这种做法对于一些只在局部使用的变量来讲实在太过麻烦,而且混在许多全局或者比较重要的变量声明之中,难免混淆视听。这时使用Inline Declaration就非常合适。
-
举个栗子:
-
DATA(i) = sy-index. "记录一个int值
-
DATA(local_obj) = cl_factory()->get_instance(). "获得一个实例
-
LOOP itab ASSIGNING FIELD-SYMBOL(<fs>). " 在loop中获取一个临时的fs用于读写,同样用DATA可以获取一个工作区
-
DESCRIBETABLEitab LINES DATA(i). "不解释
-
.......
-
类似的用法还用很多,大家可以多尝试。需要说明的是,右函数或赋值操作必须能够提供关于这个返回值的明确类型,否则不能使用这个声明。其他关于这个声明的具体信息请猛击F1。
-
3. itab[ table_expression ]:
-
这是一个可以代替READ TABLE的声明,非常的简洁明了。区别是它并不会改变sy-tabix的值。
-
综合上面的一条提供一个例子:DATA(wa) = itab[ 1 ]. " 取itab第一行放入wa. 不要问我为什么是1不是0.
-
其他用法依然猛击F1.
-
DATA : LT_MARA LIKE TABLE OF MARA WITH HEADER LINE.
SELECT * FROM MARA INTO TABLE LT_MARA UP TO 10 ROWS.
LOOP AT LT_MARA ASSIGNING FIELD-SYMBOL(<FS>).
WRITE : / SY-TABIX,<FS>-MATNR.
ENDLOOP.
DATA(WA) = LT_MARA[ 5 ].
WRITE : / .
WRITE : / SY-TABIX,WA-MATNR.
-
-
4. VALUE type( ... ):
-
这里的VALUE是作为操作符(Operator)出现。与第二条总有一点说不清道不明的暧昧关系。
-
下面举个例子:DATA(wa) = VALUE bseg( bukrs = '0001' butxt = 'any text' ). "产生一个bseg类型的structure, 相应的字段赋予初始值, 然后整个赋给wa
-
更牛逼的还可以配合"#"使用,详情猛击F1.
-
DATA : LT_MARA LIKE TABLE OF MARA WITH HEADER LINE.
DATA(WA) = VALUE MARA( MATNR = '3010001001' MATKL = '3010' ).
APPEND WA TO LT_MARA.
WRITE : / WA-MATNR,WA-MATKL.
DESCRIBE TABLE LT_MARA LINES DATA(I).
WRITE : / I.
-
-
5. |....|:
-
没错就是前后两个 "|",可以用来操作String,用例子说的更明白:
-
DATA(str) = |Hello World!|. " str = 'Hello World!'
-
DATA(str) = | {attr} |. " attr是什么值str就是什么值
-
DATA(str) = | {func( )} |. " func是个方法,返回的string就给了str.
-
更多用法还有操作符"&",没错,F1. CONCATENATE并不是唯一的选择。
-
DATA(STR1) = |Good_1|.
WRITE : / STR1.
DATA(STR2) = |{ 'Good_2' }|.
WRITE : / STR2.
DATA(STR3) = 'Good' && '_' && '3'.
WRITE : / STR3.
-
-
6. FOR / LET / SWITCH / COND.......
-
F1王道,保证有惊喜。
-
结语: 不管ABAP的未来如何,其实可以看出ABAP的创造者们还是不断改进着它。有些改进很赞,有些也很奇葩,试图追赶主流程序语言的趋势却还是感觉越离越远。今天在E91开发系统上看到了用ABAP写的2048,扫雷等小游戏,就大量运用了上面提到的这些语法,看着非常嗲。但是运行效果么...有些总归是没办法的事情。不过作为程序员,写出简洁优雅可(kan)读(zhe)性(niu)强(bi)的代码总是永远的追求,谨以此文与各位共勉。