Click here for English Version
1. 需求
有时候我们需要为
VF01/
VF02/
VF03增加自定义选项卡来满足用户需求,并且在这个选项卡上维护一些自定义字段的值,在这份文档中我们以金税发票为例。
2. 症状
发票凭证选项卡没有屏幕增强和用户出口,SAP标准只有业务加载项 (
BADI_SD_CUST_HEAD,
BADI_SD_CUST_ITEM) 可用,但是这两个业务加载项仅供SAP内部使用。
3. 环境
本文基于SAP ERP 6.0 EHP7 IDES,NetWeaver 7.42,并且在SAP S4/HANA 1511(S4Core 100 SP03), NetWeaver 7.49同步验证。
本文使用的SAP GUI是750 Patch 1。
4. 问题重现
当我们尝试创建
BADI_SD_CUST_HEAD或
BADI_SD_CUST_ITEM的业务加载项实施时,会看到错误消息“
业务加载项定义BADI_SD_CUST_xxxx仅供SAP内部使用”。
检查业务加载项定义,我们发现这些业务加载项被标记为“
SAP内部”,所以我们不能使用这个业务加载项来增加我们自己的数据。
5. 原因和前提
5.1 参考
SAP Note 864944 有详细说明,SAP只打算让这些业务加载项用在单独的SAP行业解决方案中。
5.2 调查分析
本文以发票凭证的抬头选项卡为例,计划增加金税发票号和金税发票生成日期两个字段,并且相关数据应当存储在VBRK的附加结构中。
从
SE93找到
VF03对应的主程序是
SAPMV60A (VF01/VF02也是同一个),在资源库浏览器中检查程序
SAPMV60A的屏幕,发现屏幕
6001/6101可能是相关的。
从所用位置可以看出
BADI_SD_CUST_HEAD被用在函数模块
GET_HANDLE_SD_CUST_HEAD中,这个函数模块的使用位置有4个命中。
同时我们检查屏幕逻辑流(以6001为例),模块
CUST_HEAD_ACTIVATE调用的
CUST_HEAD_ACTIVATE中使用到函数模块
GET_HANDLE_SD_CUST_HEAD。
从
IF_EX_BADI_SD_CUST_HEAD~ACTIVATE_TAB_PAGE的导航目标我们可以看到SAP标准有一个业务加载项实施
CL_IM_WB2_IVGUI_LAYOUT_H,我们可以通过
SE19查看
WB2_IVGUI_LAYOUT_H。
结论就是业务加载项定义
BADI_SD_CUST_HEAD的实施
WB2_IVGUI_LAYOUT_H是为全球贸易这个行业解决方案实现的,存储在
WB2B_CORE这个包中。
照此完整来看,为发票凭证增加自定义选项卡的业务加载项实施正是与屏幕6001和6101有关,既然这个业务加载项不允许我们自己来实施,我们可以尝试在屏幕6001和6101中注入类似的代码来达成目标。
5.3 验证
我们来调试找出所有的关键点。
业务加载项实施
WB2_IVGUI_LAYOUT_H中有4个方法,我们为每一个方法设置断点,然后找一个发票凭证用
VF02来修改。
当我们转到抬头选项卡,会碰到第一个断点
ACTIVATE_TAB_PAGE。
当我们转到“
全球贸易管理”选项卡,会碰到第二个断点
TRANSFER_DATA_TO_SUBSCREEN,这个选项卡就是有业务加载项
WB2_IVGUI_LAYOUT_H增强出来的。
当我们输入数据或点击屏幕上的按钮,会碰到第三个断点
PASS_FCODE_TO_SUBSCREEN,然后碰到第四个断点
TRANSFER_DATA_FROM_SUBSCREEN。
使用调试器的“
返回 (F7)”我们可以验证这四个断点都是跟屏幕6001和6101有关的,这就验证了之前的结论。
以上是基于SAP ERP 6.0 EHP7 IDES,但是基本上在生产环境我们不会有“
全球贸易管理”这个选项卡,让我们来找出根本原因。
检查
WB2_IVGUI_LAYOUT_H->ACTIVATE_TAB_PAGE中的代码并追溯,最终找到控制点来自
TWGTA-
WB2_ADDON_ACTIVE。
表
TWGTA是通过视图
V_TWGTA维护的,配置路径是
SPRO-->后勤 - 常规-->
全球贸易管理-->
激活组件,找到配置选项“
增强设置”-->“
附加激活”。
当这个选项设置为“
2 所有凭证激活”,我们可以在发票凭证抬头看到增强的“
全球贸易管理”选项卡。
尝试设置成“
未激活”
这样“
全球贸易管理”选项卡就不见了。
这个选项属于“
SAP企业扩展全球贸易”这个行业解决方案,包含在独立的
EA-GLTRADE组件中,从S4/HANA 1503开始被合并到S4CORE中。
这个选项在不同SAP版本中的默认值不同,具体如下:
6. 解决方案
6.1 副作用
因为SAP只预留了一个屏幕对发票凭证抬头进行增强,所以我们为发票凭证增加我们自定义的选项卡之前需要注意检查“
全球贸易管理”的有效性。
如下解决方案基于我们未启用“
全球贸易管理”的前提,如果希望启用“
全球贸易管理”的情况下增加自定义的数据,可以考虑在业务加载项
WB2_IVGUI_LAYOUT_H中处理,本文不再赘述,参考主程序
SAPLWB2B_SCREEN_HANDLING。
6.2 附加结构
要显示在自定义选项卡中的数据,我们将定义
ZZ字段附加到
VBRK中,以便这些数据能够自动存储在
VBRK里。为了避免冲突,
所有的名称应当以两个Z打头,因为有些标准字段的名称是以一个Z打头的。
创建数据元素
ZGTINO,描述、数据类型、字段标签如下:
创建数据元素
ZGTIDT,描述、数据类型、字段标签如下:
显示表
VBRK,转到
附加结构,并点击
创建附加,填写附加名称“
ZZVBRK_APPEND_GTI”,结构名称应当以“
ZZ”打头。
填入组件“
ZZGTI_NUM”和“ZZGTI_DAT”,用先前创建的数据元素作为组件类型,确保组件名称也是以“
ZZ”打头。
6.3 创建处理程序
主程序
SAPMV60A中的所有包含文件都是以
MV60AF打头的,所以我们创建一个独立的程序
ZMV60AF_CUST_HEAD来存放所有的处理代码。
转到资源库浏览器,创建屏幕6001,确保屏幕类型设置为“
子屏幕”。
转到屏幕
6001的逻辑流,编辑PBO和PAI代码,双击
PBO_6001,在主程序
ZMV60AFZ_CUST_HEAD中创建输出前处理模块,编写自定义的代码,最后再回到屏幕
6001点击
格式,进入下一步。
在屏幕绘制器上按
F6打开
字典/程序字段窗口,在
表/字段名称中输入
VBRK,然后点击
从字典获取,选择要在屏幕上显示的字段。
6.4 屏幕增强
在主程序
SAPMV60A的屏幕
6001中双击
CUST_HEAD_ACTIVATE直到对应的FORM,然后按
Shift+F4进行
增强。
选择菜单
编辑-->
增强操作->
显示隐式增强选项。
在
FORM CUST_HEAD_ACTIVATE.下一行点击
右键,选择
增强操作-->
创建实施,选择增强模式为
声明。
创建新的增强实施
ZGTI_SAPMV60A。
这里提供两种方案来实施增强,
建议使用B方案。
- PERFORM … IN PROGRAM … IF FOUND
- CALL BADI … (自定义业务加载项)
方案 A: PERFORM … IN PROGRAM ... IF FOUND
在增强实施中编写自己的代码,在
PERFORM … IN PROGRAM …的语法中不要忘记追加
IF FOUND,涉及详细逻辑的代码可以在程序
ZMV60AFZ_CUST_HEAD中编写,可以参考
WB2_IVGUI_LAYOUT_H->ACTIVATE_TAB_PAGE。
业务加载项
BADI_SD_CUST_HEAD的另外三个方法是用在屏幕
6101中,建议不管当前是否有使用到,都应当进行增强到程序
ZMV60AFZ_CUST_HEAD中以预留将来可以方便的修改,所有的增强实施都应当使用同一个名称
ZGTI_SAPMV60A,这样我们可以方便地使用
SE20查看所有的增强。
方案 B: CALL BADI … (custom BADI)
使用自定义业务加载项是比较好的方式,以创建接口开始,可以参考
IF_EX_BADI_SD_CUST_HEAD。我们转到
SE24来创建
ZIF_EX_BADI_SD_CUST_HEAD。
参考
IF_EX_BADI_SD_CUST_HEAD来设置方法和参数,并为
ACTIVATE_TAB_PAGE增加
FTAB的导出参数作为选项卡的说明文字,再增加一个
CHECK_BADI_ACTIVATE的方法来检查标准的业务加载项是否已经激活。
接口准备好后,就可以到
SE20来创建增强点
ZES_GTI_SAPMV60A。
在
增强点元素定义中,我们创建一个
业务加载项定义ZBADI_SD_CUST_HEAD。
将我们先前创建的接口
ZIF_EX_BADI_SD_CUST_HEAD分配进来。
取消“
多种用法”的选项。
创建
业务加载项实施ZGTI_BADI_SD_CUST_HEAD,并在弹出的窗口填写
实施类ZCL_IM_GTI_BADI_SD_CUST_HEAD。
双击或通过
SE19可以查看业务加载项实施
ZGTI_BADI_SD_CUST_HEAD。
在方法名称上双击以
创建方法实施。
为实施类
ZCL_IM_GTI_BADI_SD_CUST_HEAD分配
别名。
为相关的实施方法编写自己的代码,不要忘记检查标准的业务加载项是否激活,可以参考标准业务加载项实施
WB2_IVGUI_LAYOUT_H的方法代码。
最后,在主程序
SAPMV60A的屏幕
6001和
6101对应的增强实施中编写自己的代码,简单使用
CALL BADI即可。
6.5 验证
用
VF02修改发票凭证,转到
抬头-->
附加数据,填写相关的数据并保存,然后检查表
VBRK发现附加数据已经保存成功。
用VF03查看发票凭证,自定义选项卡中的附加数据是只读的。
当我们再次启用“
全球贸易管理”,我们的自定义选项卡会被替换,不会影响标准的配置控制。
7. 最佳实践
尽量不要
直接在增强实施中写具体逻辑,创建自定义业务加载项是一个比较好的选择,不要忘记预留足够的参数并且需要检查调用的有效性,以避免可能的影响,并且将来如果要再调整增强的逻辑的时候,可以很容易的通过
SE20来控制。
由于FORMS是一个过期的ABAP语法,在生产环境
不建议使用方案A。
8. 引用