一、背景
背景:因集团财务上线了税纪云项目,系统中存在很多会计凭证字段期初没有维护或者维护不当,如:相关的文本信息,Coding Block (COBL 结构)中的 全电发票号码(ZZYL06 )和税纪云标识(ZZYL07)等。
为了方便用户的数据维护,因此需要做一个数据批导修改的功能。
技术定位: 高级
技术难点: 标准字段(凭证抬头文本 BKTXT 和 参照 XBLNR )和行项目文本 SGTXT 和 分配编号 ZUONR 可以通过标准 BAPI 实现。但是自定义 CodingBlock 字段暂时没有。
二、方案研究
方案一:BDC 录屏,将自定义字段在前台屏幕配置好,前提是需要设置 FB02 模式下相关字段可编辑修改。缺点:BDC 屏幕不可控,返回报错不好定位。
方案二:找到相关的 BAPI,测试是否能通过标准 BAPI 进行修改。目前在网上找到与会计凭证修改相关的 BAPI 有如下三个:
-
FI_ITEMS_MASS_CHANGE
-
FI_DOCUMENT_CHANGE
-
BAPI_ACC_DOCUMENT_POST
2.1 FI_ITEMS_MASS_CHANGE 研究
根据函数名称可以初步判断,这个 FM 跟行项目批量更改有关,进入代码内去查看,这个功能也是通过 BDC 录屏数据,然后通过直接调用 FB02 事务码进行数据更改的,相关代码如下:
loop at it_buztab where bukrs = beltab-bukrs
and belnr = beltab-belnr
and gjahr = beltab-gjahr.
perform screen_0700_abzl.
perform screen_0700_pick.
perform screen_detail.
perform screen_0700.
endloop.
perform screen_0700_save.
export g_mass_change to memory id 'EPOS_MASS_CHANGE'.
call transaction 'FB02' WITHOUT AUTHORITY-CHECK
using bdcdata
mode bdcmode
update 'A'
messages into msgtab.
仔细研究里面的代码,这个程序只跟程序 SAPMF05L(⽤户总帐屏幕⼀般过帐显示)有关。实际上,在本项目中税纪云标识在应收应付会计凭证增加在屏幕本身,而总账增加在其他按钮中,位置不统一。再加上 BDC 录屏方式一旦出错不好定位问题,故此方案行不通。
2.2 FI_DOCUMENT_CHANGE 研究
这个函数从文件名中可以看出,会计凭证更改。点进去看短文本:FI:从 SD 或 MM 更改文档,这个 FM 点进去发现最关键的代码修改凭证在这一段 FORM :
PERFORM document_change TABLES t_accchg
xbseg
xbkpf
xbsec "note 1877685
USING xbsegc "for EBPP
x_ale. "note 2509112
点进这个 FORM 会看到三段针对应收、应付、总账的三段凭证更改的 FORM,分别为:
-
应收,当
i_bseg-koart = 'D'
PERFORM document_change_cust TABLES t_accchg "note 2596048
USING xbsegc "for EBPP
CHANGING x_xblnr
x_bktxt
x_open_fi
i_bkpf
i_bseg
i_bsec. "note 1877685
-
应付,当
i_bseg-koart = 'K'
时:
PERFORM document_change_vend TABLES t_accchg "note 2596048
CHANGING x_xblnr
x_bktxt
x_open_fi
i_bkpf
i_bseg
i_bsec. "note 1877685
-
总账,当
i_bseg-koart IN ('S','M','A')
* begin of note 2036659
IF ( i_bseg-koart EQ 'S' "note 2509112
OR i_bseg-koart EQ 'M' "note 2509112
OR i_bseg-koart EQ 'A' ) "note 2396217 & 2509112
AND i_ale IS INITIAL. "n