ABAP语法的相关应用Word下载.docx
- 文档编号:17579093
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:30
- 大小:80.03KB
ABAP语法的相关应用Word下载.docx
《ABAP语法的相关应用Word下载.docx》由会员分享,可在线阅读,更多相关《ABAP语法的相关应用Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
关于二分法搜索选项的详细信息,参见二分法搜索。
如果找到有适当关键字的条目,则将系统字段SY-SUBRC设置为0,并且SY-TABIX包含该行的索引。
否则,将SY-SUBRC设置为非0值。
如下所述,可以定义多个关键字<
:
定义一系列关键字段
要定义自己的一系列关键字段,请使用WITHKEY选项,用法如下:
....WITHKEY<
k1>
=<
f1>
...<
kn>
fn>
...
自定义关键字包含表格组件<
...<
。
字段<
是关键字段的内容必须匹配的值。
如果<
fi>
的数据类型与数据类型<
ki>
不兼容,则<
转换为类型<
可以用(<
ni>
)代替<
来实时设置关键字段。
关键字段是字段<
的内容。
如果在运行时<
为空,则系统忽略该关键字段。
包含无效的组件名称,则发生实时错误。
用户可以为任何在关键字中使用的组件指定偏移量和长度(参见指定数据对象的偏移量)。
将整行定义为关键字
通过使用WITHKEY选项可将内表整行定义为其关键字,如下所示:
....WITHKEY=<
value>
的数据类型与表格行的数据类型不兼容,则将<
转换为表格行的数据类型。
对于此类关键字,也可以选择由某个基本数据类型或内表直接定义的,而不是由段串直接定义的特定内表行。
将行首定义为关键字
要将内表的行首定义为关键字,请使用WITHKEY选项,用法如下:
k>
系统将(左对齐)的行首与<
进行比较。
<
不能包含内表或包含内表的结构。
与上面两个选项不同之处在于用<
的数据类型进行比较。
示例:
DATA:
BEGINOFLINE,
COL1TYPEC,
COL2TYPEPDECIMALS5,
COL3TYPEI,
COL4TYPEI,
ENDOFLINE.
DATAITABLIKELINEOCCURS10.
DO10TIMES.
LINE-COL1=SY-INDEX.
LINE-COL2=SQRT(SY-INDEX).
LINE-COL3=SY-INDEX**2.
LINE-COL4=SY-INDEX**3.
APPENDLINETOITAB.
ENDDO.
READTABLEITABINTOLINEWITHKEYCOL3=9COL4=36.
WRITE:
/SY-SUBRC,SY-TABIX.
READTABLEITABINTOLINEWITHKEYCOL3=9COL4=27.
READTABLEITABINTOLINEWITHKEY'
2'
.
/SY-SUBRC,SY-TABIX.
其输出为:
4
0
0
3
2
在此,创建包含四列的内表。
对表格的10行进行填充之后,用自定义关键字读取单行。
有关键字段COL3、COL4的自定义序列的第一个READ语句失败,第二个READ语句找到索引为3的行。
第三个READ语句搜索以“2”开始的表格行并找到索引为2的行。
下图显示主要步骤:
DATAITAB
TYPEIOCCURS10,
DATASQUARETYPEI.
DO30TIMES.
SQUARE=SY-INDEX**2.
APPENDSQUARETOITAB.
READTABLEITABINTOSQUAREWITHKEY=25.
SY-SUBRC,SY-TABIX.
5
在此创建包含基本类型I行的内表。
填充完表格之后,读取值为25且索引为5的行。
二分法搜索
用关键字读取单行时,可以执行二分法搜索以代替标准顺序搜索。
为此,请使用READ语句的二分法搜索选项。
.....BINARYSEARCH.
如果使用二分法搜索选项,则必须按关键字中指定的次序对内表进行排序。
如果系统找到匹配指定关键字的多行,则读取索引最低的行。
二分法搜索比线性搜索要快。
因此,应尽可能将内表排序并且使用二分法搜索选项。
指定数据对象的偏移量
在ABAP/4中,可以在所有处理数据对象的语句中指定基本数据对象的偏移量值。
为此,请在语句中指定数据对象名称,如下所示:
<
f>
[+<
o>
][(<
l>
)]
对字段<
中从<
+1开始且长度<
的部分执行该语句的操作。
如果未指定长度<
,则对该字段<
和结尾之间的所有位置进行处理。
ABAP中SY-INDEX和SY-TABIX的区别
BEGINOFLINE,
ENDOFLINE.
DATAITABLIKELINEOCCURS10WITHHEADERLINE.
*SY-TABIX和SY-TABIX都是系统字段,用来记录循环的次数。
*sy-index在DO....ENDDO循环里有效,而SY-TABIX在LOOPAT......ENDLOOP里有效。
LOOPATITAB.
DO2TIMES.
WRITE:
/'
SY-TABIX:
'
SY-TABIX,ITAB-COL1,'
SY-INDEX:
SY-INDEX,ITAB-COL3.
ENDDO.
ENDLOOP.
输出结果:
1
1SY-INDEX:
1
2
2SY-INDEX:
4
3
3SY-INDEX:
9
4SY-INDEX:
16
5
5SY-INDEX:
25
6
6SY-INDEX:
36
7
7SY-INDEX:
49
8
8SY-INDEX:
64
9
9SY-INDEX:
81
10
*SY-INDEX:
100
ABAP筑基宝典(5)--关于使用READTABLE语句的几点注意事项
1.
如果使用READTABLE语句来读取内部表数据,而不是简单看返回值判断是否存在,那么在使用READTABLE语句之前,一定要记得使用CLEAR语句清空内部表的工作区。
2.
READTABLEitabWITHKEY=vBINARYSEARCH.
使用READTABLE语句的二分法搜索以代替标准顺序搜索时,必须首先按关键字中指定的次序对内表进行排序。
如果系统找到匹配指定关键字的多行,则读取索引最低的行。
二分法搜索比线性搜索要快。
因此,应尽可能将内表排序并且使用二分法搜索。
如果找到有匹配关键字的条目,则将系统字段SY-SUBRC设置为0并且SY-TABIX包含该行的索引。
否则,将SY-SUBRC设置为非零。
3.
WITHKEY 中的检索条件比较符不能使用‘<
>
’(不等于)。
如果只想取得内部表中不等于某条件的一条记录,那么请使用下面变通方法。
LOOPATitabWHEREKEY<
‘XX’.
此处取得第一条记录。
EXIT.
ENDLOOP.
如果在运行时<
KEY>
值为空,则统忽略该关键字段。
另外可对关键字段指定偏移量和长度。
BTW:
感谢binarysearch,有一次到日本做项目,有这么个课题,
内部表中的数据如下
A
B
C
01
00120060301
001
20060201
00120060101
要求取出距现在时间最近的记录。
我的做法是先排序
SORTIT_TABBYA
BASCENDING
CDESCENDING.
然后用二分法读取
READIT_TABINTOWA_TABWITHKEYA='
01'
B='
001'
BINARYSEARCH.
ABAP"
FORALLENTRIESIN"
使用指南
在ABAP开发中,对于不能使用join的聚集表或者需要使用SELECT的内表,我们一般使用forallentriesin语句将该表与内表串联,
查询出需要的数据,例如:
BSEG聚集表为例,如下:
SELECTbseg~kunnr
bseg~lifnr
bseg~belnrINTOTABLEitab_bsegFROMbsegFORALLENTRIESINitab_main
WHEREbukrsin_bukrsand(belnr=itab_main-belnrANDhkont=itab_main-hkont).
由于BSEG不能和BSIS做innerjoin所以先将BSIS内容放到itab_main中,然后用FORALLENTRIESIN来串联。
1-WHERE子句中的bukrsin_bukrs是指bseg-bukrs存在于_bukrs这个select-options中,_bukrs不是itab_main的field所以这部分不包括在括号中.
当然会增加内存使用了。
原本一个条件,数次(驱动表的纪录条数)向对DB操作,
使用了FORALLENTRIES后,
相当于把驱动表里的条件字段的所有值用OR连起来,
一次对DB操作,
条件语句增大,势必使内存占用增多。
SELECTCARRIDCONNID
PRICE
FROMSFLIGHTINTOTABLEIT_PRICEFORALLENTRIESINIT_SFLIGHT
WHERECARRID=IT_SFLIGHT-CARRIDANDCONNID=IT_SFLIGHT-CONNID'
在WHERE条件中,IT_SFLIGHT-CARRID和IT_SFLIGHT-CONNID这些列将用作占位符。
该SELECT语句的结果集是SELECT语句的所有结果集的联合,这些结果集是用内部表
IT_SFLIGHT中的相应值在每一行上替换占位符的结果。
实际上该WHERE子句的特殊变式就是下面WHERE基本语句的简略写法。
SELECTDISTINCTCARRID
CONNIDPRICEFROMSFLIGHTINTOTABLEIT_PRICE
WHERE(CARRID='
LH'
ANDCONNID='
2415'
)OR
(CARRID='
SQ'
AND
CONNID='
0026'
)OR(CARRID='
0400'
).
2.使用该语句,对于最后得出的结果集系统会自动删除重复行。
因此如果你要保留重复行记录时,记得在SELECT语句中添加足够键值项目(有必要时,增加全部键值项目),以保
证结果集中所需重复项目不会被删除。
(例如选取支付金额时,支付事件可能不同,但金额可能相同,此时一定要注意,以避免错误删除结果记录。
3.FORALLENTRIESIN后面使用的内部表itab如果为空,系统将视为无条件选取,将当前CLIENT下所有记录选出。
因此为避免无意义的全件检索,在使用该语句前一定要判断内部
表itab是否为空,为空时不执行包含该语句的数据库检索处理。
4.由于itab-f实际上是作为占位符被替换,所以内部表itab中不要包含HEADER行(项目标识名称行),以免造成混淆,检索出错。
5.内部表itab中作为条件替换用项目的类型和长度,一定要和检索数据库中对应的项目相同,否则编译不能通过。
6.对于内部表itab中作为条件替换用项目,不能使用LIKE,BETWEEN,IN比较操作符。
因为这些比较操作符都是不确定比较操作符(将选择条件设定在一个范围内),而FORALL
ENTRIESIN语句的作用相当于将选择条件块全部并列开来,用OR连接,如果每个OR分支中又是不确定的范围,那么系统性能将大大降低,因此R/3系统在使用该语句时禁止使用不确
定比较操作符。
7.使用该语句时,ORDERBY语句和HAVING语句将不能使用。
8.使用该语句时,除COUNT(*)以外的所有合计函数(MAX,MIN,AVG,SUM)都不能使用。
//判断内表是否为空
使用语句:
DESCRIBETABLEITABLINESVARIABLE.判断系统变量sy-subrc是否为0,如果为0就表示不空,反之为空!
DESCRIBETABLEITABLINESVARIABLE
IFNOTP_VARIANTISINITIAL.
WX_VARIANT-VARIANT=P_VARIANT.
ENDIF.
备注:
使用forallentriesin虽然在某些方面是很方便的,但是他很耗内存,在使用时一定要注意,若不是万万不得已还是建议不要使用为好。
ABAP常用的表,参数介绍
FI常用表
GL部分:
FAGLFLEXT(FMGLFLEXT)
新总账汇总表
GLT0
旧总帐汇总表
SKA1
总账科目主记录(科目表)
科目表层数据
SKAT
总帐科目主记录(科目表:
说明)
包括语言代码
SKB1总帐科目主记录(公司代码)公司代码层数据
BKPF
财务凭证抬头
BSEG
财务凭证行项目
BSIK,BSAK
分别是供应商(K)的未清已清项存放的表
BSIS,BSAS
分别是总账(S)的未清已清项存放的表
BSID,BSAD
分别是客户(D)的未清已清项存放的表
I表示未清,A表示已清。
AP部分:
LFA1
供应商主数据(一般地区)
LFAS
供应商主数据(增值税登记号的一般部分)
LFB1
供应商主数据(公司代码)
LFB5
供应商主数据(催款数据)
LFBK
供应商主数据(银行细目)
LFC1
供应商主数据(业务额)
LFC3
主供应商(特殊总分类帐交易图表)
AR部分:
KNA1
客户主文件的一般数据
KNAS
客户主数据(一般地区的增值税登记号)
KNB1
客户主数据(公司代码)
KNB4
客户收付历史
KNB5
客户主记录(催款数据)
KNBK
客户主数据(银行细目)
KNC1
客户主记录(交易额)
KNC3
客户主数据(特殊总帐业务额)
KNKA
客户主数据信贷管理:
中心数据
KNKK
控制范围数据
货币:
TCURC
货币代码
TCURT
货币代码名
TCURV
货币换算的兑换率类型
TCURR
汇率
TCURW
汇率类型的使用
TCURF
转换因子
银行:
BNKA
银行主数据
T012
开户行
T012T开户行帐户名
NBNK
银行的号码范围
业务范围:
TGSB
业务范围
TGSBT业务部门名称
T001
公司代码
T001T公司代码相关的文本
T005
国家
T005T国家名
T001B允许的记帐期
过帐码:
TBSL
过帐码
TBSLT
过帐代码名称
SD相关表
一、客户主数据
基本数据放在KNA1里;
公司代码放在KNB1里;
销售视图放在KNVV里;
合作伙伴放在KNVP里;
二、信用主数据
KNKK里有信贷限额、应收总额、特别往来;
S066里是未清订单值;
S067里是未清交货值;
KNKK里面的应收值不一定对,要和BSID表去比。
S066、S067也是一样,不对的时候就要重组。
三、物料主数据
MARA里是基本数据;
MAKT是文本;
MARC是工厂视图;
MVKE是销售视图;
MARM是物料的计量单位;
四、价格数据
主数据在表AXXX里,XXX表示三个数字,KNOH和KONP分别存放抬头和行项;
单据的价格在KONV里;
五、自动确定的科目
在CXXX里,XXX表示三个数字;
六、销售订单
VBAK抬头;
VBAP行项;
VBKD业务数据;
VBPA是伙伴;
VBEP是计划行;
VBFA是单据流;
VBUK抬头状态;
VBUP行项状态;
七、交货
LIKP抬头;
LIPS行项;
VTTK是Shipment抬头;
VTTP是Shipment行项;
八、物料凭证
MKPF抬头;
MSEG行项;
九、发票
VBRK是抬头;
VBRP是行项;
十、文本
STXH抬头
STXL行项;
十一、地址
最新的单据中的地址信息在ADRC里面,不能取主数据的。
十二、会计凭证(顺带说说AP的)BKPF:
财务凭证抬头;
BSEG:
财务凭证行项目;
BSAD:
应收明细(已清帐)客户;
BSID:
应收明细(未清
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ABAP 语法 相关 应用