ABAP小细节
来源:互联网 发布:天猫 淘宝商城母婴 编辑:程序博客网 时间:2024/04/28 05:46
记录几个小细节以免以后再犯。
1.UPDATE
UPDATE是更新自建表数据的,而不是内表。UPDATE可以更新一行或是多行数据,也可以在原有数据的基础上更改,如下:
UPDATE SFLIGHT SET PLANETYPE = 'A310'
PRICE = PRICE - '100.00'
WHERE CARRID = 'LH' AND CONNID = '0402'.
2. MODIFY
今天碰到一个修改内表行项目的问题,后来发现系统居然dump!为什么了?因为我用了append。
LOOP AT itb_kunnr.
itb_kunnr-kunnr = itb_kunnr-objectid+0(10).
APPEND ITB_KUNNR. "wrong
MODIFY itb_kunnr FROM itb_kunnr TRANSPORTING kunnr.
ENDLOOP.
原来系统里有5跳记录,append之后6条,你在循环在append结果变成死循环。这个时侯应该用MODIFY去修改而不是添加了。modify的作用是如果没有相同主键的话就insert,有相同的主键就update。help文档上说从性能角度上考虑只有你不能区分这两者的时候才去使用modify。后面那条语句才对。
3.READ TABLE
同update一样的错误,read table只能读取内表而不是数据库表格。
4. FOR ALL ENTRIES IN
今天用SE30证明了FOR ALL ENTRIES IN的确可以提高效率。但是有几点需要注意,之前我以为FOR ALL ENTRIES IN可以根据字段自动匹配然后进行判断,用了才发现不是。看个例子:
DATA: BEGIN OF LINE,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
CITYFROM TYPE SPFLI-CITYFROM,
CITYTO TYPE SPFLI-CITYTO,
END OF LINE,
ITAB LIKE TABLE OF LINE.
LINE-CITYFROM = 'FRANKFURT'.
LINE-CITYTO = 'BERLIN'.
APPEND LINE TO ITAB.
LINE-CITYFROM = 'NEW YORK'.
LINE-CITYTO = 'SAN FRANCISCO'.
APPEND LINE TO ITAB.
SELECT CARRID CONNID CITYFROM CITYTO
INTO CORRESPONDING FIELDS OF LINE
FROM SPFLI
FOR ALL ENTRIES IN ITAB
WHERE CITYFROM = ITAB-CITYFROM AND CITYTO = ITAB-CITYTO.
WRITE: / LINE-CARRID, LINE-CONNID, LINE-CITYFROM, LINE-CITYTO.
ENDSELECT.
DATA: BEGIN OF LINE,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
CITYFROM TYPE SPFLI-CITYFROM,
CITYTO TYPE SPFLI-CITYTO,
END OF LINE,
ITAB LIKE TABLE OF LINE.
LINE-CITYFROM = 'FRANKFURT'.
LINE-CITYTO = 'BERLIN'.
APPEND LINE TO ITAB.
LINE-CITYFROM = 'NEW YORK'.
LINE-CITYTO = 'SAN FRANCISCO'.
APPEND LINE TO ITAB.
SELECT CARRID CONNID CITYFROM CITYTO
INTO CORRESPONDING FIELDS OF LINE
FROM SPFLI
FOR ALL ENTRIES IN ITAB
WHERE CITYFROM = ITAB-CITYFROM AND CITYTO = ITAB-CITYTO.
WRITE: / LINE-CARRID, LINE-CONNID, LINE-CITYFROM, LINE-CITYTO.
ENDSELECT.
注意加粗部分,一定要用FOR ALL ENTRIES IN后面的内表字段去限定。其实FOR ALL ENTRIES IN就是一个动态的筛选,和BW的自由特性有相通之处。使用FOR ALL ENTRIES IN有几个地方需要注意:
FOR ALL ENTRIES IN后面使用的内表itab如果为空,系统将视为无条件选取,将当前CLIENT下所有记录选出。因此为避免无意义的全件检索,在使用该语句前一定要判断内部表itab是否为空,为空时不执行包含该语句的数据库检索处理。使用该语句,对于最后得出的结果集系统会自动删除重复行,也就是distinct的问题。因此如果你要保留重复行记录时,记得在SELECT语句中添加足够键值项目,以保证结果集中所需重复项目不会被删除。ORDER BY语句和HAVING语句将不能使用。使用该语句时,除COUNT( * )以外的所有合计函数(MAX,MIN,AVG,SUM)都不能使用。
最重要的一点是如果数据量特别打的表效率会急剧下降。
- ABAP小细节
- 小细节
- 小细节
- 小细节
- 小细节
- 小细节
- ABAP 小技巧
- ABAP OO小例子
- ABAP 小问题
- ABAP 小知识01
- ABAP 小知识02
- ABAP 小知识03
- ABAP 小技巧
- sap abap 小知识点
- .net几个小细节
- vb小细节
- 几个小细节
- iFrame的小细节
- SQL定时作业的制定
- Parser Generator 安装
- web2.0迟到的新浪,终于开始行动了
- 日期format
- 回来了
- ABAP小细节
- How to generate DLL files by GCC in the MinGW?
- 某个时候怀念VB
- 什么是JAAS,以及灵活的Java安全机制
- MATLAB 主要函数指令表(按功能分类)
- 怎样把一字符串转化成一个实数和怎样从一个字符串上截取几个字符
- 设计模式之代理模式
- 最全面的网络协议图
- 不,我爱的人是你!