ABAP74新特性.docx
《ABAP74新特性.docx》由会员分享,可在线阅读,更多相关《ABAP74新特性.docx(24页珍藏版)》请在冰豆网上搜索。
ABAP74新特性
ABAP7.4新特性
(一):
行定义InlineDeclarations
以前我们要用一个变量的时候,需要在使用语句的前面先定义。
现在,可以在使用的时候就定义了。
比如说我们经常要预先定义表的工作区,然后在loop时使用。
现在可以在loop的时候就定义对于表的工作区了。
以前:
[plain]viewplaincopyprint?
1.DATA itab TYPE TABLE OF scarr.
2.SELECT * FROM scarr into TABLE itab.
3.DATA wa LIKE LINE OF itab.
4.READ TABLE itab WITH KEY carrid = 'LH' INTO wa.
DATAitabTYPETABLEOFscarr.
SELECT*FROMscarrintoTABLEitab.
DATAwaLIKELINEOFitab.
READTABLEitabWITHKEYcarrid='LH'INTOwa.
现在:
[plain]viewplaincopyprint?
1.DATA itab TYPE TABLE OF scarr.
2.SELECT * FROM scarr into TABLE itab.
3.READ TABLE itab WITH KEY carrid = 'LH' INTO DATA(wa). "行定义(inline declaration)变量
DATAitabTYPETABLEOFscarr.
SELECT*FROMscarrintoTABLEitab.
READTABLEitabWITHKEYcarrid='LH'INTODATA(wa)."行内定义(inlinedeclaration)变量
LOOPAT同理,注意行定义的变量作用域和以前定义的是一样的。
又比如在方法中接收返回变量时:
原:
[plain]viewplaincopyprint?
1.DATA a1 TYPE.....
2.DATA a2 TYPE...
3.oref->meth( IMPORTING p1=a1
4. IMPORTING p1=a2
5. .... )
DATAa1TYPE.....
DATAa2TYPE...
oref->meth(IMPORTINGp1=a1
IMPORTINGp1=a2
....)
现在:
[plain]viewplaincopyprint?
1.oref->meth( IMPORTING p1 = DATA(a1)
2. IMPORTING p1= DATA(a2)
3. .... )
oref->meth(IMPORTINGp1=DATA(a1)
IMPORTINGp1=DATA(a2)
....)
对于field symbols也是支持行定义的。
以前1:
[plain]viewplaincopyprint?
1.DATA a TYPE string VALUE 'test'.
2.FIELD-SYMBOL .
3.ASSIGN a to .
DATAaTYPEstringVALUE'test'.
FIELD-SYMBOL.
ASSIGNato.
现在:
[plain]viewplaincopyprint?
1.DATA a TYPE string VALUE 'test'.
2.ASSIGN a to FIELD-SYMBOL().
DATAaTYPEstringVALUE'test'.
ASSIGNatoFIELD-SYMBOL().
还可以用在读取表中:
[plain]viewplaincopyprint?
1.LOOP AT itab ASSIGNING FIELD-SYMBOL() where carrid = 'LH'. "
2.
3. WRITE:
.
4.
5.ENDLOOP.
LOOPATitabASSIGNINGFIELD-SYMBOL()wherecarrid='LH'."
WRITE:
.
ENDLOOP.
和
[plain]viewplaincopyprint?
1.READ TABLE itab assigning field-symbol() INDEX 1.
READTABLEitabassigningfield-symbol()INDEX1.
行定义方便了我们的使用,在表中它会自动根据读取的表类型定义相应的工作区类型。
但是使用这种方法注意作用域问题。
ABAP7.4新特性
(二):
NEW操作符
NEW实例操作符
了解JAVA的知道,我们可以new一个对象实例出来,现在ABAP也可以这样了。
NEW可以创建匿名的数据对象或者类的实例。
匿名就是new出来的对象没有名字。
。
。
因为后面不需要这个对象了,只是为了new出来赋值给左边的对象(赋值也不太对,就指向。
。
。
),一次使用,简化代码。
具体参考java匿名类
一般用到的3种形式后面例子详细解释
1....NEWdtype(value)...
创建一个类型为dtype的匿名数据对象,然后传值给创建的对象(左操作符)。
2....NEWclass(p1=a1p2=a2...)...
创建一个名为class类的实例,并且传参到实例的构造函数。
3....NEW#(...)...
根据操作数类型创建一个匿名数据对象或者一个类的实例。
如a=new#(...),new#(...)这里创建的匿名类是参考a的类型来的,即和a的类型一致。
举例说明一下:
1.new数据对象
before7.4
[plain]viewplaincopyprint?
1.FIELD-SYMBOLS TYPE data.
2.DATA dref TYPE REF TO data.
3.CREATE DATA dref TYPE i.
4.ASSIGN dref->* TO .
5. = 555.
FIELD-SYMBOLSTYPEdata.
DATAdrefTYPEREFTOdata.
CREATEDATAdrefTYPEi.
ASSIGNdref->*TO.
=555.
with7.4
[plain]viewplaincopyprint?
1.DATA dref TYPE REF TO data.
2.dref = NEW i( 555 ).
DATAdrefTYPEREFTOdata.
dref=NEWi(555).
2.new类实例
before7.4
[plain]viewplaincopyprint?
1.DATA oref TYPE REF TO class. "这里class是一个类名
2.CREATE OBJECT oref EXPORTING ...
DATAorefTYPEREFTOclass."这里class是一个类名
CREATEOBJECTorefEXPORTING...
with7.4
[plain]viewplaincopyprint?
1.DATA oref TYPE REF TO class.
2.oref = NEW #( ... ).
DATAorefTYPEREFTOclass.
oref=NEW#(...).
或者:
[plain]viewplaincopyprint?
1.DATA oref TYPE REF TO class.
2.oref = NEW #( ... ).
DATAorefTYPEREFTOclass.
oref=NEW#(...).
最后举一个综合的例子:
[plain]viewplaincopyprint?
1.TYPES:
BEGIN OF t_struct1,
2.col1 TYPE i,
3.col2 TYPE i,
4.END OF t_struct1,
5.BEGIN OF t_struct2,
6.col1 TYPE i,
7.col2 TYPE t_struct1,
8.col3 TYPE TABLE OF t_struct1 WITH EMPTY KEY,
9.END OF t_struct2,
10.t_itab TYPE TABLE OF t_struct2 WITH EMPTY KEY.
11.DATA(dref) =
12.NEW t_itab( ( col1 = 1
13.col2-col1 = 1
14.col2-col2 = 2
15.col3 = VALUE #( ( col1 = 1 col2 = 2 ) "VALUE 下篇会讲
16.( col1 = 3 col2 = 4 ) ) )
17.( col1 = 2
18.col2-col1 = 2
19.col2-col2 = 4
20.col3 = VALUE #( ( col1 = 2 col2 = 4 )
21.( col1 = 6 col2 = 8 ) ) ) ).
22.WRITE:
dref->*[ 1 ]-col1, dref->*[ 2 ]-col1. "
TYPES:
BEGINOFt_struct1,
col1TYPEi,
col2TYPEi,
ENDOFt_struct1,
BEGINOFt_struct2,
col1TYPEi,
col2TYPEt_struct1,
col3TYPETABLEOFt_struct1WITHEMPTYKEY,
ENDOFt_struct2,
t_itabTYPETABLEOFt_struct2WITHEMPTYKEY.
DATA(dref)=
NEWt_itab((col1=1
col2-col1=1
col2-col2=2
col3=VALUE#((col1=1col2=2)"VALUE下篇会讲
(col1=3col2=4)))
(col1=2
col2-col1=2
col2-col2=4
col3=VALUE#((col1=2col2=4)
(col1=6col2=8)))).
WRITE:
dref->*[ 1 ]-col1, dref->*[ 2 ]-col1."
这个程序定义了两个结构t_struct1和t_struct2,其中t_struct2为deepstruct,因为它的col3是参考t_struct1的表类型。
那么后面那段代码,就是定义了一个dref引用类型变量,该变量指向的
对象类型和t_itab类型相同。
然后利用new和value来为匿名对象初始化数据,然后把这个匿名对象赋值给dref。
这时候dref就有2行数据了。
可以拷贝这段代码然后断点看dref指向的容。
ABAP7.4新特性(三):
VALUE操作符
关于VALUE前面也提到过了,其主要是用来给一个结构、表等对象初始化值。
主要有下面三个方式:
...value dtype\#() 构造一个任意类型的初始值
...value dtype\#( comp1 = a1 comp2 = a2 ....) 构造一个任意类型的结构体的初始值
...value dtype\#( ( ...) (...) ... )... 构造一个任意类型的表的初始值
上面dtype\#意思是可以指定一个dtype的类型或者直接用#,用#时,其类型和被赋值的对象的数据类型一样。
如果value后的dtype是个表,则必须指定key值,或者声明为emptykey。
scn.sap./community/abap/blog/2013/06/27/abap-news-for-release-740--internal-tables-with-empty-key。
Whenyoudeclareastandardtabledataobjectwithoutspecifiyingtheprimarykey,thedefaultkeyistaken.Thedefaultkeyconsistsofallcharacterandbytelikefieldsofthetablestructrure.Ifthestructurecontainsonlynumericfields,duh!
Thesamewouldhavehappenedifyoudeclaredthe DEFAULTKEY explicitly.Butnotethatanemptykeyisnotpossibleforsortedandhashedtables.
Withoutexplicitkeydeclarationthetypewouldnotbeusablefortheinlinedatadeclarationshownhere.SinceIdon'tcareaboutthekey,Iusetheemptykey.A SORTitab withoutspecifyingasortkeywilldonothingandproduceawarningfromthesyntaxcheck.
Startingwithrelease7.40youdeclareyourstandardtableseitherwithagoodkeyoranemptykeybutneverwiththechancydefaultkey!
例1
[plain]viewplaincopyprint?
1.CLASS c1 DEFINITION.
2. PUBLIC SECTION.
3. TYPES:
BEGIN OF t_struct,
4. col1 TYPE i,
5. col2 TYPE i,
6. END OF t_struct.
7. CLASS-METHODS m1 IMPORTING p TYPE t_struct.
8. ENDCLASS.
9.
10.CLASS c1 IMPLEMENTATION.
11. METHOD m1.
12. WRITE:
'col1:
' , p-col1,'col2:
',p-col2.
13. ENDMETHOD.
14. ENDCLASS.
15.
16.START-OF-SELECTION.
17. c1=>m1( VALUE #( col1 = 1 col2 = 2 ) ).
CLASSc1DEFINITION.
PUBLICSECTION.
TYPES:
BEGINOFt_struct,
col1TYPEi,
col2TYPEi,
ENDOFt_struct.
CLASS-METHODSm1IMPORTINGpTYPEt_struct.
ENDCLASS.
CLASSc1IMPLEMENTATION.
METHODm1.
WRITE:
'col1:
',p-col1,'col2:
',p-col2.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
c1=>m1(VALUE#(col1=1col2=2)).
输出就是col:
1 col:
2.
例2
[plain]viewplaincopyprint?
1.DATA itab TYPE RANGE OF i.
2.itab = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 )
3. ( low = 21 high = 30 )
4. ( low = 41 high = 50 )
5. option = 'GE' ( low = 61 ) ).
6.cl_demo_output=>DISPLAY( itab ).
DATAitabTYPERANGEOFi.
itab=VALUE#(sign='I'option='BT'(low=1high=10)
(low=21high=30)
(low=41high=50)
option='GE'(low=61)).
cl_demo_output=>DISPLAY(itab).
例3
[plain]viewplaincopyprint?
1.TYPES t_date_tab TYPE table of string with empty key.
2.DATA(date_tab) = VALUE t_date_tab(
3. ( | { conv d( sy-datlo - 1 ) DATE = environment } | )
4. ( | { sy-datlo DATE = environment } | )
5. ( | { conv d( sy-datlo + 1 ) DATE = environment } | ) ).
6.
7.cl_demo_output=>DISPLAY( date_tab ).
TYPESt_date_tabTYPEtableofstringwithemptykey.
DATA(date_tab)=VALUEt_date_tab(
(|{convd(sy-datlo-1)DATE=environment}|)
(|{sy-datloDATE=environment}|)
(|{convd(sy-datlo+1)DATE=environment}|)).
cl_demo_output=>DISPLAY(date_tab).
这里DATE = environment是用来格式化日期的,表达式里必须有日期类型d才能使用。
environment对应的值是CL_ABAP_FORMAT=>D_ENVIRONMENT
另外对日期进行加减时还需conv。
如果第二行不用DATE = environment,那么输出就是20160606这样的格式。
关于嵌入表达式可以F1看看
例4
为每一行赋值指定列名的好处:
可以指定某一行的某一列都是同一个值而不用每一行都要输入该列值。
补充:
ABAP7.4新特性(四):
CONDSWITCH操作符
在新语法中,可以使用COND、SWITCH来根据逻辑表达式或情况的不同确定指定变量的结果。
语法格式:
...CONDdtype|#( WHENlog_exp1THENresult1
[ WHENlog_exp2THENresult2]
....
[ELSEresultn])...
...SWITCHdtype|#( operand
WHENconst1THENresult1
[ WHENconst2THENresult2]
....
[ELSEresultn])...
[]里可填,THEN后面都是返回的结果。
在SWITCH中operand是一个变量类似caseoperand:
when...
例一:
[plain]viewplaincopyprint?
1.DATA(time) = COND string(
2. WHEN sy-timlo < '120000' THEN |{ sy-timlo TIME = ISO } AM|
3. WHEN sy-timlo > '120000'