如何提高读取BSEG的性能(SAP已清项和未清项的管理)

本文介绍了如何优化SAP系统中BSEG表的读取性能,包括利用辅助索引表(如BSAD、BSID等)来减少查询时间,并讨论了未清项与已清项的概念及其管理方式。

如何提高读取BSEG的性能(SAP已清项和未清项的管理)

The original URL: http://silverw0396.javaeye.com/blog/90624

 

The FI-GL table BSEG, which is one of our biggest PR1 tables, is an example of a clustered table. At the database-level, there is no table called BSEG, but instead RFBLG is being used for the BSEG data. Most of the fields known in BSEG are not known in the database table RFBLG, but are compressed in a VARDATA field of RFBLG. So tests in the WHERE clause of SELECTs agains BSEG are not used by the database (e.g. lifnr = vendor account number, hkont = G/L account, kostl = cost center). As a consequence, these tests are done after the facts similar to using the CHECK statement, and as already said in tip 1, CHECK statements are worse than tests in the WHERE-clause.

Check this link also.
https://forums.sdn.sap.com/thread.jspa?forumID=50&threadID=38572&messageID=373481#373481
1) select with header information from bkpf
2) use secondary index tables
http://forums.sdn.sap.com/jive3/thread.jspa?forumID=50&threadID=14280&messageID=105504#105504
1.BSAK Accounting: Secondary Index for Vendors
2.BSAS Accounting: Secondary Index for G/L Accounts
3.BSIK Accounting: Secondary Index for Vendors
4.BSID Accounting: Secondary Index for Customers
5.BSIM Secondary Index, Documents for Material
6.BSAD Accounting: Secondary index for customers
7.BSIS Accounting: Secondary Index for G/L Accounts
3) use logical data base e.g.: BRF
4)具体说明
BSAD:应收明细(已清帐)
BSID:应收明细(未清帐)
BSAS:总帐明细(已清帐)
BSIS:总帐明细(未清帐)
BSAK:应付明细(已清帐)
BSIK:应付明细(未清帐)
BSEG主要通过“凭证号”“会计年度”“行号”和这六张表关联,BKPF 是财务凭证抬头,BSEG 是财务凭证行项目。在财务凭证记账的时候,数据被插入 BKPF 和 BSEG,如果有必要,数据同时插入以上六张表中的一个未清表。
一般情况下一笔业务产生的凭证都是未清的,那么:
   如果该业务行是客户相关的,则被记录到BSID;
   如果该业务行是供应商相关的,则被记录到BSIK;
   无论和客户相关还是和供应商相关,都是和总帐相关,所以也会有记录到BSIS;
   但是如果这笔业务被清帐了,则相应的记录会从BSI*转移到BSA*

一般情况下:
   应收账款、预收账款、其他应收款、应收汇票等科目既和客户相关,又和未清项管理的总帐科目相关;
   应付账款、预付账款、其他应付款、应付汇票等科目既和供应商相关,又和未清项管理的总帐科目相关;
   其他总帐科目一般不启用未清项管理,所以记录一般都放在BSIS中。

 

5)未清项和已清项的概念
清项(Open Item),表示财务凭证行项目的一种挂账的状态,这种状态,提示该行项目需要被清帐(Clearing)。在 FS00 设置科目的时候,有一个选项是 'Open Item Mngment',该选项选中后,表示财务凭证行项目中记账科目为此科目时,该行项目有未清或者已清的状态。
已清项(Close Item),表示该行项目已经被清帐。
具体应用中,'Open Item Mngment' 用得比较普遍的是应收(客户)和应付(供应商)的科目。
此外,在总帐中,也有一些应用,比如对于银行的对账单,也一般使用,这样可以再对帐无误后再做清帐。

为什么需要使用到未清项管理?目的是为了记录完整的业务交易。比如对客户A有两笔应收款 A1 与 A2,A1 因为有些商务纠纷,可能需要进一步交涉,所以客户先针对 A2付款。如果没有未清项管理,这一笔收款可能只能针对时间顺序靠前的交易 A1 了,显然,这样是一种比较混乱的状态。实际上,几乎大部分科目理论上都可以进行未清项管理,但是,有可能这样做不能带来显著的效益反而带来管理成本的增加。

6)未清项和已清项sap提供的TCODE
在 SAP R/3 中,使用 FBL1N , FBL3N, FBL5N 分别可以查看供应商,总账,客户类型科目的未清已清项。
via: https://forums.sdn.sap.com/thread.jspa?threadID=100759  

<think>我们以SAP中的BSEG表为例,解析一个简单的ABAP报表。BSEGSAP中存储会计凭证行项目的核心表,常用于财务相关报表。 注意:实际开发中直接SELECT BSEG表需谨慎,因它是簇表,性能较差,建议使用CDS视图(如ACDOCA)。但为演示,此处仍以BSEG为例。 报表功能:允许用户输入会计凭证号会计年度,输出相关行项目的关键字段。 步骤: 1. 定义选择屏幕(SELECTION-SCREEN):让用户输入凭证号(BELNR)年度(GJAHR)。 2. 数据提取:根据输入条件从BSEG表中读取数据。 3. 输出:使用ALV显示结果(此处为简化使用WRITE,但实际推荐ALV)。 注意:BSEG是簇表,需按主键(公司代码、会计年度、凭证号等)查询,否则可能性能极差。 示例代码: ```abap REPORT zsimple_bseg_report. * 定义选择屏幕 TABLES: bseg. " 声明BSEG表(实际ABAP中,TABLES声明用于选择屏幕字段引用) SELECTION-SCREEN BEGIN OF SCREEN 100. SELECT-OPTIONS: s_belnr FOR bseg-belnr, " 凭证号 s_gjahr FOR bseg-gjahr. " 会计年度 SELECTION-SCREEN END OF SCREEN 100. * 数据提取与处理 START-OF-SELECTION. DATA: lt_bseg TYPE TABLE OF bseg, " 存储查询结果的内表 ls_bseg TYPE bseg. " 从BSEG表中选择数据(注意:实际开发应限制字段并添加公司代码等条件) SELECT * FROM bseg INTO TABLE lt_bseg WHERE belnr IN s_belnr AND gjahr IN s_gjahr. " 简单输出(实际建议用ALV) LOOP AT lt_bseg INTO ls_bseg. WRITE: / ls_bseg-belnr, ls_bseg-gjahr, ls_bseg-buzei, ls_bseg-shkzg, " 借贷标识(S/H) ls_bseg-dmbtr. " 金额 ENDLOOP. ``` 注意: - 实际开发中,避免使用`SELECT *`,应明确指定字段以减少内存占用。 - 由于BSEG是簇表,若使用完整主键(如公司代码、会计年度、凭证号)查询,可能导致性能问题。 - 输出通常使用ALV(ABAP List Viewer)而非WRITE,此处为简化示例。 改进建议: 1. 添加公司代码(BUKRS)选择条件(因BSEG中数据按公司代码分离)。 2. 使用ALV输出,提供排序、筛选等功能。 3. 考虑使用CDS视图替代直接查询BSEG。 §§相关问题§§ 1. 为什么在SAP中直接查询BSEG表需要谨慎?有哪些替代方案? 2. ABAP报表中如何实现ALV输出?请给出基本步骤。 3. 在ABAP选择屏幕中,SELECT-OPTIONSPARAMETERS有什么区别? 4. 如何优化一个ABAP报表的数据库查询性能? 5. SAP中簇表(如BSEG透明表在结构及访问方式上有何不同? </think> 以下是一个基于SAP财务核心表`BSEG`(会计凭证行项目表)的简单ABAP报表解析,包含完整代码、功能说明关键点注释: ```abap REPORT zbseg_simple_report. * 1. 定义选择屏幕(用户输入界面) TABLES: bseg. " 声明BSEG表结构 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME. SELECT-OPTIONS: s_bukrs FOR bseg-bukrs DEFAULT '1000', " 公司代码 s_belnr FOR bseg-belnr, " 会计凭证号 s_gjahr FOR bseg-gjahr DEFAULT sy-datum(4), " 会计年度 s_shkzg FOR bseg-shkzg. " 借贷标识(S=贷方,H=借方) SELECTION-SCREEN END OF BLOCK b1. * 2. 主数据处理逻辑 START-OF-SELECTION. " 声明内表存储查询结果 DATA: gt_bseg TYPE TABLE OF bseg, gs_bseg TYPE bseg. " 从数据库提取数据(关键字段示例) SELECT bukrs belnr gjahr buzei shkzg dmbtr kostl lifnr FROM bseg INTO TABLE gt_bseg WHERE bukrs IN s_bukrs AND belnr IN s_belnr AND gjahr IN s_gjahr AND shkzg IN s_shkzg. " 3. 数据输出(简化版ALV显示) LOOP AT gt_bseg INTO gs_bseg. WRITE: / |公司代码: {gs_bseg-bukrs}|, |凭证号: {gs_bseg-belnr}|, |年度: {gs_bseg-gjahr}|, |行号: {gs_bseg-buzei}|, |借贷: {gs_bseg-shkzg}|, |金额: {gs_bseg-dmbtr} |. ENDLOOP. ``` ### 关键解析: 1. **功能说明**: - 查询指定公司代码的财务凭证行项目 - 支持按凭证号、年度、借贷标识筛选 - 显示关键财务信息:金额、成本中心、供应商等 2. **BSEG表字段解析**: ```plaintext BUKRS → 公司代码 | BELNR → 凭证号 | GJAHR → 会计年度 BUZEI → 行项目号 | SHKZG → 借贷标识 | DMBTR → 本位币金额 KOSTL → 成本中心 | LIFNR → 供应商号 | SGTXT → 行项目文本 ``` 3. **开发注意事项**: - 性能优化:避免`SELECT *`,只取必要字段(BSEG是簇表,全字段查询极慢) - 必选字段:必须包含公司代码(BUKRS)+会计年度(GJAHR)+凭证号(BELNR)组合 - 替代方案:在新版本S/4HANA中优先使用ACDOCA(通用日记账)表 ### 实际开发建议: 1. **替换ALV输出**(替代简单WRITE): ```abap DATA: go_alv TYPE REF TO cl_salv_table. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv CHANGING t_table = gt_bseg ). go_alv->display( ). ``` 2. **添加权限检查**: ```abap AUTHORITY-CHECK OBJECT 'F_BKPF_BUK' ID 'BUKRS' FIELD s_bukrs-low. IF sy-subrc <> 0. MESSAGE '无公司代码权限' TYPE 'E'. ENDIF. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值