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)都不能使用。

最重要的一点是如果数据量特别打的表效率会急剧下降。

原创粉丝点击