ABAP 代码优化

  主要是取数据时候优化

1. 问题select/endselect对数据的处理效率底。

select  matnr spras maktx from makt  
from makt  into table gt_makt
where spras = sy-langu.

MATNR IN LS_MATNR " 用IN可以 表范围

SINGLE "取单条数据

DISTINCT "去重 

INTO CORRESPONDING FIELDS OF TABALE GT_MAKT. "使用时候不会出现名称匹配问题

2.READ语句使用二分法搜索

* SORT GT_MAKT BY MATNR.
READ TABLE GT_MAKT WITH KEY MATNR = GT_MARA-MATNR BINARY SEARCH [TRANSPORTING ON FIELDS].

READ TABLE GT_MAKT INTO GS_MAKT WHERE MATNR = '23'.
LOOP AT GT_MAT INTO GS_MAKT.
*下面效率更高
READ TABLE GT_MAKT ASSIGNING <FS_MAKT> WHERE MATNR = '23'.
LOOP AT GT_MAKT ASSINGING <FS_MAKT>

BINARY SEARCH [TRANSPORTING ON FIELDS]

"索引表才能用binary search    ,transporting on fields 只读取不传值

3.Loop 中的select 语句

LOOP AT GT_MARA INTO GS_MARA.
    MOVE-CORRESPONDING GS_MARA TO GS_TOTAL.
    SEELCT SINGLE * 
    FROM MAKT 
    INTO CORRESPONDING FIELDS OF GS_MAKT
    WHERE MATNR = GS_MARA-MATNR AND SPRAS = SY-LANGU.
    GS_TOTAL-MAKTX = GS_MAKT-MAKTX.
    APPEND GS_TOTAL TO GT_TOTAL.
END LOOP.
*修改后
IF GT_MARA IS NOT INTIAL.
"或者 CHECK GT_MARA IS NOT INITIAL.
 SEELCT SINGLE * 
    FROM MAKT 
    INTO CORRESPONDING FIELDS OF GS_MAKT
    FOR ALL ENTRIES IN GT_MARA WHERE SPRAS = SY-LANGU MATNR = GT_MARA-MATNR.
 sort gt_makt by matnr.
LOOP AT GT_MARA INTO GS_MARA.
    MOVE-CORRESPONDING GS_MARA TO GS_TOTAL.
    GS_TOTAL-MAKTX = GS_MAKT-MAKTX.
    APPEND GS_TOTAL TO GT_TOTAL.
END LOOP.

 cheak,排序,循环

*loop里面尽量不要select.

*loop里面套loop 用小套大  ,from sy-tabix 可以帮助从哪行开始循环,循环套循环,减少循环

*sort 可以帮助优化查询

4.注意项:

不要select * 浪费cpu  

不要select distinct 没有缓存

少用 相关子查询 和嵌套 select ... endselect.

查询一条语句: select single /select ...up to 1 rows.

inner join条件放置的位置因该按照 on ,where ,having顺序

统计用sql聚合函数;使用游标读取数据

根据主件或索引查找数据

根据索引字段进行order by 否则通过程序进行sort by.

避免使用索引字段上用 not/<>/!=/is null/is not null 

sql中避免使用 like ,不要使用or

用内表批量操作数据库,不要用工作区一条条操作。

alv隐藏按钮 append SAVE to rt_extab.  set pf-status 'st_status' excluding rt_extab.

ooavl隐藏按钮  set pf-status '0100' excluding gt_extab.     alv fucntion里面有it_toolbar_excluding

去除前导0缀的办法:

1.移位

data:
  str type char10 value '0010000000'.

shift str left deleting leading '0'.

shift str right deleting trailing '0'.

2.功能模块

'CONVERSION_EXIT_ALPHA_OUTPUT'

3.同各国变量转换

data:

int type i.

str type char10 value '001000000'.

int = str.

str = in.

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值