ABAP 7.4新特性.docx_第1页
ABAP 7.4新特性.docx_第2页
ABAP 7.4新特性.docx_第3页
ABAP 7.4新特性.docx_第4页
ABAP 7.4新特性.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ABAP 7.4新特性(一):行内定义 Inline Declarations 以前我们要用一个变量的时候,需要在使用语句的前面先定义。现在,可以在使用的时候就定义了。比如说我们经常要预先定义表的工作区,然后在loop时使用。现在可以在loop的时候就定义对于表的工作区了。以前:plain view plain copy print?1. DATAitabTYPETABLEOFscarr.2. SELECT*FROMscarrintoTABLEitab.3. DATAwaLIKELINEOFitab.4. READTABLEitabWITHKEYcarrid=LHINTOwa.DATA itab TYPE TABLE OF scarr.SELECT * FROM scarr into TABLE itab.DATA wa LIKE LINE OF itab.READ TABLE itab WITH KEY carrid = LH INTO wa. 现在:plain view plain copy print?1. DATAitabTYPETABLEOFscarr.2. SELECT*FROMscarrintoTABLEitab.3. READTABLEitabWITHKEYcarrid=LHINTODATA(wa).行内定义(inlinedeclaration)变量DATA itab TYPE TABLE OF scarr.SELECT * FROM scarr into TABLE itab.READ TABLE itab WITH KEY carrid = LH INTO DATA(wa). 行内定义(inline declaration)变量 LOOP AT同理,注意行内定义的变量作用域和以前定义的是一样的。又比如在方法中接收返回变量时:原:plain view plain copy print?1. DATAa1TYPE.2. DATAa2TYPE.3. oref-meth(IMPORTINGp1=a14. IMPORTINGp1=a25. .)DATA a1 TYPE.DATA a2 TYPE.oref-meth( IMPORTING p1=a1 IMPORTING p1=a2. )现在:plain view plain copy print?1. oref-meth(IMPORTINGp1=DATA(a1)2. IMPORTINGp1=DATA(a2)3. .)oref-meth( IMPORTING p1 = DATA(a1) IMPORTING p1= DATA(a2). )对于fieldsymbols也是支持行内定义的。以前1:plain view plain copy print?1. DATAaTYPEstringVALUEtest.2. FIELD-SYMBOL.3. ASSIGNato.DATA a TYPE string VALUE test.FIELD-SYMBOL .ASSIGN a to . 现在: plain view plain copy print?1. DATAaTYPEstringVALUEtest.2. ASSIGNatoFIELD-SYMBOL().DATA a TYPE string VALUE test.ASSIGN a to FIELD-SYMBOL().还可以用在读取内表中:plain view plain copy print?1. LOOPATitabASSIGNINGFIELD-SYMBOL()wherecarrid=LH.2. 3. WRITE:.4. 5. ENDLOOP.LOOP AT itab ASSIGNING FIELD-SYMBOL() where carrid = LH. WRITE:.ENDLOOP. 和plain view plain copy print?1. READTABLEitabassigningfield-symbol()INDEX1.READ TABLE itab assigning field-symbol() INDEX 1. 行内定义方便了我们的使用,在内表中它会自动根据读取的内表类型定义相应的工作区类型。但是使用这种方法注意作用域问题。ABAP 7.4新特性(二):NEW 操作符 NEW实例操作符了解JAVA的知道,我们可以new一个对象实例出来,现在ABAP也可以这样了。NEW可以创建匿名的数据对象或者类的实例。匿名就是new出来的对象没有名字。因为后面不需要这个对象了,只是为了new出来赋值给左边的对象(赋值也不太对,就指向。),一次使用,简化代码。具体参考java匿名类 一般用到的3种形式 后面例子详细解释1. NEW dtype( value ) .创建一个类型为dtype的匿名数据对象,然后传值给创建的对象(左操作符)。 2. NEW class( p1 = a 1 p2 = a2 . ) .创建一个名为class类的实例,并且传参到实例的构造函数。3. NEW #( . ) .根据操作数类型创建一个匿名数据对象或者一个类的实例。 如 a = new #( . ), new #( . )这里创建的匿名类是参考a的类型来的,即和a的类型一致。举例说明一下: 1.new 数据对象 before 7.4plain view plain copy print?1. FIELD-SYMBOLSTYPEdata.2. DATAdrefTYPEREFTOdata.3. CREATEDATAdrefTYPEi.4. ASSIGNdref-*TO.5. =555.FIELD-SYMBOLS TYPE data.DATA dref TYPE REF TO data.CREATE DATA dref TYPE i.ASSIGN dref-* TO . = 555. with 7.4plain view plain copy print?1. DATAdrefTYPEREFTOdata.2. dref=NEWi(555).DATA dref TYPE REF TO data.dref = NEW i( 555 ). 2.new 类实例 before 7.4plain view plain copy print?1. DATAorefTYPEREFTOclass.这里class是一个类名2. CREATEOBJECTorefEXPORTING.DATA oref TYPE REF TO class. 这里class是一个类名CREATE OBJECT oref EXPORTING .with 7.4plain view plain copy print?1. DATAorefTYPEREFTOclass.2. oref=NEW#(.).DATA oref TYPE REF TO class.oref = NEW #( . ). 或者:plain view plain copy print?1. DATAorefTYPEREFTOclass.2. oref=NEW#(.).DATA oref TYPE REF TO class.oref = NEW #( . ).最后举一个综合的例子:plain view plain copy print?1. TYPES:BEGINOFt_struct1,2. col1TYPEi,3. col2TYPEi,4. ENDOFt_struct1,5. BEGINOFt_struct2,6. col1TYPEi,7. col2TYPEt_struct1,8. col3TYPETABLEOFt_struct1WITHEMPTYKEY,9. ENDOFt_struct2,10. t_itabTYPETABLEOFt_struct2WITHEMPTYKEY.11. DATA(dref)=12. NEWt_itab(col1=113. col2-col1=114. col2-col2=215. col3=VALUE#(col1=1col2=2)VALUE下篇会讲16. (col1=3col2=4)17. (col1=218. col2-col1=219. col2-col2=420. col3=VALUE#(col1=2col2=4)21. (col1=6col2=8).22. WRITE:dref-*1-col1,dref-*2-col1.TYPES: BEGIN OF t_struct1,col1 TYPE i,col2 TYPE i,END OF t_struct1,BEGIN OF t_struct2,col1 TYPE i,col2 TYPE t_struct1,col3 TYPE TABLE OF t_struct1 WITH EMPTY KEY,END OF t_struct2,t_itab TYPE TABLE OF t_struct2 WITH EMPTY KEY.DATA(dref) =NEW t_itab( ( col1 = 1col2-col1 = 1col2-col2 = 2col3 = VALUE #( ( col1 = 1 col2 = 2 ) VALUE 下篇会讲( col1 = 3 col2 = 4 ) ) )( col1 = 2col2-col1 = 2col2-col2 = 4col3 = VALUE #( ( col1 = 2 col2 = 4 )( col1 = 6 col2 = 8 ) ) ) ).WRITE:dref-*1-col1,dref-*2-col1. 这个程序定义了两个结构t_struct1 和 t_struct2,其中t_struct2为deep struct,因为它的col3是参考t_struct1的表类型。那么后面那段代码,就是定义了一个dref引用类型变量,该变量指向的对象类型和t_itab类型相同。然后利用new和value来为匿名对象初始化数据,然后把这个匿名对象赋值给dref。这时候dref就有2行数据了。可以拷贝这段代码 然后断点看dref指向的内容。ABAP 7.4新特性(三): VALUE 操作符 关于VALUE前面也提到过了,其主要是用来给一个结构、内表等对象初始化值。主要有下面三个方式:.valuedtype#()构造一个任意类型的初始值.valuedtype#(comp1=a1comp2=a2.)构造一个任意类型的结构体的初始值.valuedtype#(.)(.).).构造一个任意类型的内表的初始值上面dtype# 意思是可以指定一个dtype的类型或者直接用#,用#时,其类型和被赋值的对象的数据类型一样。如果value后的dtype是个表,则必须指定key值,或者声明为empty key。/community/abap/blog/2013/06/27/abap-news-for-release-740-internal-tables-with-empty-key。When you declare a standard table data object without specifiying the primary key, the default key is taken. The default key consists of all character and byte like fields of the table structrure. If the structure contains only numeric fields, duh! The same would have happened if you declared theDEFAULT KEYexplicitly. But note that an empty key is not possible for sorted and hashed tables.Without explicit key declaration the type would not be usable for the inline data declaration shown here. Since I dont care about the key, I use the empty key. ASORT itabwithout specifying a sort key will do nothing and produce a warning from the syntax check.Starting with release 7.40 you declare your standard tables either with a good key or an empty key but never with the chancy default key!例1plain view plain copy print?1. CLASSc1DEFINITION.2. PUBLICSECTION.3. TYPES:BEGINOFt_struct,4. col1TYPEi,5. col2TYPEi,6. ENDOFt_struct.7. CLASS-METHODSm1IMPORTINGpTYPEt_struct.8. ENDCLASS.9. 10. CLASSc1IMPLEMENTATION.11. METHODm1.12. WRITE:col1:,p-col1,col2:,p-col2.13. ENDMETHOD.14. ENDCLASS.15. 16. START-OF-SELECTION.17. c1=m1(VALUE#(col1=1col2=2).CLASS c1 DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF t_struct, col1 TYPE i, col2 TYPE i, END OF t_struct. CLASS-METHODS m1 IMPORTING p TYPE t_struct. ENDCLASS.CLASS c1 IMPLEMENTATION. METHOD m1. WRITE:col1: , p-col1,col2:,p-col2. ENDMETHOD. ENDCLASS.START-OF-SELECTION. c1=m1( VALUE #( col1 = 1 col2 = 2 ) ).输出就是 col:1 col:2.例2plain view plain copy print?1. DATAitabTYPERANGEOFi.2. itab=VALUE#(sign=Ioption=BT(low=1high=10)3. (low=21high=30)4. (low=41high=50)5. option=GE(low=61).6. cl_demo_output=DISPLAY(itab).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 ) ).cl_demo_output=DISPLAY( itab ).例3plain view plain copy print?1. TYPESt_date_tabTYPEtableofstringwithemptykey.2. DATA(date_tab)=VALUEt_date_tab(3. (|convd(sy-datlo-1)DATE=environment|)4. (|sy-datloDATE=environment|)5. (|convd(sy-datlo+1)DATE=environment|).6. 7. cl_demo_output=DISPLAY(date_tab).TYPES t_date_tab TYPE table of string with empty key.DATA(date_tab) = VALUE t_date_tab( ( | conv d( sy-datlo - 1 ) DATE = environment | ) ( | sy-datlo DATE = environment | ) ( | conv d( 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为每一行赋值指定列名的好处:可以指定某一行的某一列都是同一个值而不用每一行都要输入该列值。补充:ABAP 7.4新特性(四): COND SWITCH 操作符 在新语法中,可以使用COND、SWITCH来根据逻辑表达式或情况的不同确定指定变量的结果。语法格式:.COND dtype | # ( WHEN log_exp1 THEN result1 WHEN log_exp2 THEN result2 . ELSE resultn ) .SWITCH dtype | # ( operandWHEN const1 THEN result1 WHEN const2 THEN result2 . ELSE resultn ) . 里可填,THEN后面都是返回的结果。在SWITCH中 operand 是一个变量类似case operand: when.例一:plain view plain copy print?1. DATA(time)=CONDstring(2. WHENsy-timlo120000THEN|CONVt(sy-timlo-12*3600)TIME=ISOPM|4. WHENsy-timlo=120000THEN|Highnoon|5. *ELSE6. ).7. WRITE:time.DATA(time) = COND string( WHEN sy-timlo 120000 THEN | CONV t( sy-timlo - 12 * 3600 ) TIME = ISO PM| WHEN sy-timlo = 120000 THEN |High noon|* ELSE ).WRITE: time.sy = 120000 就是时间12点。 程序就是根据sy-timlo是否超过12点 然后设置不同的格式赋值给time。例二:plain view plain copy print?1. DATA(a)=11.2. DATA(text)=SWITCH#(a3. WHEN11THEN11yyagd4. WHEN12THEN12dkdkkd5. *ELSE6. ).7. WRITE:text.DATA(a) = 11.DATA(text) = SWITCH #( a WHEN 11 THEN 11yyagd WHEN 12 THEN 12dkdkkd* ELSE ).WRITE: text.这段代码就是根据变量a的值,赋不同的值给text。ABAP 7.4新特性(四):内表访问表达式 现在新语法支持itab 这种类似数组的形式了,不过注意的是如果内表不含deep struct ,itab 1 2 是不允许的,这是和二维数组区别之一。只能通过itab 1 -colname 的形式,也就是说用itab 一般用来返回某一行的数据,如果你想访问改行的某一列则加上 - 和列名即可。使用主索引访问内表wa = itab idx .相当于 READ TABLE itab INDEX idx INTO wa.使用次级/二级索引访问内表wa = itab KEY key INDEX idx .相当于 READ TABLE itab INDEX idx USING KEY key INTO wa.这里注意itab必须指定次级索引,key 为次级索引名不是内表字段。举例: plain view plain copy print?1. types:BEGINOFty,2. aTYPEi,3. bTYPEi,4. cTYPEi,5. ENDOFty.6. DATAit2TYPETABLEOFtyWITHKEYa.7. DATAwalikeLINEOFit.8. DATAaaTYPESORTEDTABLEOFtyWITHUNIQUEKEYa9. WITHNON-UNIQUESORTEDKEYsecond_key10. COMPONENTSbc.11. 12. aa=VALUE#(13. (a=11b=32c=13)14. (a=21b=22c=23)15. (a=31b=42c=33).16. *wa=it21.17. wa=aaKEYsecond_keyINDEX1.18. CL_DEMO_OUTPUT=display(wa).types: BEGIN OF ty, a TYPE i, b TYPE i, c TYPE i, END OF ty.DATA it2 TYPE TABLE OF ty WITH KEY a.DATA wa like LINE OF it.DATA aa TYPE SORTED TABLE OF ty WITH UNIQUE KEY a WITH NON-UNIQUE SORTED KEY second_key COMPONENTS b c.aa = VALUE #( ( a = 11 b = 32 c = 13 ) ( a = 21 b = 22 c = 23 ) ( a = 31 b = 42 c = 33 ) ).*wa = it2 1 .wa = aa KEY second_key INDEX 1 .CL_DEMO_OUTPUT=display( wa ). 这里aa 定义了主索引key a,还定义了二级索引second_key,这个二级索引由字段b c组成。wa=aaKEYsecond_keyINDEX1. 这里指定了以二级索引second_key的 方式访问内表aa,那么默认是按照升序排列的,所以index 1 实际上是aa 的第二行(B=22 最小)。结果:如果你把第一行的b 改为22 那么wa就是第一行了,应为b 第一、第二行都最小,那么就比较二级所以的C字段,看哪个最小。使用内表KEY访问内表类似上面wa = itab KEY key col1 = . col2 = .wa = itab KEY key COMPONENTS col1 = . col2 = .相当于READ TABLE WITH TABLE KEY key COMPNENTS col1 = . col2 = . INTO wa.注意的是这种方式必须指定完所以构成key的字段。链/深结构的访问. itab .-comp . struct-comp . . . itab . . .举个例子,上代码和结果图:plain view plain copy print?1. TYPES:2. BEGINOFstruc1,3. col1TYPEi,4. col2TYPEi,5. ENDOFstruc1,6. itab1TYPETABLEOFstruc1WITHEMPTYKEY,7. itab2TYPETABLEOFitab1WITHEMPTYKEY,8. BEGINOFstruc2,9. col1TYPEi,10. col2TYPEitab2,11. ENDOFstruc2,12. itab3TYPETABLEOFstruc2WITHEMPTYKEY.13. 14. DATA(itab)=VALUEitab3(15. (col1=1col2=VALUEitab2(16. (VALUEitab1(17. (col1=2col2=3)18. (col1=4col2=5)19. (VALUEitab1(20. (col1=6col2=7)21. (col1=8col2=9)22. (col1=10col2=VALUEitab2(23. (VALUEitab1(24. (col1=11col2=12)25. (col1=13col2=14)26. (VALUEitab1(27. (col1=15col2=16)28. (col1=17col2=18).29. *Readingthecolumnwithvalue13withREADTABLEstatements30. READTABLEitabINTODATA(wa1)INDEX2.31. READTABLEwa1-col2INTODATA(wa2)INDEX1.32. READTABLEwa2INTODATA(wa3)INDEX2.33. DATA(num1)=wa3-col1.34. CL_DEMO_OUTPUT=write(num1).35. *Readingthecolumnwithvalue13withchainedtableexpressions36. DATA(num2)=itab2-col212-col1.37. CL_DEM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论