一、业务背景
公司需要把供应商增加一个细分的维度,并且要求该字段设置为必输,防止用户新增供应商时忘记维护。这里给用户找了一个分类的字段:业务合作伙伴类型,本文主要讲解如何设置该字段设置为必填;
注意:BP分组为Z001-集团外供应商时才需要设置必输,其他分组不需要必输~~
如果对于BP主数据的前提操作和后台配置没有基础概念的话,可以查看往期写过的一篇文章:
SAP_MM模块-S4版本BP业务伙伴的逻辑原理_sap bp-CSDN博客文章浏览阅读1.6k次,点赞32次,收藏16次。本文详细解释了SAPS4/HANA版本中的业务伙伴(BP)功能配置,包括BP角色、角色类别、主数据同步等内容,以及这些配置如何与前台业务界面交互,提供了一个简化的大致逻辑和思维导图链接帮助理解。https://blog.csdn.net/qq_40141758/article/details/137636389?fromshare=blogdetail&sharetype=blogdetail&sharerId=137636389&sharerefer=PC&sharesource=qq_40141758&sharefrom=from_link
二、系统实现
本文主要记录设置字段必输的实现过程中,遇到的一些问题点以及最后的实现方法,大致分为5个部分
1、定义业务合作伙伴类型
2、后台配置--根据BP角色类别配置字段属性(根据角色类别FLVN00/FLVN01 配置字段必输)--无法实现!!
3、后台配置-根据供应商科目组配置字段属性(根据BP分组Z001配置字段必输)--无法实现!!
4、通过BADI:BUPA_ADDR_CHECK增强开发实现--可实现!!
5、通过BDT业务数据工具集(BUPT)来开发实现--可实现!!
1、定义业务合作伙伴类型
后台配置路径:跨应用组件->SAP 业务伙伴->业务伙伴->基本设置->商业伙伴类型->定义业务伙伴类型
PS:该业务合作伙伴类型,还可以通过不同的选项,配置影响其他其他页签的字段内容是否必输;
双击Z101进入字段控制界面
2、后台配置--根据BP角色类别配置字段属性--无法实现!!
根据角色类别FLVN00/FLVN01 配置字段必输
后台配置路径:跨应用组件->SAP 业务伙伴->业务伙伴->基本设置->字段分组->配置每个商业伙伴角色的字段属性
保存后,修改供应商主数据,可以看到,该字段被标记为必输;
但是,可以看到,其他分组的供应商,该字段也是必输,不符合我们的要求---我们的要求是,只有Z001 集团外供应商需要必输!!
此方法无法实现用户需求~~
PS:(1)根据该配置,可以知道,只要业务伙伴角色,不创建FLVN01的业务伙伴角色时,那么该字段就不会必输;
PS:(2)根据该配置,可以知道,只要业务伙伴角色,创建FLVN01的业务伙伴角色时,那么该字段就会必输;(与BP分组无关)
BP前提操作页面中,可以根据实际情况,选择系统配置的BP角色(如FLVN00/FLVN01),也可以选择BP角色分组(参考上图的配置,新增BP角色分组,把BP角色分配给BP角色分组中,那么当用户操作前台,选中操作BP角色分组是时,就同时包含BP角色的所有功能)
3、后台配置-根据供应商科目组配置字段属性--无法实现!!
根据BP分组Z001配置字段必输
既然BP角色与BP分组没有关联性,那么BP角色的字段控制组,也与BP分组没有关联性,那么我们的需求是根据BP分组“Z001 集团外供应商”来设置“业务合作伙伴类型”必输,那我们就考虑找到该BP分组的字段控制组;
后台配置路径:后勤 - 常规->业务伙伴->供应商->控制->定义科目组和字段选择(供应商)
这里的控制点,确实是可以根据BP分组来控制字段是否必输的,但是所有选项都查看后发现,并没有找到“业务合作伙伴类型”的字段,也就无法进行配置设置;
此方法无法实现用户需求~~
4、通过BADI:BUPA_ADDR_CHECK增强开发实现--可实现!!
(1)找到对应的BADI,并创建实施
SE18:BUPA_ADDR_CHECK
METHOD if_ex_bupa_addr_check~check.
DATA: ls_return type BAPIRET2.**清除返回结构
CLEAR ls_return.IF is_but000-bu_group EQ 'Z001'.CHECK is_but000-bpkind IS INITIAL.IF sy-subrc EQ 0.ls_return-TYPE = 'E'.ls_return-number = '005'.ls_return-ID = 'B1'.ls_return-MESSAGE_v1 = 'Z001 外集团外供应商:业务合作伙伴类型不能为空'.ls_return-MESSAGE_v2 = ''.ls_return-MESSAGE_v3 = ''.ls_return-MESSAGE_v4 = ''.append ls_return to et_return.ENDIF.ENDIF.ENDMETHOD.
(2)这里编写代码时,有几个地方需要注意:
A. 不能直接用MESSAGE的报错语法,否则系统会一直报错,然后界面还无法跳转到填写“业务合作伙伴类型”的地方;
B. 使用BADI中自带的消息返回参数时, 需要定义工作区,后面通过append to的方式添加到et_return中;
C. 需要用MESSAGE_V1—MESSAGE_V4的字段,不能用MESSAGE。
效果演示;
填写字段后,才允许保存
5、通过BDT业务数据工具集(BUPT)来开发实现
原理:通过BDT的配置,调用自定义的增强函数,使得BP主数据在保存时触发该自定义的增强函数。而自定义的增强函数,通过调用系统标准函数,从而获取BP主数据对应的视图信息。
本次实例参考了网上两篇文章来开发测试,但是由于功能已经实现,并且需求已经实现,所以讲解不会太清晰,大概记录一下实现过程。
SAP S4 HANA业务伙伴工具集(BDT)https://cloud.tencent.com/developer/article/2337673?felosearch_translate=1BP保存增强https://blog.csdn.net/csdnye26/article/details/134014717
应用程序
使用BDT维护的主数据和文档数据的每个对象都被定义为应用程序对象
BUP–普通业务伙伴
BUB–业务伙伴关系
BUA–地址
BUS-中心业务伙伴:控制
CVIC–客户链接
CVIV–供应商链接
…
应用程序可以单独打开或关闭。
获取当前bp其他视图的函数:
CVIV_BUPA_LFM1_GET 采购视图
CVIV_BUPA_LFB1_GET 公司视图
CVIV_BUPA_LFA1_GET 原视图
CVIC_BUPA_KNA1_GET 客户数据
CVIC_BUPA_KNB1_GET 客户数据
BUP_BUPA_BUT000_GET 基本视图数据
(1)SE37:创建BP的供应商或客户视图保存函数
其他导入、导出、表等所有页签均不需要输入内容;另外,需要注意,输出报错信息时,最好不要用MESSAGE XXXX WITH XXX的语法,最好使用对应的报错信息函数,便于系统报错时,用户可以重新修改错误地方的数据。
FUNCTION zmm_bupa_check_bpkind.
*"----------------------------------------------------------------------
*"*"本地接口:
*"----------------------------------------------------------------------
DATA e_but000 TYPE but000.
DATA e_but000_stat TYPE bus_istat.
DATA e_data TYPE bussdi3-data.
DATA e_partner_ext TYPE bu_partner.CALL FUNCTION 'BUP_BUPA_BUT000_GET'IMPORTINGe_but000 = e_but000." e_but000_stat = e_but000_stat." e_data = e_data." e_partner_ext = e_partner_ext.IF e_but000-bu_group eq 'Z001'.IF e_but000-bpkind IS INITIAL." MESSAGE E005(B1) WITH '分组Z001 集团外供应商必须要维护业务合作伙伴类型'." LEAVE TO screen 0.CALL FUNCTION 'BUS_MESSAGE_STORE'EXPORTINGarbgb = 'B1'msgty = 'E'txtnr = '005'
* CANCEL = ' 'MSGV1 = ' 分组Z001 集团外供应商必须要维护业务合作伙伴类型'
* MSGV2 = ' '
* MSGV3 = ' '
* MSGV4 = ' '.ENDIF.ENDIF.ENDFUNCTION.
(2)配置业务伙伴保存前检查的事件
A、点击新条目,新增项目:这里只能用数字
B、填写功能函数名称:上一步创建的函数
C、应用程序:填写需要控制的BP视图对应的应用程序(由于我这边的需求是修改基本视图的业务类型合作伙伴,所以选择BUS,具体对应关系没有深究,有兴趣的小伙伴可以自行研究下)
(3)配置BP视图对应的应用程序
事务码:BUSD
如果这里找不到对应的应用程序,那么需要手动添加新条目
(4)测试功能
Z001供应商分组,不填写业务合作伙伴类型,保存时会报错,满足需求。
至此,本次业务需求已完成,有错误之处,欢迎批评指正,谢谢~~