1、SAP ABAP语法实例二SAP ABAP语法实例调试1 调试键 F8跳过后面所有断点,程序执行完2 外部、会话、调试断点调试断点-debug时打的断点,程序远程完后就会消失会话断点-程序运行前通过会话断点按钮打的断点,在同一登录会话不同窗口都有效,用户注销后消失外部断点-程序运行前通过外部断点按钮打的断点,用户注销后再登录还是有效,但只针对同一用户有效Select SELECT FROM INTO WHERE GROUP BY HAVING ORDER BY .GROUP BY:用于将一组数据条目压缩为一个单行作为选择最终结果;HAVING:用于限定ORDER BY子句子数据目组的选择条件;
2、ORDER BY:用于限定行排序;SELECT整体语法结构。示例:以上示例查询的是:20170503至20170510期间销售订单为JR01,且销售量大于50的单据的订单号、创建日期、创建者、类型以及合计销量,并按销售订单升序排序。这里需要强调的是,如果要使用函数(如SUM、MAX、MIN),则需要将其他字段通过GROUP BY 进行分组。如果需要继续对使用函数进行条件筛选,则可以使用关键字HAVING。关键字ORDER BY 决定查询结果的排序方法,ASCENDING为升序,DESCENDING为降序。1 SELECT SINGLE单行数据:SELECT SINGLE INTO FROM .
3、如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。一般不需要指明所有字段,而是在SELECT后用*符号, 若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。这里的为结构非内表。示例:TABLES:sflight.DATA:sumTYPEiVALUE0.SELECTSINGLESUM(seatsocc)INTOsumFROMsflightWHEREcarrid=LH.WRITE:/sum.以上实现的是航线为LH的合计座位数。区别以下代码,上面代码只输出一行,下面则输出多行:2 SELECT / ENDSE
4、LECT循环通过SELECT / ENDSELECT循环从数据库中读取多行。SELECT DISTINCT . ENDSELECT.注:使用DISTINCT自动去掉重复的行;SY-DBCNT(系统字段)为每次循环计数.示例:使用distinct达到的效果与select single一样,建议使用select single语句。3 一次性SELECT .INTO一次性把数据选择到一个内表中去。SELECT .INTO|APPENDINGCORRESPONDING FIELDS OFTABLE itab.该情况下SELECT并不启动循环,因而不需要使用ENDSELECT语句;如果itab非空,则S
5、ELECT语句将用读取的数据覆盖其中的内容,使用APPENDING代替INTO将不覆盖内表,若结构不完全相同,也可使用CORRESPONDING FIELDS选项将同名区域相对应。SQL编写注意事项-性能实例1直接内表操作优先尽量不要在频率较高的循环语句中使用updateinsertdeletemodify等操作,即尽量不要通过工作区实现,直接通过操作内表实现。示例:2 select into table优于selectappend table.endselect在对内表赋值时,尽量使用select into table的写法来代替selectappend table.endselect 的写
6、法。尽量用对内表的操作来代替对数据库的操作。示例:DATA: BEGIN OF it_mara OCCURS 0,matnr LIKE mara-matnr,maktx LIKE makt-maktx,END OF it_mara.第一种写法:Select matnrINTO it_maraFROM mara.APPEND it_mara.ENDSelect. 第二种写法(high performace):Select matnrINTO TABLE it_maraFROM mara.3 使用for all entries不推荐Loop at int_cntry. Select single
7、* from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh.Endloop.推荐Select * from zfligh appending table int_flighFor all entries in int_cntry Where cntry = int_cntry-cntry.内表可以用来存放多笔数据,OPEN SQL允许以内表数据作为查询条件,以方便对查询对查询数据的进一步的筛选,相关语法如下:Select from FOR ALL ENTRIED IN WHERE 需要注意的是,在FO
8、R ALL ENTRIED IN itab 之前,一定要检查itab表是否为空,若为空则不执行查询,否则会查询所有非条件限制的数据。示例1:CHECKLT_MKPFISNOTINITIAL.*IFP_MATNRISNOTINITIAL.SELECTMBLNRZEILEMJAHRBWARTWERKSMATNRMENGESHKZGFROMMSEGINTOCORRESPONDINGFIELDSOFTABLELT_MSEGFORALLENTRIESINLT_MKPFWHEREMBLNR=LT_MKPF-MBLNRandMJAHR=LT_MKPF-MJAHRandWERKSINP_WERKSANDMAT
9、NRINP_MATNRANDBWARTINP_BWART.*ENDIF.示例2:DATA: BEGIN OF it_mara OCCURS 0,matnr LIKE mara-matnr,maktx LIKE makt-maktx,END OF it_mara.DATA: BEGIN OF it_makt OCCURS 0,matnr LIKE mara-matnr,maktx LIKE makt-maktx,END OF it_makt.第一种写法:(需定义it_mara)Select matnr INTO TABLE it_mara FROM mara.LOOP AT it_mara.Se
10、lect SINGLE maktx INTO it_mara-maktx FROM maktWhere matnr = it_mara-matnr AND spras = sy-langu.MODIFY it_mara TRANSPORTING maktx. * 只修改maktx字段ENDLOOP. 第二种写法(需定义it_mara &it_makt): high performaceSelect matnr INTO TABLE it_mara FROM mara.Select matnr maktx INTO TABLE it_makt FROM maktFOR ALL ENTRIES I
11、N it_maraWhere matnr = it_mara-matnr and spras = sy-langu.4 wherein对存在OR条件等判断的语句,尽量使用IN来代替。5 where条件 Where 语句中尽量避免使用”等模糊条件来查询。 不要使用CHECK语句对table 进行条件查询,用where语句代替。6 Join语句连接多个表数据查询尽量使用JOIN语句,且注意应选择数据量最小的表来作为基表,尽量避免三个以上的表的相关JOIN查询。7 select single在查询单条语句时,尽量使用select single语句,不要使用selectendselect语句。8 Up
12、 to n rows使用语法up to n rows来实现对数据前n项的查询。9 Select 栏位尽量具体尽量使用select f1 f2具体栏位来代替select * 写法。10利用函数充分利用系统提供的标准函数,如max,min,avg,sum,count.示例(使用max聚合函数):不推荐Maxnu = 0.Select * from zflight where airln = LF and cntry = IN.Check zflight-fligh maxnu.Maxnu = zflight-fligh.Endselect.推荐Select max( fligh ) from zf
13、light into maxnu where airln = LF and cntry = IN.11使用INTO table 代替select endselect不推荐Refresh: int_fligh.Select * from zflight into int_fligh.Append int_fligh. Clear int_fligh.Endselect.推荐Refresh: int_fligh.Select * from zflight into table int_fligh.TABLE1 RANGE TABLERange Table 为 SAP R/3系统标准内表的一种,结构
14、与 Selection Table 一致,由 SIGN, OPTION, LOW 和 HIGH字段组成;可以通过 TYPE RANGE OF 语句或 RANGES 关键字定义 Range Table。1) TYPE RANGE OFDATA rtab TYPE RANGE OF type|LIKE RANGE OF dobj INITIAL SIZE nWITH HEADER LINEVALUE IS INITIALREAD-ONLY.示例:2) RANGES语法:RANGES rtab FOR dobj OCCURS n.示例:2 两个内表间赋值 Itab1=itab2示例:tables:z
15、custom,scustom.datat1_zcustomtypeSTANDARDTABLEOFzcustomwithHEADERLINE.datat2_zcustomlikeSTANDARDTABLEOFzcustomWITHHEADERLINE.select*fromscustomintoCORRESPONDINGFIELDSOFTABLEt1_zcustom.t2_zcustom=t1_zcustom. APPEND lines of itab2 to itab1(append itab2 to itab1)Itab2 to itab1 还可通过LOOP 语句循环读取内表实现。示例1:l
16、oopatt1_zcustom.appendt1_zcustomtot2_zcustom. 或appendlinesoft1_zcustomtot2_zcustom.endloop.以上LOOP循环虽可实现内表逐行添加,但建议使用批量增加代替逐行添加:不推荐Loop at int_fligh1.Append int_fligh1 to int_fligh2.Endloop.推荐Append lines of int_fligh1 to int_fligh2.示例2:DATA: begin of it_makt/it_mara OCCURS0 ,ENDOF it_makt/it_mara .se
17、lectmatnrmaktxfromMAKTINTOTABLEit_maktWherespras=sy-langu.appendLINESOFit_makttoit_mara.-TABLES:MARA.DATALT_MARALIKESTANDARDTABLEOFMARAWITHHEADERLINE.DATALT2_MARALIKETABLEOFLT_MARAWITHHEADERLINE.SELECT*FROMMARAINTOTABLELT_MARA.APPENDLINESOFLT_MARATOLT2_MARA.与上面仅内表定义不同。3 COLLECTCollect语句可根据某些关键列来完成数值
18、字段的汇总。COLLECT一般在loop中使用,使用collect不需要对内表排序,对内表也没有其他限制条件。语法如下:COLLECT itab1 INTO itab2 其中itab2 必须定义为哈希表,并指定1个或多个关键字段。示例如下,数值字段有两个,非数值字段也有两个且定义为KEY ,经过下面结果可以看到,事实上完成了一个物料+库位的一个分类汇总:tables:mkpf,mseg.data:beginofita,mblnrtypemseg-mblnr,lgorttypemseg-lgort,mengetypemseg-menge,dmbtrtypemseg-dmbtr,endofita.
19、data:itblikeitaOCCURS0WITHHEADERLINE.data:itclikeHASHEDTABLEOFitawithUNIQUEKEYmblnrlgortWITHHEADERLINE.定义统计结果内表(必须是哈希内表)SELECT*FROMMSEGINTOCORRESPONDINGFIELDSOFTABLEitbWHEREmblnrBETWEEN4903037513AND4903037514.loopatitb.collectitbintoitc.按关键列统计值endloop.write:sy-uline.write:内表数据:.loopatitb.write:/,itb
20、-mblnr,itb-lgort,itb-menge,itb-dmbtr.endloop.write:sy-uline.write:collect后的数据:.loopatitc.write:/,itc-mblnr,itc-lgort,itc-menge,itc-dmbtr.endloop.write:sy-uline.实现的功能是根据物料凭证号+库位来统计 移动数量及金额,从结果来看应该是正确的,因为上面凭证是311从7012和7018的移库,数量肯定相等,金额为0,下面凭证为261发货。4 内表、字符串及循环处理 LOOP循环内表时,可根据需求加上where条件. 读取内表时加上扩展语句BI
21、NARY SEARCH. 内表数据增加APPEND ITAB(带表头).或APPEND WA TO ITAB(不带表头). 内表数据更新MODIFY 更新内表时,加上transponding 可以指定更新字段。示例如下:tables:zcustom,scustom.datat1_zcustomlikezcustomOCCURS0WITHHEADERLINE.select*fromscustomintoCORRESPONDINGFIELDSOFtablet1_zcustom.loopatt1_zcustom.t1_zcustom-name=OK1.t1_zcustom-city=OK2.MODI
22、FYT1_ZCUSTOMTRANSPONDINGNAME. endloop.“只更新了name字段。如去掉transponding则内表更新name和city字段。性能实例1 使用二分法查询,提高查询/读取内表数据速度不推荐Read table int_fligh with key airln = LF.推荐(使用前先按关键字排序)Read table int_fligh with key airln = LF binary search.2使用批量修改内表代替逐行修改不推荐Loop at int_fligh.If int_fligh-flag is initial.Int_fligh-flag = X.Endif.Modify int_fligh.Endloop.推荐Int_fligh-flag = X.Modify int_fligh transporting flag where flag is initial.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1