此贴基本终结 == 在最新的S/4上,bseg能join了,另外基本被新表ACDOCA取代,SAP真会玩~
早就听前辈们说过之前从bseg表中 取数会比较慢,项目上之前有一个SAP给外围合同系统做的接口,是直接从bseg表中取数,用了一段时间就发现这个接口有点慢,于是改成了从bseg的子表中取数······一直以来只是知道,刚好最近的一个需求中用到相关取数逻辑,尝试把bseg表和ska1表inner join时,报错提示bseg是个簇表,无法关联。于是,打算把bseg的子表和ska1关联起来。借此机会,好好的梳理下bseg及其子表之间的关系。
BSEG与BKPF
BKPF 是财务凭证抬头,BSEG 是财务凭证行项目。BSEG中字段HKONT与SAKNR
SAKNR: G/L account number——总账科目
HKONT:General ledger account——总账科目编码HKONT里放的是凭证真实的总帐科目,SAKNR放的是供应商或客户的统驭科目.
BSEG及其子表
BSEG = BSAS+BSIS+BSAK+BSIK+BSAD+BSID
BSEG表通过公司代码(BUKRS)+BELNR(凭证编号)+GJAHR(会计年度)+BUZEI(凭证行项目)这些字段关联子表。Question 1:为什么直接从BSEG中取数会比较慢?
因为每次在BSEG去取一行数据,其实在数据库层是要去六个子表中去查询并返回数据!!!
Question 2 :为什么BSEG不能inner join?
因为在数据库层不是和一张表join,所以找不到连接的key,只能通过其子表进行join操作。BSAS │ BSIS ==>all GL documents总账
BSAK │ BSIK ==>all AP documents 供应商
BSAD │ BSID ==>all AR documents 客户BSAD:应收明细(已清帐)
BSID:应收明细(未清帐)
BSAS:总帐明细(已清帐)
BSIS:总帐明细(未清帐)
BSAK:应付明细(已清帐)
BSIK:应付明细(未清帐)
一般情况下一笔业务产生的凭证都是未清的,那么:
如果该业务行是客户相关的,则被记录到BSID;
如果该业务行是供应商相关的,则被记录到BSIK;
无论和客户相关还是和供应商相关,都是和总帐相关,所以也会有记录到BSIS;但是如果这笔业务被清帐了,则相应的记录会从BSIS转移到BSAS
BSEG本身是一个 Cluster Table(簇表),BSEG就是由上述的六大表的集成,当要读取”BSEG”Table时就等于去读取那六个表,这样你可以想像它读起来会就多慢。对於簇表或Pool Table,都是SAP系统本身在使用的,因此簇表本身是不存在资料库实体的,虽然是可以在ABAP使用,不过还是有一些限制:
1.不能使用select distinct or group by语法
2.不能使用Native SQL
3.不能使用specify field names after the order by clause
4.不能在建立次索引
5.查询时一定要用KEY FIELD
参考:
http://blog.itpub.net/17204926/viewspace-625298/
http://blog.csdn.net/sunfeng8848/article/details/3953581