sap供应商更改组_bapi创建及修改供应商主数据(业务伙伴、财务视图、银行信息、采购组织)...

该博客详细介绍了如何在SAP系统中使用BAPI函数模块创建和更新供应商主数据,包括业务伙伴信息、财务视图、银行信息以及采购组织的数据。通过示例代码展示了从数据选择到数据提交的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CASE SRM_SUPPLIER_IN-ZMOD.

WHEN 'ADD'.

SELECT MAX( BUT000~PARTNER )

INTO L_BPARTNER

FROM BUT000

WHERE BUT000~BU_GROUP = 'ST07'.

L_BPARTNER = L_BPARTNER + 1.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

INPUT = L_BPARTNER

IMPORTING

OUTPUT = L_BPARTNER.

CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'

EXPORTING

INPUT = 'ZH'

IMPORTING

OUTPUT = LS_ADDRESS-LANGU "语言

EXCEPTIONS

UNKNOWN_LANGUAGE = 1

OTHERS = 2.

L_PARTN_CAT = '2'.

L_PARTN_GRP = 'ST07'.

LS_CENTRAL-TITLE_KEY = '0003'. "称谓

LS_CENTRAL_ORGAN-NAME1 = SRM_SUPPLIER_IN-NAME_ORG1. "名称1

IF SRM_SUPPLIER_IN-BU_SORT1 IS INITIAL.

LS_CENTRAL-SEARCHTERM1 = SRM_SUPPLIER_IN-NAME_ORG1(20). "检索项

ELSE.

LS_CENTRAL-SEARCHTERM1 = SRM_SUPPLIER_IN-BU_SORT1. "检索项

ENDIF.

LS_ADDRESS-STREET = SRM_SUPPLIER_IN-STREET. "街道

LS_ADDRESS-CITY = SRM_SUPPLIER_IN-CITY1. "城市

LS_ADDRESS-COUNTRY = 'CN'. "国家

CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA'

EXPORTING

BUSINESSPARTNEREXTERN = L_BPARTNER

PARTNERCATEGORY = L_PARTN_CAT

PARTNERGROUP = L_PARTN_GRP

CENTRALDATA = LS_CENTRAL

CENTRALDATAORGANIZATION = LS_CENTRAL_ORGAN

ADDRESSDATA = LS_ADDRESS

IMPORTING

BUSINESSPARTNER = L_BPARTNER

TABLES

RETURN = LT_RETURN1

.

CLEAR:RETURN_MESSAGE, L_MSG1.

LOOP AT LT_RETURN1 WHERE TYPE CA 'AEX'.

CALL FUNCTION 'MESSAGE_TEXT_BUILD'

EXPORTING

MSGID = LT_RETURN1-ID

MSGNR = LT_RETURN1-NUMBER

MSGV1 = LT_RETURN1-MESSAGE_V1

MSGV2 = LT_RETURN1-MESSAGE_V2

MSGV3 = LT_RETURN1-MESSAGE_V3

MSGV4 = LT_RETURN1-MESSAGE_V4

IMPORTING

MESSAGE_TEXT_OUTPUT = RETURN_MESSAGE.

L_MSG1 = L_MSG1 && '##' && RETURN_MESSAGE.

CLEAR RETURN_MESSAGE.

ENDLOOP.

IF L_MSG1 IS INITIAL.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "commit--信息提交

EXPORTING

WAIT = 'X'. "地址信息提交

L_VENDOR = L_BPARTNER.

CLEAR LS_BAPIBUS1006_BANKDETAIL.

LS_BAPIBUS1006_BANKDETAIL-BANK_KEY = SRM_SUPPLIER_IN-BANKL.

LS_BAPIBUS1006_BANKDETAIL-BANK_CTRY = 'CN'. "银行国家

LS_BAPIBUS1006_BANKDETAIL-ACCOUNTHOLDER = SRM_SUPPLIER_IN-KOINH. "账户持有人

LS_BAPIBUS1006_BANKDETAIL-BANK_ACCT = SRM_SUPPLIER_IN-BANK_NO. "银行账户

CLEAR LS_BAPIBUS1006_BANKDETAIL_X.

LS_BAPIBUS1006_BANKDETAIL_X-BANK_KEY = 'X'.

LS_BAPIBUS1006_BANKDETAIL_X-BANK_CTRY = 'X'.

LS_BAPIBUS1006_BANKDETAIL_X-ACCOUNTHOLDER = 'X'.

LS_BAPIBUS1006_BANKDETAIL_X-BANKACCOUNTNAME = 'X'.

CLEAR: LT_RETURN3, LT_RETURN3[].

CALL FUNCTION 'BAPI_BUPA_BANKDETAIL_ADD'

EXPORTING

BUSINESSPARTNER = L_BPARTNER

BANKDETAILDATA = LS_BAPIBUS1006_BANKDETAIL

TABLES

RETURN = LT_RETURN3.

CLEAR L_MSG3.

LOOP AT LT_RETURN3 WHERE TYPE = 'E' OR TYPE = 'A'. " OR TYPE = 'W'.

CONCATENATE LT_RETURN3-MESSAGE L_MSG3 INTO L_MSG3 SEPARATED BY ';'. "银行信息创建不成功

CONDENSE L_MSG3.

ENDLOOP.

IF L_MSG3 = ''.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

EXPORTING

WAIT = 'X'. "银行信息提交(即银行信息创建成功)

*分配角色

CLEAR: LT_RETURN4,LT_RETURN4[].

CALL FUNCTION 'BAPI_BUPA_ROLE_ADD_2' "财务视图

EXPORTING

BUSINESSPARTNER = L_BPARTNER

BUSINESSPARTNERROLECATEGORY = 'FLVN00'

BUSINESSPARTNERROLE = 'FLVN00'

TABLES

RETURN = LT_RETURN4.

CLEAR L_MSG4.

LOOP AT LT_RETURN4 WHERE TYPE = 'E' OR TYPE = 'A'.

CONCATENATE LT_RETURN4-MESSAGE L_MSG4 INTO L_MSG4 SEPARATED BY ';'.

CONDENSE L_MSG4.

ENDLOOP.

IF L_MSG4 = ''.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

EXPORTING

WAIT = 'X'.

CLEAR: LS_MASTER_DATA,LS_COMPANY,LT_MASTER_DATA.

LS_MASTER_DATA-HEADER-OBJECT_TASK = 'M'.

LS_MASTER_DATA-HEADER-OBJECT_INSTANCE-LIFNR = L_VENDOR.

LS_MASTER_DATA-CENTRAL_DATA-CENTRAL-DATA-KTOKK = 'ST07'. "供应商帐户组

LS_MASTER_DATA-CENTRAL_DATA-CENTRAL-DATA-STENR = SRM_SUPPLIER_IN-TAXNUM."社会信用号

LS_MASTER_DATA-CENTRAL_DATA-CENTRAL-DATAX-KTOKK = 'X'. "供应商帐户组

LS_MASTER_DATA-CENTRAL_DATA-CENTRAL-DATAX-STENR = 'X'."社会信用号

LS_MASTER_DATA-CENTRAL_DATA-ADDRESS-POSTAL-DATA-NAME = SRM_SUPPLIER_IN-NAME_ORG1+0(35). "名称1

LS_MASTER_DATA-CENTRAL_DATA-ADDRESS-POSTAL-DATA-NAME_2 = SRM_SUPPLIER_IN-NAME_ORG1+35(5). "名称2

IF SRM_SUPPLIER_IN-BU_SORT1 IS INITIAL.

LS_MASTER_DATA-CENTRAL_DATA-ADDRESS-POSTAL-DATA-SORT1 = SRM_SUPPLIER_IN-NAME_ORG1+0(20). "检索项

ELSE.

LS_MASTER_DATA-CENTRAL_DATA-ADDRESS-POSTAL-DATA-SORT1 = SRM_SUPPLIER_IN-BU_SORT1. "属性(SAP为搜索项 1)

ENDIF.

LS_MASTER_DATA-CENTRAL_DATA-ADDRESS-POSTAL-DATA-STREET = SRM_SUPPLIER_IN-STREET. "街道/门牌号

LS_MASTER_DATA-CENTRAL_DATA-ADDRESS-POSTAL-DATA-CITY = SRM_SUPPLIER_IN-CITY1. "城市

<think>好的,我现在需要解决用户在SAP中使用BAdI增强来防止客户主数据中合作伙伴字段重复录入的问题。首先,我应该回忆一下SAP中的BAdI机制,以及客户主数据相关的增强点。 用户提到的是客户主数据中的合作伙伴字段,这可能涉及到XD02或XD01事务码中的屏幕增强。SAP中的BAdI(Business Add-In)是一种增强技术,允许用户在标准程序中插入自定义逻辑。首先,我需要确定哪个BAdI适合在保存客户主数据时进行校验。 根据之前的经验,客户主数据的校验可能使用BAdI比如MD_CHECKAUTHORITY或者CUSTOMER_UPDATE相关的。不过可能需要具体的信息。另外,合作伙伴功能通常在客户主数据的“合作伙伴功能”标签页中维护,比如在视图里维护合作伙伴角色和对应的客户编号。因此,校验逻辑应该在用户输入或保存时检查这些合作伙伴字段是否重复。 接下来,我需要考虑如何通过BAdI来捕获这些字段的值并进行校验。可能的步骤包括: 1. **确定合适的BAdI**:查找与客户主数据保存相关的BAdI。例如,可能在保存前使用CHECK_BEFORE_SAVE类似的BAdI,或者使用增强点CMOD中的出口。或者,用户增强可能涉及BADI_CUSTOMER_ADD_DATA,这个BAdI用于客户主数据的增强。 2. **实现BAdI**:创建BAdI的实现,编写校验逻辑。在保存客户数据之前,获取合作伙伴字段的值,检查是否已经存在相同的记录。例如,遍历合作伙伴功能表,检查是否有重复的合作伙伴编号和角色组合。 3. **数据检索与校验**:在BAdI的方法中,使用SELECT语句查询数据库表,比如BUT020(客户合作伙伴关系),根据当前输入的合作伙伴角色和编号,检查是否已有相同记录存在。需要注意的是,BUT020表的结构可能包含客户编号(CLIENT)、合作伙伴编号(PARTNER)、合作伙伴角色(RLTYP)等字段,应确保这些字段的组合唯一。 4. **错误提示**:如果发现重复,通过消息类型E终止保存操作,并提示用户重复输入。 另外,用户提供的引用中提到使用ZFI_DOCUMENT_CHANGE增强的例子,这可能与凭证修改有关,但在这里需要的是客户主数据的增强。同时,需要注意BADI的使用是否符合SAP的标准增强点,避免修改标准程序。 可能的问题点包括: - 正确识别触发校验的时机,是在数据输入时还是保存时。 - 如何获取当前正在处理的客户编号和合作伙伴数据。 - 处理批量输入的情况,确保所有条目都被校验。 还需要考虑性能问题,频繁的数据库查询可能会影响系统效率,尤其是在大量数据处理时。因此,可能需要优化查询语句,或使用缓存机制。 最后,测试是实现的关键步骤,确保增强在不同场景下有效,例如新增、修改客户时,合作伙伴字段的重复情况能正确被拦截。</think>在SAP中,通过BAdI实现客户主数据合作伙伴字段唯一性校验的步骤如下: ### 1. 确定增强点 使用BAdI **BADI_CUSTOMER_ADD_DATA**(客户主数据增强点),该BAdI在保存客户数据时触发,适用于校验逻辑[^2][^4]。 ### 2. 创建BAdI实现 - **事务码SE19**:创建新实现,命名为例如`ZCL_IM_CUSTOMER_PARTNER_CHECK`。 - 在方法`CHECK_BEFORE_SAVE`中添加校验逻辑。 ### 3. 编写校验逻辑 ```abap METHOD if_ex_badi_customer_add_data~check_before_save. DATA: lt_partner TYPE TABLE OF bapi0417_2, lv_message TYPE string. " 获取当前输入的合作伙伴数据 lt_partner = is_data-central_data-partner-function. " 遍历检查重复 SORT lt_partner BY partner rltyp. DELETE ADJACENT DUPLICATES FROM lt_partner COMPARING partner rltyp. IF sy-subrc = 0. " 抛出错误消息 MESSAGE e398(00) WITH '合作伙伴角色和编号存在重复' INTO lv_message. " 终止保存操作 RAISE EXCEPTION TYPE cx_badi_customer_add_data. ENDIF. ENDMETHOD. ``` ### 4. 数据库查询增强校验(可选) 若需严格校验,可查询表`BUT020`: ```abap LOOP AT lt_partner ASSIGNING FIELD-SYMBOL(<fs_partner>). SELECT COUNT(*) FROM but020 WHERE partner = <fs_partner>-partner AND rltyp = <fs_partner>-rltyp AND client = @sy-mandt. IF sy-dbcnt > 0. MESSAGE e398(00) WITH '合作伙伴已存在' INTO lv_message. RAISE EXCEPTION TYPE cx_badi_customer_add_data. ENDIF. ENDLOOP. ``` ### 5. 激活并测试 - 激活BAdI实现后,通过事务码**XD02**修改客户主数据,输入重复合作伙伴测试校验是否生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值