通用SAP会计凭证批导入最佳方案

目标概述:
做一个统一、通用、简单、有效、体验好的会计凭证导入及日志查询的程序。

思路概览:
1)Excel模板/网页/中间表/接口等整理数据
2)通过工具/抽数据库/调接口等方式将数据导到SAP内表
3)对上载到SAP内表的数据做数据预处理(校验、其他处理)
4)调用系统函数产生会计凭证,如果有错误则提示详细的错误信息
5)记录上传日志,方便后续查询和审计

挑战思考:
1)业务多样、未知,SAP可能需要做复杂的数据转换工作
2)导入的SAP的数据都是String类型,加上BDC录入的所有字段也都是String类型,数据格式(例如千分位、日期格式)需要逐一分析处理

实现的几个关键点:
1)Excel上传部分
a.下载Excel模板
获取SMW0导入的文件内容, WWWDATA_IMPORT
弹出文件保存对话框, cl_gui_frontend_services=>file_save_dialog
下载文件, GUI_DOWNLOAD

b.上传Excel文件
上传文件并获取文件名, KD_GET_FILENAME_ON_F4
判断是否为Excel文件, TRINT_FILE_GET_EXTENSION
上载Excel到内表lt_intern, ALSM_EXCEL_TO_INTERNAL_TABLE

c.数据预处理
将ALSM_EXCEL_TO_INTERNAL_TABLE函数返回的内表中的数据转换到我们的数据结构中。

2)凭证导入方案选择
有人会推荐使用BAPI导入凭证,但是使用BAPI导入会计凭证需针对所有业务情景(例如:WTH、承兑汇票、替代和校验规则、预制还是正式过账等)做大量预处理,要增加的规则非常多、工作量大、非常复杂且难以考虑全!

如果使用BDC,即模拟人工操作,则上述这些问题都不会存在,只需要安排屏幕字段规则整理好数据导入即可。同时,由于使用BDC和人操作是一样的,因此所有规则都会自动生效,生成的凭证也会是完整、正确的。

传统使用BDC一般是先用SHDB针对业务场景录一遍屏幕,然后ABAP把录屏嵌进去。这种方式有两个致命的问题,第一是每种业务需要录制一个屏幕、ABAP也到单独处理一次,第二是如果业务一旦发生变化就要改程序。

其实有个标准函数POSTING_INTERFACE_DOCUMENT,只需要传入屏幕字段名和值即可,程序会自动去寻找屏幕和屏幕上的字段。使用这个函数需要注意(‘POSTING_INTERFACE_START’ and ‘POSTING_INTERFACE_END’ should be used once. In between these two call ‘POSTING_INTERFACE_DOCUMENT’ can be used multiple times.),即真正过账的函数在同一个程序同一次提交中可以放在loop里多次调用产生多张凭证,但POSTING_INTERFACE_START和POSTING_INTERFACE_END应该放在循环之外,否则会引发很多莫名其妙的问题。

3)POSTING_INTERFACE_DOCUMENT函数数据组装
a.金额、数量字段必须传入String类型
b.税收处理

4)核心凭证导入部分逻辑

5)核心用户体验

6)主程序核心调用生成凭证

发表评论

电子邮件地址不会被公开。