SAP ABAP语法实例二.docx
- 文档编号:11163724
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:13
- 大小:112.87KB
SAP ABAP语法实例二.docx
《SAP ABAP语法实例二.docx》由会员分享,可在线阅读,更多相关《SAP ABAP语法实例二.docx(13页珍藏版)》请在冰豆网上搜索。
SAPABAP语法实例二
SAPABAP语法实例
调试
1调试键
●F8跳过后面所有断点,程序执行完
2外部、会话、调试断点
调试断点-debug时打的断点,程序远程完后就会消失
会话断点-程序运行前通过
会话断点按钮打的断点,在同一登录会话不同窗口都有效,用户注销后消失
外部断点-程序运行前通过
外部断点按钮打的断点,用户注销后再登录还就是有效,但只针对同一用户有效
Select
SELECT
GROUPBY:
用于将一组数据条目压缩为一个单行作为选择最终结果;
HAVING:
用于限定ORDERBY子句子数据目组的选择条件;
ORDERBY:
用于限定行排序;
SELECT整体语法结构。
示例:
以上示例查询的就是:
20170503至20170510期间销售订单为JR01,且销售量大于50的单据的订单号、创建日期、创建者、类型以及合计销量,并按销售订单升序排序。
这里需要强调的就是,如果要使用函数(如SUM、MAX、MIN),则需要将其她字段通过GROUPBY进行分组。
如果需要继续对使用函数进行条件筛选,则可以使用关键字HAVING。
关键字ORDERBY决定查询结果的排序方法,ASCENDING为升序,DESCENDING为降序。
1SELECTSINGLE单行数据:
SELECTSINGLE
如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。
一般不需要指明所有字段,而就是在SELECT后用"*"符号,若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。
这里的
示例:
TABLES:
sflight、
DATA:
sum TYPE i VALUE 0、
SELECT SINGLE SUM( seatsocc ) INTO sum FROM sflight WHERE carrid ='LH'、
WRITE:
/ sum、
以上实现的就是航线为LH的合计座位数。
区别以下代码,上面代码只输出一行,下面则输出多行:
2SELECT/ENDSELECT循环
通过SELECT/ENDSELECT循环从数据库中读取多行。
SELECT[DISTINCT]
注:
使用DISTINCT自动去掉重复的行;SY-DBCNT(系统字段)为每次循环计数、
示例:
使用distinct达到的效果与selectsingle一样,建议使用selectsingle语句。
3一次性SELECT、、、INTO
一次性把数据选择到一个内表中去。
SELECT、、、INTO|APPENDING[CORRESPONDINGFIELDSOF]TABLEitab、
该情况下SELECT并不启动循环,因而不需要使用ENDSELECT语句;如果itab非空,则SELECT语句将用读取的数据覆盖其中的内容,使用APPENDING代替INTO将不覆盖内表,若结构不完全相同,也可使用CORRESPONDINGFIELDS选项将同名区域相对应。
SQL编写注意事项-性能实例
1直接内表操作优先
尽量不要在频率较高的循环语句中使用update\insert\delete\modify等操作,即尽量不要通过工作区实现,直接通过操作内表实现。
示例:
2select…into…table优于select…appendtable、、endselect
在对内表赋值时,尽量使用select…into…table的写法来代替select…appendtable、、endselect的写法。
尽量用对内表的操作来代替对数据库的操作。
示例:
DATA:
BEGINOFit_maraOCCURS0,
matnrLIKEmara-matnr,
maktxLIKEmakt-maktx,
ENDOFit_mara、
第一种写法:
Selectmatnr
INTOit_mara
FROMmara、
APPENDit_mara、
ENDSelect、
第二种写法(highperformace):
Selectmatnr
INTOTABLEit_mara
FROMmara、
3使用forallentries
不推荐
Loopatint_cntry、
Selectsingle*fromzflighintoint_flighwherecntry=int_cntry-cntry、
Appendint_fligh、
Endloop、
推荐
Select*fromzflighappendingtableint_fligh
Forallentriesinint_cntry
Wherecntry=int_cntry-cntry、
内表可以用来存放多笔数据,OPENSQL允许以内表数据作为查询条件,以方便对查询对查询数据的进一步的筛选,相关语法如下:
Select
需要注意的就是,在FORALLENTRIEDINitab之前,一定要检查itab表就是否为空,若为空则不执行查询,否则会查询所有非条件限制的数据。
示例1:
CHECK LT_MKPF[] IS NOT INITIAL、
* IF P_MATNR[] IS NOT INITIAL、
SELECT MBLNR ZEILE MJAHR BWART WERKS MATNR MENGE SHKZG FROM MSEG
INTO CORRESPONDING FIELDS OF TABLE LT_MSEG
FOR ALL ENTRIES IN LT_MKPF
WHERE MBLNR = LT_MKPF-MBLNR
and MJAHR = LT_MKPF-MJAHR
and WERKS IN P_WERKS
AND MATNR IN P_MATNR
AND BWART IN P_BWART、
* ENDIF、
示例2:
DATA:
BEGINOFit_maraOCCURS0,
matnrLIKEmara-matnr,
maktxLIKEmakt-maktx,
ENDOFit_mara、
DATA:
BEGINOFit_maktOCCURS0,
matnrLIKEmara-matnr,
maktxLIKEmakt-maktx,
ENDOFit_makt、
第一种写法:
(需定义it_mara)
SelectmatnrINTOTABLEit_maraFROMmara、
LOOPATit_mara、
SelectSINGLEmaktxINTOit_mara-maktxFROMmakt
Wherematnr=it_mara-matnrANDspras=sy-langu、
MODIFYit_maraTRANSPORTINGmaktx、*只修改maktx字段
ENDLOOP、
第二种写法(需定义it_mara&it_makt):
——highperformace
SelectmatnrINTOTABLEit_maraFROMmara、
SelectmatnrmaktxINTOTABLEit_maktFROMmakt
FORALLENTRIESINit_mara
Wherematnr=it_mara-matnrandspras=sy-langu、
4where…in…
对存在OR条件等判断的语句,尽量使用IN来代替。
5where条件
●Where语句中尽量避免使用”<””>”等模糊条件来查询。
●不要使用CHECK语句对table进行条件查询,用where语句代替。
6Join语句连接
多个表数据查询尽量使用JOIN语句,且注意应选择数据量最小的表来作为基表,尽量避免三个以上的表的相关JOIN查询。
7selectsingle
在查询单条语句时,尽量使用selectsingle语句,不要使用select…endselect语句。
8Uptonrows
使用语法uptonrows来实现对数据前n项的查询。
9Select栏位尽量具体
尽量使用selectf1f2…具体栏位来代替select*写法。
10利用函数
充分利用系统提供的标准函数,如max,min,avg,sum,count、
示例(使用max聚合函数):
不推荐
Maxnu=0、
Select*fromzflightwhereairln=‘LF’andcntry=‘IN’、
Checkzflight-fligh>maxnu、
Maxnu=zflight-fligh、
Endselect、
推荐
Selectmax(fligh)fromzflightintomaxnuwhereairln=‘LF’andcntry=‘IN’、
11使用INTOtable代替selectendselect
不推荐
Refresh:
int_fligh、
Select*fromzflightintoint_fligh、
Appendint_fligh、Clearint_fligh、
Endselect、
推荐
Refresh:
int_fligh、
Select*fromzflightintotableint_fligh、
TABLE
1RANGETABLE
RangeTable为SAPR/3系统标准内表的一种,结构与SelectionTable一致,由SIGN,OPTION,LOW与HIGH字段组成;
可以通过TYPERANGEOF语句或RANGES关键字定义RangeTable。
1)TYPERANGEOF…
DATArtab{TYPERANGEOFtype}|{LIKERANGEOFdobj}
[INITIALSIZEn]
[WITHHEADERLINE]
[VALUEISINITIAL]
[READ-ONLY]、
示例:
2)RANGES
语法:
RANGESrtabFORdobj[OCCURSn]、
示例:
2两个内表间赋值
●Itab1[]=itab2[]
示例:
tables:
zcustom,scustom、
data t1_zcustom type STANDARD TABLE OF zcustom with HEADER LINE、
data t2_zcustom like STANDARD TABLE OF zcustom WITH HEADER LINE、
select * from scustom into CORRESPONDING FIELDS OF TABLE t1_zcustom、
t2_zcustom[] = t1_zcustom[]、
●APPENDlinesofitab2toitab1(appenditab2toitab1)
Itab2toitab1还可通过LOOP语句循环读取内表实现。
示例1:
loop at t1_zcustom、
append t1_zcustom to t2_zcustom、或append lines of t1_zcustom to t2_zcustom、
endloop、
以上LOOP循环虽可实现内表逐行添加,但建议使用批量增加代替逐行添加:
不推荐
Loopatint_fligh1、
Appendint_fligh1toint_fligh2、
Endloop、
推荐
Appendlinesofint_fligh1toint_fligh2、
示例2:
DATA:
beginofit_makt/it_maraOCCURS 0,
…
END OFit_makt/it_mara、
select matnr maktx from MAKT INTO TABLE it_makt Where spras = sy-langu、
append LINES OF it_makt to it_mara、
--------------------------------------------------------------------------------------
TABLES:
MARA、
DATA LT_MARA LIKE STANDARD TABLE OF MARA WITH HEADER LINE、
DATA LT2_MARA LIKE TABLE OF LT_MARA WITH HEADER LINE、
SELECT * FROM MARA INTO TABLE LT_MARA、
APPEND LINES OF LT_MARA TO LT2_MARA、
与上面仅内表定义不同。
3COLLECT
Collect语句可根据某些关键列来完成数值字段的汇总。
COLLECT一般在loop中使用,使用collect不需要对内表排序,对内表也没有其她限制条件。
语法如下:
COLLECTitab1INTOitab2
其中itab2必须定义为哈希表,并指定1个或多个关键字段。
示例如下,数值字段有两个,非数值字段也有两个且定义为KEY,经过下面结果可以瞧到,事实上完成了一个物料+库位的一个分类汇总:
tables:
mkpf,mseg、
data:
begin of ita,
mblnr type mseg-mblnr,
lgort type mseg-lgort,
menge type mseg-menge,
dmbtr type mseg-dmbtr,
end of ita 、
data:
itb like ita OCCURS 0 WITH HEADER LINE 、
data:
itc like HASHED TABLE OF ita with UNIQUE KEY mblnr lgort WITH HEADER LINE、 "定义统计结果内表(必须就是哈希内表)
SELECT * FROM MSEG INTO CORRESPONDING FIELDS OF TABLE itb
WHERE mblnr BETWEEN '4903037513' AND '4903037514'、
loop at itb、
collect itb into itc、 "按关键列统计值
endloop 、
write :
sy-uline 、
write :
'内表数据:
' 、
loop at itb、
write :
/ ' ' ,itb-mblnr,itb-lgort, itb-menge,itb-dmbtr、
endloop 、
write :
sy-uline 、
write :
'collect后的数据:
' 、
loop at itc、
write :
/ ' ' ,itc-mblnr,itc-lgort, itc-menge,itc-dmbtr、
endloop 、
write :
sy-uline 、
实现的功能就是根据物料凭证号+库位来统计移动数量及金额,从结果来瞧应该就是正确的,因为上面凭证就是311从7012与7018的移库,数量肯定相等,金额为0,下面凭证为261发货。
4内表、字符串及循环处理
●LOOP循环内表时,可根据需求加上where条件、
●读取内表时加上扩展语句BINARYSEARCH、
●内表数据增加
APPENDITAB(带表头)、或APPENDWATOITAB(不带表头)、
●内表数据更新
MODIFY更新内表时,加上transponding可以指定更新字段。
示例如下:
tables:
zcustom,scustom、
data t1_zcustom like zcustom OCCURS 0 WITH HEADER LINE、
select * from scustom into CORRESPONDING FIELDS OF table t1_zcustom 、
loop at t1_zcustom 、
t1_zcustom-name = 'OK1'、
t1_zcustom-city = 'OK2'、
MODIFY T1_ZCUSTOM TRANSPONDING NAME、
endloop、
“只更新了name字段。
如去掉transponding则内表更新name与city字段。
性能实例
1使用二分法查询,提高查询/读取内表数据速度
不推荐
Readtableint_flighwithkeyairln=‘LF’、
推荐(使用前先按关键字排序)
Readtableint_flighwithkeyairln=‘LF’binarysearch、
2使用批量修改内表代替逐行修改
不推荐
Loopatint_fligh、
Ifint_fligh-flagisinitial、
Int_fligh-flag=‘X’、
Endif、
Modifyint_fligh、
Endloop、
推荐
Int_fligh-flag=‘X’、
Modifyint_flightransportingflagwhereflagisinitial、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAP ABAP语法实例二 ABAP 语法 实例