SAP ABAP语法实例二Word格式文档下载.docx

上传人:b****6 文档编号:17320979 上传时间:2022-12-01 格式:DOCX 页数:11 大小:112.45KB
下载 相关 举报
SAP ABAP语法实例二Word格式文档下载.docx_第1页
第1页 / 共11页
SAP ABAP语法实例二Word格式文档下载.docx_第2页
第2页 / 共11页
SAP ABAP语法实例二Word格式文档下载.docx_第3页
第3页 / 共11页
SAP ABAP语法实例二Word格式文档下载.docx_第4页
第4页 / 共11页
SAP ABAP语法实例二Word格式文档下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

SAP ABAP语法实例二Word格式文档下载.docx

《SAP ABAP语法实例二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SAP ABAP语法实例二Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。

SAP ABAP语法实例二Word格式文档下载.docx

这里需要强调的是,如果要使用函数(如SUM、MAX、MIN),则需要将其他字段通过GROUPBY进行分组。

如果需要继续对使用函数进行条件筛选,则可以使用关键字HAVING。

关键字ORDERBY决定查询结果的排序方法,ASCENDING为升序,DESCENDING为降序。

1SELECTSINGLE单行数据:

SELECTSINGLE<

RESULT>

...

如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。

一般不需要指明所有字段,而是在SELECT后用"

*"

符号,若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。

这里的<

为结构非内表。

TABLES:

sflight.

DATA:

sum 

TYPE 

VALUE 

0.

SELECT 

SINGLE 

SUM( 

seatsocc 

) 

INTO 

FROM 

sflight 

WHERE 

carrid 

='

LH'

.

WRITE:

sum.

以上实现的是航线为LH的合计座位数。

区别以下代码,上面代码只输出一行,下面则输出多行:

2SELECT/ENDSELECT循环

通过SELECT/ENDSELECT循环从数据库中读取多行。

SELECT[DISTINCT]<

...<

statementblock>

ENDSELECT.

注:

使用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的写法。

尽量用对内表的操作来代替对数据库的操作。

BEGINOFit_maraOCCURS0,

matnrLIKEmara-matnr,

maktxLIKEmakt-maktx,

ENDOFit_mara.

第一种写法:

Selectmatnr

INTOit_mara

FROMmara.

APPENDit_mara.

ENDSelect.

第二种写法(highperformace):

INTOTABLEit_mara

3使用forallentries

不推荐

Loopatint_cntry.

Selectsingle*fromzflighintoint_flighwherecntry=int_cntry-cntry.

Appendint_fligh.

Endloop.

推荐

Select*fromzflighappendingtableint_fligh

Forallentriesinint_cntry

Wherecntry=int_cntry-cntry.

内表可以用来存放多笔数据,OPENSQL允许以内表数据作为查询条件,以方便对查询对查询数据的进一步的筛选,相关语法如下:

Select<

f1…fn>

from<

dbtab>

FORALLENTRIEDIN<

itab>

WHERE…

需要注意的是,在FORALLENTRIEDINitab之前,一定要检查itab表是否为空,若为空则不执行查询,否则会查询所有非条件限制的数据。

示例1:

CHECK 

LT_MKPF[] 

IS 

NOT 

INITIAL.

IF 

P_MATNR[] 

MBLNR 

ZEILE 

MJAHR 

BWART 

WERKS 

MATNR 

MENGE 

SHKZG 

MSEG

CORRESPONDING 

FIELDS 

OF 

TABLE 

LT_MSEG

FOR 

ALL 

ENTRIES 

IN 

LT_MKPF

LT_MKPF-MBLNR

and 

LT_MKPF-MJAHR

P_WERKS

AND 

P_MATNR

P_BWART.

ENDIF.

示例2:

BEGINOFit_maktOCCURS0,

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

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.

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 

zcustom 

with 

HEADER 

LINE.

t2_zcustom 

like 

WITH 

select 

from 

scustom 

into 

t1_zcustom.

t2_zcustom[] 

t1_zcustom[].

●APPENDlinesofitab2toitab1(appenditab2toitab1)

Itab2toitab1还可通过LOOP语句循环读取内表实现。

loop 

at 

append 

to 

t2_zcustom.或append 

lines 

of 

t2_zcustom.

endloop.

以上LOOP循环虽可实现内表逐行添加,但建议使用批量增加代替逐行添加:

Loopatint_fligh1.

Appendint_fligh1toint_fligh2.

Appendlinesofint_fligh1toint_fligh2.

 

beginofit_makt/it_maraOCCURS 

0,

END 

OFit_makt/it_mara.

matnr 

maktx 

MAKT 

it_makt 

Where 

spras 

sy-langu.

LINES 

it_mara.

--------------------------------------------------------------------------------------

MARA.

DATA 

LT_MARA 

LIKE 

MARA 

LT2_MARA 

LT_MARA.

APPEND 

TO 

LT2_MARA.

与上面仅内表定义不同。

3COLLECT

Collect语句可根据某些关键列来完成数值字段的汇总。

COLLECT一般在loop中使用,使用collect不需要对内表排序,对内表也没有其他限制条件。

语法如下:

COLLECTitab1INTOitab2

其中itab2必须定义为哈希表,并指定1个或多个关键字段。

示例如下,数值字段有两个,非数值字段也有两个且定义为KEY,经过下面结果可以看到,事实上完成了一个物料+库位的一个分类汇总:

mkpf,mseg.

data:

begin 

ita,

mblnr 

mseg-mblnr,

lgort 

mseg-lgort,

menge 

mseg-menge,

dmbtr 

mseg-dmbtr,

end 

ita 

itb 

OCCURS 

LINE 

itc 

HASHED 

UNIQUE 

KEY 

LINE. 

"

定义统计结果内表(必须是哈希内表)

MSEG 

itb

BETWEEN 

'

4903037513'

4903037514'

itb.

collect 

itc. 

按关键列统计值

endloop 

write 

:

sy-uline 

内表数据:

itb-mblnr,itb-lgort, 

itb-menge,itb-dmbtr.

collect后的数据:

itc.

itc-mblnr,itc-lgort, 

itc-menge,itc-dmbtr.

实现的功能是根据物料凭证号+库位来统计移动数量及金额,从结果来看应该是正确的,因为上面凭证是311从7012和7018的移库,数量肯定相等,金额为0,下面凭证为261发货。

4内表、字符串及循环处理

●LOOP循环内表时,可根据需求加上where条件.

●读取内表时加上扩展语句BINARYSEARCH.

●内表数据增加

APPENDITAB(带表头).或APPENDWATOITAB(不带表头).

●内表数据更新

MODIFY更新内表时,加上transponding可以指定更新字段。

示例如下:

table 

t1_zcustom-name 

OK1'

t1_zcustom-city 

OK2'

MODIFY 

T1_ZCUSTOM 

TRANSPONDING 

NAME.

“只更新了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.

Modifyint_flightransportingflagwhereflagisinitial.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1