ITPub博客

首页 > Linux操作系统 > Linux操作系统 > BSEG 簇表

BSEG 簇表

原创 Linux操作系统 作者:幻雪青枫 时间:2012-07-13 09:10:43 0 删除 编辑
BSEG 簇表
 
 

BSEG于一般的透明表不同,它是一个簇表。对于一个簇表来说,除了主键项目外,其他项目都被编辑到一个长文本项目中,一起存储在表簇RFBLG中的vardata项目中,这就决定了作为簇表的BSEG无法再建立键值以外的索引(INDEX,所以一般我们对于透明表来说当主键项目不全或完全没有时,追加索引的作法对于BSEG表来说就不好用了。而BSEG簇表又是SAP系统中FI 会计模块中最常被使用的数据表,所以运用好对BSEG表的访问技术对于FI会计模块的扩展开发(ADDON)至关重要。

这篇文章我们就来谈谈如何高效地对BSEG进行访问处理。

对於簇表来说,在数据库中没有与之同名的实体物理表相对应,所以虽然其可在ABAP中使用,但还是有一些限制的:
1.
不能使用Select distinct语法
BSEG
中的字段存储在VARDATA中,所以不能使用distinct语句对单个项目去除重复。
2.
不能使用Native SQL
在数据库中没有与之同名的实体物理表相对应,所以不能使用Native SQL BSEG操作。
3.
不能使用Order by 语法
BSEG
中的字段存储在VARDATA中,所以不能使用Order by语句对单个项目排序。
4.
不能再追加创建索引
BSEG
中的字段存储在VARDATA中,所以不能再追加创建索引。

除此之外,对BSEG的访问要使用主键项目,如果没有主键项目虽然语法调试能够通过,但是程序执行起来,耗时长,效率低,而且随着业务量的增加执行时间问题会越发严重,甚至导致程序不能正常执行结束。

那么如果当键值不足时怎么办呢?回答,使用二次索引透明表,具体方法如下描述。

比如和销售凭证有关的业务,根据销售凭证编号和明细编号,选取相关会计凭证明细信息。
SELECT *
FROM BSEG
WHERE VBEL2 = 'XXXXXXXXXX'
     销售凭证编号
AND POSN2 = 'YYYYYY'.
       销售凭证明细编号
在这个例子中,对BSEG的检索条件中因为没有主键项目,所以执行起来,程序很慢。

变通的方法:
1
)首先根据销售凭证编号和明细编号,从BSID中检索出未清帐明细行项目。
SELECT BURKS
  公司代码
BELNR “
财务凭证编号
GJAHR “
会计年度
BUZEL “
会计凭证中的行项目
FROM BSID
INTO TA
BLE TAB_KEY  存放主键项目的内部表
WHERE VBEL2 = 'XXXXXXXXXX'
  销售凭证编号
AND POSN2 = 'YYYYYY'.
  销售凭证明细编号

2
)再根据销售凭证编号和明细编号,从BSAD中检索出已清帐明细行项目。
SELECT BURKS
  公司代码
BELNR “
财务凭证编号
GJAHR “
会计年度
BUZEL “
会计凭证中的行项目
FROM BSAD
APPEND TABLE TAB_KEY
  存放主键项目的内部表
WHERE VBEL2 = '
XXXXXXXXXX'  销售凭证编号
AND POSN2 = 'YYYYYY'.
  销售凭证明细编号

3
)然后再根据上面检索出的主键列表,从BSEG中检索出相应的明细行项目。
SELECT BSCHL
 "Posting Key
KOART
 "Account Type
UMSKZ
 "Special G/L Indicator
SHKZG
 "Debit/Credit Indicator
HKONT
 "General Ledger Account
GSBER
 "Business Area
DMBTR
 "Amount in Local Currency
WRBTR
 "Amount in document currency
ZUONR
 "Assignment Number
SGTXT
 "Item text
ZFBDT
 "Baseline Date for Due Date Calculation
ZTERM
 "Terms of Payment Key
ZLS
CH "Payment Method
ZLSPR
 "Payment Block Key
HBKID
 "Short Key for a House Bank
BVTYP
 "Partner Bank Type
FROM BSEG
INTO TABLE TAB_BSEG “
存放检索结果的内部表
FOR ALL ENTRIES IN TAB_KEY “
存放主键项目的内部表
WHERE BUKRS = TAB_KEY-BUKRS. “
公司代码
AND GJAHR = TAB_KEY-GJAHR “
财务凭证编号
AND BELNR = TAB_KEY-BELNR “
会计年度
AND BUZEI = TAB_KEY-BUZEI. “ 会计凭证中的行项目

4
)这么处理之所以能够提高效率,关键还得对透明表BSIDBSAD追加以VBEL2(销售凭证编号)和POSN2(销售凭证明细编号)为键值的索引(对于透明表可追加索引)。

这样一来,1)和2)步骤地操作有索引,3)步骤的操作有全主键项目,检索速度应该有保证。

采购方面的业务、物料方面的业务等都可如法炮制。

最后需要说明一点,不是所有的SAP体统都可以使用这种方法,能否使用取决于R/3系统的设计和配置。所以在试图使用该方法时应充分调查相关透明表与BSEG中的纪录是否相符,别速度提高了,结果处理对象范围减小了或增大了,那就与初衷背道而驰了,效率的提升一定要在确保业务数据正确的基础上再加以考虑。

SAP R/3
系统中也有几个专门用来读取BSEG表信息的函数,可适当参考使用,它们是:
READ_BSEG
GET_ALL_BSEG

另外最有效率的方法是改善你的应用和需求,要使需求合理规范,这才能使效率达到最高化。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26432526/viewspace-735357/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-11-21

  • 博文量
    12
  • 访问量
    13603