SAP BP 业务实践与ABAP 分享
BP的心得
- BP的概念
- 业务方案实践
- 数据处理
- BP对象的ABAP实现
- 1.用到的类型对象
- 2.BP维护主题流程```
- 3.角色信息
- 4.BP基本信息
- 5.BP地址信息
- 6.供应商信息
- 7.客户信息
- 税分类信息
- 信贷限额信息
- 总结
- 一些BP相关的方案设计心得
BP的概念
从后勤物流角度来看,后勤主要主数据是客户主数据和供应商主数据。我们在S/4HANA中学到的第一件事是客户 - 供应商集成(CVI),也称为业务合作伙伴(BP)。
在传统SAP ERP中,客户和供应商是作为两个不同的功能存在的。而在SAP S/4 HANA中,将两者统一维护为Business partner。所以传统的ERP系统中的事务代码都将被废弃,在SAP S/4 HANA 中统一通过事务代码BP使用角色的方式来实现的。
所以,传统SAP ERP 用户在转换为SAP S/4 HANA时,是需要对客户和供应商的主数据做调整的。
以上的官方解释。
个人理解就是不管组织还是个人,都是企业的一个伙伴,也就是BP,当与他发生采购业务时,那么就分配采购角色,维护供应商信息;客户同理;类似的还有UKM信贷角色,房地产管理的各类结算单位,零售业务的SITE角色之类。
业务都基于角色开展,BP是统筹的意思。当然非公司的个人也差不多。
业务方案实践
基于以上BP的个人理解,我个人倾向与把BP/客户/供应商的编码统一处理。当然有些升级项目可能旧数据存在两边的冲突,但还是建议变革做统一。
最简化的配置方案如下:
1.BP分组示例规划:
分组 | 描述 |
---|---|
C001 | 客户分组1 |
C002 | 客户分组2 |
C003 | 客户分组3 |
V001 | 供应商分组1 |
V002 | 供应商分组2 |
V003 | 供应商分组3 |
核心点,客户与供应商的分组也是6个组,两边组1 1对应。
当然如果要做一些字段状态组控制或合作伙伴控制,还可以在客户/供应商账户组层配置。
2.号码段规划如下:
客户/供应商全部一个号码段,号码段为1-ZZZZZZZZZZ,所有的客户/供应商账户组都对应这个无意义的全号分组。
在BP层对BP的分组进行号码段规划,设置合适的编号范围。
在配置 跨应用组件->主数据同步->客户/供应商集成->业务伙伴设置->供应商集成的设置->供应商集成的字段分配->分配键值->定义方向业务伙伴到供应商的编号分配
设置供应商账户组与BP分组的关系,1比1就OK,同时配置相同号码。
客户类似。
实现业务规则就是建BP统一的跨模块的方案,不论是供应商偶尔有销售也许需要扩客户,还是反过来,都可以用统一的BP编码扩充对应角色。
基于这样,才能发挥BP集成角色的意义。
**当然系统支持BP角色与供应商/客户有不同的编码。**那么结果就是BP是多余的,客户供应商还分属不同领域。也就没有BP存在的意义,仅仅是系统要求的。这样不符合BP设计的初衷,不建议。
数据处理
在做批量数据处理时,其实传统的LSMW录屏/MASS批修改还是可以使用的。但是录屏体验其实比较差。
这里如果做期初的数据批处理,如果没有ABAP开发独立程序,建议使用LTMC新功能,用WEB端实现导入。
网上文档有一些,晚点在整理。
关于ABAP实现,下一部分。
BP对象的ABAP实现
目前没发现SAP有对BP的BAPI或者EDI接口,过去客户/供应商的方式基本也无法使用了。
很多项目还是需要这方面的接口,批处理程序,甚至自定义的维护界面,系统内审批功能生效等等业务需求。
下面部分贴些BP处理的代码仅供参考。
1.用到的类型对象
DATA:lt_data TYPE cvis_ei_extern_t, ls_data TYPE cvis_ei_extern, ls_address_help TYPE bus_ei_bupa_address, ls_address_usages TYPE bus_ei_bupa_addressusage, ls_vend_company TYPE vmds_ei_company, ls_with_tax TYPE vmds_ei_wtax_type, ls_role TYPE bus_ei_bupa_roles, lt_return2 TYPE TABLE OF bapiret2.DATA: lv_guid TYPE bu_partner_guid.DATA:ls_return TYPE cvis_bp_return,lv_task TYPE c, " I新建 U 更新lv_task_v TYPE c, " 供应商逻辑处理lv_task_c TYPE c, " 客户逻辑处理ls_but000 TYPE but000,ls_kna1 TYPE kna1,ls_lfa1 TYPE lfa1,ls_alv TYPE zscmt0001,lt_bapiret2 TYPE TABLE OF bapiret2,ls_bapiret2 TYPE bapiret2,lv_bp TYPE bu_partner,lv_create_applog TYPE boolean.
2.BP维护主题流程```
*—判断创建还是修改"信贷限额SELECT SINGLE * INTO ls_but000FROM but000 WHERE partner = cs_data-partner.IF sy-subrc = 0.lv_task = 'U'.ELSE.lv_task = 'I'.ENDIF.lv_bp = cs_data-partner.
*--- 清空全局参数CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'.
*--- 生成或者获取全局GUIDCASE lv_task.WHEN 'I'.CALL FUNCTION 'GUID_CREATE'IMPORTINGev_guid_32 = ls_data-partner-header-object_instance-bpartnerguid.WHEN 'U'.SELECT SINGLE partner_guidFROM but000INTO lv_guidWHERE partner = lv_bp.ls_data-partner-header-object_instance-bpartnerguid = lv_guid.ls_data-partner-header-object_instance-bpartner = lv_bp.WHEN OTHERS.ENDCASE.ls_data-partner-header-object_task = lv_task."BP 角色PERFORM f_add_role USING lv_bpcs_dataCHANGING ls_data."基本视图PERFORM f_add_bp_general USING lv_bplv_taskcs_dataCHANGING ls_data."一般地址信息/电话 /传真/邮箱PERFORM f_add_bp_address USING lv_bplv_taskcs_dataCHANGING ls_data."银行信息PERFORM F_BANK_ACC USING LV_BPCS_DATACHANGING LS_DATA."供应商信息PERFORM f_add_sup_general USING lv_bplv_taskcs_dataCHANGING ls_data."客户信息PERFORM f_add_cust_general USING lv_bplv_taskcs_dataCHANGING ls_data."信贷限额PERFORM f_add_ukm_general USING lv_bplv_taskcs_dataCHANGING ls_data."整合处理 IF lv_task = 'I'.IF lv_task_v = 'X'.SELECT COUNT(*) FROM lfa1 WHERE lifnr = lv_bp.IF sy-subrc <> 0.ls_data-ensure_create-create_vendor = abap_true.ENDIF.ENDIF.IF lv_task_c = 'X'.SELECT COUNT(*) FROM kna1 WHERE kunnr = lv_bp.IF sy-subrc <> 0.ls_data-ensure_create-create_customer = abap_true.ENDIF.ENDIF.ENDIF.APPEND ls_data TO lt_data."全局数据校验cl_md_bp_maintain=>validate_single(EXPORTING i_data = ls_dataIMPORTING et_return_map = DATA(lt_return_map) )."数据校验消息处理LOOP AT lt_return_map ASSIGNING FIELD-SYMBOL(<ls_return_map>)WHERE type = 'E' OR type = 'A'.MOVE-CORRESPONDING <ls_return_map> TO et_return.APPEND et_return.ev_status = 'E'.ENDLOOP."数据提交处理IF ev_status = 'E'.RETURN.ELSE.cl_md_bp_maintain=>maintain(EXPORTING i_data = lt_dataIMPORTING e_return = DATA(lt_return) ).ENDIF.
3.角色信息
FORM f_add_role USINGu_bp TYPE char10u_alv TYPE zscmt0001CHANGINGc_data TYPE cvis_ei_extern.DATA: lt_but100 TYPE TABLE OF but100,ls_but100 TYPE but100,lt_roles TYPE bus_ei_bupa_roles_t,ls_roles TYPE bus_ei_bupa_roles.SELECT *INTO TABLE lt_but100FROM but100WHERE partner = u_bp."财务供应商角色READ TABLE lt_but100 INTO ls_but100 WITH KEY partner = u_bprltyp = 'FLVN00'.IF sy-subrc <> 0.IF u_alv-flvn00 = 'X'.CLEAR ls_roles.ls_roles-task = 'I'.ls_roles-data_key = 'FLVN00'.ls_roles-data-valid_from = sy-datum .ls_roles-data-valid_to = '99991231' .APPEND ls_roles TO lt_roles.ENDIF.ENDIF."财务客户角色READ TABLE lt_but100 INTO ls_but100 WITH KEY partner = u_bprltyp = 'FLCU00'.IF sy-subrc <> 0.IF u_alv-flcu00 = 'X'.CLEAR ls_roles.ls_roles-task = 'I'.ls_roles-data_key = 'FLCU00'.ls_roles-data-valid_from = sy-datum .ls_roles-data-valid_to = '99991231' .APPEND ls_roles TO lt_roles.ENDIF.ENDIF."客户角色READ TABLE lt_but100 INTO ls_but100 WITH KEY partner = u_bprltyp = 'FLCU01'.IF sy-subrc <> 0.IF u_alv-flcu01 = 'X' .CLEAR ls_roles.ls_roles-task = 'I'.ls_roles-data_key = 'FLCU01'.ls_roles-data-valid_from = sy-datum .ls_roles-data-valid_to = '99991231' .APPEND ls_roles TO lt_roles.ENDIF.ENDIF."采购角色READ TABLE lt_but100 INTO ls_but100 WITH KEY partner = u_bprltyp = 'FLVN01'.IF sy-subrc <> 0 .IF u_alv-flvn01 = 'X' .CLEAR ls_roles.ls_roles-task = 'I'.ls_roles-data_key = 'FLVN01'.ls_roles-data-valid_from = sy-datum .ls_roles-data-valid_to = '99991231' .APPEND ls_roles TO lt_roles.ENDIF.ENDIF."信用角色READ TABLE lt_but100 INTO ls_but100 WITH KEY partner = u_bprltyp = 'UKM000'.IF sy-subrc <> 0 .IF u_alv-fukm000 = 'X' .CLEAR ls_roles.ls_roles-task = 'I'.ls_roles-data_key = 'UKM000'.ls_roles-data-valid_from = sy-datum .ls_roles-data-valid_to = '99991231' .APPEND ls_roles TO lt_roles.ENDIF.ENDIF.IF lt_roles IS NOT INITIAL.c_data-partner-central_data-role-roles = lt_roles.ENDIF.ENDFORM.
4.BP基本信息
FORM f_add_bp_general USINGu_bp TYPE char10u_task TYPE char1u_alv TYPE zscmt0001CHANGING c_data TYPE cvis_ei_extern.c_data-partner-header-object_instance-bpartner = u_bp.c_data-partner-header-object_task = u_task.c_data-partner-central_data-common-data-bp_control-category = '2'."类别c_data-partner-central_data-common-data-bp_control-grouping = u_alv-bu_group."分组 控制视图 号码段c_data-partner-central_data-common-data-bp_centraldata-searchterm1 = u_alv-bu_sort1_txt ."搜索项1
* c_data-partner-central_data-common-data-bp_centraldata-searchterm2 = u_alv-sortl2 ."名称2 ."搜索项2c_data-partner-central_data-common-data-bp_centraldata-partnerlanguage = u_alv-langu ."语言c_data-partner-central_data-common-data-bp_centraldata-centralblock = u_alv-zdelete."集中冻结c_data-partner-central_data-common-data-bp_organization-name1 = u_alv-name1."' ."名称1c_data-partner-central_data-common-data-bp_organization-name2 = u_alv-name2 ."名称2
* c_data-partner-central_data-common-data-bp_organization-name3 = u_alv-name3 ."名称3IF u_task = 'U' .c_data-partner-central_data-common-datax-bp_centraldata-searchterm1 = abap_true ."搜索项1
* c_data-partner-central_data-common-datax-bp_centraldata-searchterm2 = abap_true ."名称2 ."搜索项2c_data-partner-central_data-common-datax-bp_centraldata-partnerlanguage = abap_true .c_data-partner-central_data-common-datax-bp_centraldata-centralblock = abap_true.c_data-partner-central_data-common-datax-bp_organization-name1 = abap_true.c_data-partner-central_data-common-datax-bp_organization-name2 = abap_true ."名称2
* c_data-partner-central_data-common-datax-bp_organization-name3 = abap_true ."名称3ENDIF.ENDFORM.
5.BP地址信息
FORM f_add_bp_address USING u_bp TYPE char10u_task TYPE char1u_alv TYPE zscmt0001CHANGING c_data TYPE cvis_ei_extern.DATA:lv_guid TYPE bu_partner_guid,ls_but000 TYPE but000,ls_address_help TYPE bus_ei_bupa_address,ls_address_usages TYPE bus_ei_bupa_addressusage,ls_phone TYPE bus_ei_bupa_telephone,lt_phone TYPE bus_ei_bupa_telephone_t,ls_fax TYPE bus_ei_bupa_fax,lt_fax TYPE bus_ei_bupa_fax_t,ls_smtp TYPE bus_ei_bupa_smtp,lt_smtp TYPE bus_ei_bupa_smtp_t.ls_address_help-task = u_task.CLEAR lv_guid.CASE u_task.WHEN 'U'.SELECT SINGLE address_guidFROM but020INTO lv_guidWHERE partner = u_bp.ls_address_help-data_key-guid = lv_guid.WHEN 'I'.CALL FUNCTION 'GUID_CREATE'IMPORTINGev_guid_32 = ls_address_help-data_key-guid.WHEN OTHERS.ENDCASE.ls_address_help-task = u_task.ls_address_help-data-postal-data-city = u_alv-zshi ."城市ls_address_help-data-postal-data-standardaddress = 'X'.ls_address_help-data-postal-data-postl_cod1 = u_alv-post_code1."邮政编码/城市ls_address_help-data-postal-data-street = u_alv-zdizhi.
* LS_ADDRESS_HELP-DATA-POSTAL-DATA-HOUSE_NO = U_ALV-HSNM1 ."门牌号ls_address_help-data-postal-data-country = u_alv-country ."国家ls_address_help-data-postal-data-countryiso = u_alv-country ."国家
* LS_ADDRESS_HELP-DATA-POSTAL-DATA-REGION = U_ALV-REGIO ."地区ls_address_help-data-postal-data-time_zone = 'UTC+8' ."defalutls_address_help-data-postal-data-langu = u_alv-langu ."语言ls_address_help-data-postal-data-languiso = u_alv-langu ."语言
* IF U_ALV-POBXCTY IS NOT INITIAL.
* LS_ADDRESS_HELP-DATA-POSTAL-DATA-POBOX_CTRY = U_ALV-POBXCTY."通讯国家
* LS_ADDRESS_HELP-DATA-POSTAL-DATA-PO_BOX_REG = U_ALV-POBXREG."通讯地区
* LS_ADDRESS_HELP-DATA-POSTAL-DATA-POSTL_COD2 = U_ALV-PSTCD2."通讯邮编
* LS_ADDRESS_HELP-DATA-POSTAL-DATA-PO_BOX_CIT = U_ALV-POBXLOC."通讯城市
* ENDIF.IF u_task = 'U'.ls_address_help-data-postal-datax-city = abap_true.ls_address_help-data-postal-datax-standardaddress = abap_true.ls_address_help-data-postal-datax-postl_cod1 = abap_true.ls_address_help-data-postal-datax-street = abap_true.
* LS_ADDRESS_HELP-DATA-POSTAL-DATAX-HOUSE_NO = ABAP_TRUE.ls_address_help-data-postal-datax-country = abap_true.ls_address_help-data-postal-datax-countryiso = abap_true.
* LS_ADDRESS_HELP-DATA-POSTAL-DATAX-REGION = ABAP_TRUE.ls_address_help-data-postal-datax-time_zone = abap_true.ls_address_help-data-postal-datax-langu = abap_true.ls_address_help-data-postal-datax-langu_iso = abap_true.
* IF U_ALV-POBXCTY IS NOT INITIAL.
* LS_ADDRESS_HELP-DATA-POSTAL-DATAX-POBOX_CTRY = ABAP_TRUE.
* LS_ADDRESS_HELP-DATA-POSTAL-DATAX-PO_BOX_REG = ABAP_TRUE.
* LS_ADDRESS_HELP-DATA-POSTAL-DATAX-POSTL_COD2 = ABAP_TRUE.
* LS_ADDRESS_HELP-DATA-POSTAL-DATAX-PO_BOX_CIT = ABAP_TRUE.
* ENDIF.ENDIF.APPEND ls_address_help TO c_data-partner-central_data-address-addresses.ENDFORM.
6.供应商信息
FORM f_add_sup_general USING u_bp TYPE char10u_task TYPE cu_alv TYPE zscmt0001CHANGING c_data TYPE cvis_ei_extern.DATA: lt_company TYPE vmds_ei_company_t,ls_company TYPE vmds_ei_company,lt_purchasing TYPE vmds_ei_purchasing_t,ls_purchasing TYPE vmds_ei_purchasing,lt_functions TYPE vmds_ei_functions_t."供应商基本数据IF u_alv-flvn00 = 'X' OR u_alv-flvn01 = 'X'.SELECT SINGLE *INTO @DATA(ls_lfa1)FROM lfa1WHERE lifnr = @u_alv-partner.IF sy-subrc EQ 0.c_data-vendor-header-object_instance-lifnr = u_bp.c_data-vendor-header-object_task = 'U'.IF u_alv-bu_group = 'A001'.c_data-vendor-central_data-central-datax-vbund = abap_true.ENDIF.
* C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATAX-STENR = ABAP_TRUE."税号
* C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATAX-STCEG = ABAP_TRUE."增值税登记号 20位
* C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATAX-FITYP = ABAP_TRUE."税收类型
* C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATAX-STCDT = ABAP_TRUE."税号类型\ELSE.c_data-vendor-header-object_task = 'I'.IF u_alv-bu_group = 'A001'.c_data-vendor-central_data-central-data-vbund = u_alv-partner+4(6)."贸易伙伴ENDIF.ENDIF.
** C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATA-STCEG = U_ALV-STCEG."增值税登记号 20位
* C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATA-FITYP = U_ALV-AFITP."税收类型
* C_DATA-VENDOR-CENTRAL_DATA-CENTRAL-DATA-STCDT = U_ALV-ATOID."税号类型ENDIF." 供应商公司数据IF u_alv-flvn00 = 'X'.SELECT SINGLE *INTO @DATA(ls_lfb1)FROM lfb1WHERE lifnr = @u_alv-partnerAND bukrs = @u_alv-bukrs.IF sy-subrc = 0.ls_company-task = 'U'.ls_company-datax-akont = abap_true."统御科目ls_company-datax-zterm = abap_true."付款条件
* LS_COMPANY-DATAX-SPERR = ABAP_TRUE."所选公司代码 过账冻结
* LS_COMPANY-DATAX-GUZTE = ABAP_TRUE."信用记录条件
* LS_COMPANY-DATAX-ALTKN = ABAP_TRUE."先前的账户号
* LS_COMPANY-DATAX-ZWELS = ABAP_TRUE."付款方式ELSE.ls_company-task = 'I'.ENDIF.ls_company-data_key = u_alv-bukrs.ls_company-data-akont = u_alv-akont_ven."统御科目ls_company-data-zterm = u_alv-zterm_ven."付款条件
* LS_COMPANY-DATA-SPERR = U_ALV-SPERB_B."所选公司代码 过账冻结
* LS_COMPANY-DATA-GUZTE = U_ALV-GUZTE."信用记录条件
* LS_COMPANY-DATA-ALTKN = U_ALV-ALTKN."先前的账户号
* LS_COMPANY-DATA-ZWELS = U_ALV-ZWELS."付款方式APPEND ls_company TO lt_company.c_data-vendor-company_data-company = lt_company.ENDIF."供应商采购数据IF u_alv-flvn01 = 'X'.SELECT SINGLE *INTO @DATA(ls_lfm1)FROM lfm1WHERE lifnr = @u_bpAND ekorg = @u_alv-ekorg.IF sy-subrc = 0.ls_purchasing-task = 'U'.ls_purchasing-datax-waers = abap_true. "货币.ls_purchasing-datax-kalsk = abap_true. "方案组.
* LS_PURCHASING-DATAX-LFABC = ABAP_TRUE. "供应商等级ls_purchasing-datax-webre = abap_true. "基于收货的发票验证
* LS_PURCHASING-DATAX-SPERM = ABAP_TRUE. "采购冻结在采购组ELSE.ls_purchasing-task = 'I'.PERFORM f_add_sup_purch_functions USING u_alv " 供应商合作伙伴功能CHANGING lt_functions.IF lt_functions IS NOT INITIAL.ls_purchasing-functions-functions = lt_functions.ENDIF.ENDIF.ls_purchasing-data_key = u_alv-ekorg.ls_purchasing-data-waers = u_alv-waers. "货币.ls_purchasing-data-kalsk = u_alv-kalsk. "方案组.
* LS_PURCHASING-DATA-LFABC = U_ALV-LFABC. "供应商等级ls_purchasing-data-webre = u_alv-webre. "基于收货的发票验证
* LS_PURCHASING-DATA-SPERM = U_ALV-SPERM_M. "采购冻结在采购组APPEND ls_purchasing TO lt_purchasing.c_data-vendor-purchasing_data-purchasing = lt_purchasing.ENDIF.ENDFORM.
7.客户信息
FORM f_add_cust_general USINGu_bp TYPE char10u_task TYPE cu_alv TYPE zscmt0001CHANGING c_data TYPE cvis_ei_extern.DATA: lt_company TYPE cmds_ei_company_t,ls_company TYPE cmds_ei_company,lt_sales TYPE cmds_ei_sales_t,ls_sales TYPE cmds_ei_sales,lt_texts TYPE cvis_ei_text_t,ls_texts TYPE cvis_ei_text,lt_functions TYPE cmds_ei_functions_t,lt_tax TYPE cmds_ei_tax_ind_t."客户销售组织数据IF u_alv-flcu01 = 'X' OR u_alv-flcu00 = 'X'.SELECT SINGLE *INTO @DATA(ls_kna1)FROM kna1WHERE kunnr = @u_bp.IF sy-subrc EQ 0.c_data-customer-header-object_instance-kunnr = u_bp.c_data-customer-header-object_task = 'U'.
* IF u_alv-bu_group = 'A001'.
* c_data-customer-central_data-central-datax-vbund = 'X'."贸易伙伴
* ENDIF.ELSE.c_data-customer-header-object_task = 'I'.c_data-customer-header-object_instance-kunnr = u_bp.
* IF u_alv-bu_group = 'A001'.
* c_data-customer-central_data-central-data-vbund = u_alv-partner+4(6)."贸易伙伴
* ENDIF.ENDIF.IF u_alv-flcu01 = 'X'.SELECT SINGLE *INTO @DATA(ls_knvv)FROM knvvWHERE kunnr = @u_bpAND vkorg = @u_alv-vkorgAND vtweg = @u_alv-vtwegAND spart = @u_alv-spart.IF sy-subrc = 0.ls_sales-task = 'U'.
* ls_sales-datax-kdgrp = abap_true."运营方式ls_sales-datax-kalks = abap_true."定价过程ls_sales-datax-konda = abap_true."客户定价组ls_sales-datax-bzirk = abap_true."销售地区ls_sales-datax-waers = abap_true."币种ls_sales-datax-vsbed = abap_true."装运条件ls_sales-datax-kkber = abap_true."信控范围ls_sales-datax-vwerk = abap_true."交货工厂
* ls_sales-datax-ktgrd = abap_true."账户分配组
* ls_sales-datax-aufsd = abap_true."冻结
* ls_sales-datax-lifsd = abap_true."
* ls_sales-datax-faksd = abap_true."ELSE.ls_sales-task = 'I'.PERFORM f_add_sale_functions USING u_alv " 客户伙伴功能CHANGING lt_functions.IF lt_functions IS NOT INITIAL.ls_sales-functions-functions = lt_functions.ENDIF.ENDIF.ls_sales-data_key-vkorg = u_alv-vkorg.ls_sales-data_key-vtweg = u_alv-vtweg.ls_sales-data_key-spart = u_alv-spart..
* ls_sales-data-kdgrp = u_alv-kdgrp."运营方式ls_sales-data-kalks = u_alv-kalks."定价过程ls_sales-data-konda = u_alv-konda."客户定价组ls_sales-data-bzirk = u_alv-bzirk."销售地区ls_sales-data-waers = u_alv-waers."币种ls_sales-data-vsbed = u_alv-vsbed."装运条件ls_sales-data-kkber = u_alv-kkber."信控范围ls_sales-data-vwerk = u_alv-werks."交货工厂ls_sales-data-ktgrd = u_alv-ktgrd."账户分配组* ls_sales-data-aufsd = u_alv-aufsd."冻结
* ls_sales-data-lifsd = u_alv-lifsd."
* ls_sales-data-faksd = u_alv-faksd."APPEND ls_sales TO lt_sales.c_data-customer-sales_data-sales = lt_sales.ENDIF." 客户公司代码IF u_alv-flcu00 = 'X' .SELECT SINGLE *INTO @DATA(ls_knb1)FROM knb1WHERE kunnr = @u_bpAND bukrs = @u_alv-bukrs.IF sy-subrc = 0.ls_company-task = 'U'.ls_company-datax-akont = abap_true."统御科目ls_company-datax-zterm = abap_true."付款条件
* ls_company-datax-sperr = abap_true."所选公司代码 过账冻结ELSE.ls_company-task = 'I'.ENDIF.ls_company-data_key = u_alv-bukrs.ls_company-data-akont = u_alv-akont_cus."统御科目ls_company-data-zterm = u_alv-zterm_cus."付款条件
* ls_company-data-sperr = u_alv-sperb_b_k."所选公司代码 过账冻结APPEND ls_company TO lt_company.c_data-customer-company_data-company = lt_company.PERFORM f_add_sale_tax_typ USING u_alv " 客户伙伴功能u_bpCHANGING lt_tax.c_data-customer-central_data-tax_ind-tax_ind = lt_tax.ENDIF.ENDIF.
ENDFORM.
合作伙伴信息:
FORM f_add_sale_functions USING u_alv TYPE zscmt0001CHANGING ct_functions TYPE cmds_ei_functions_t.DATA: ls_knvp TYPE knvp,ls_functions TYPE cmds_ei_functions,ls_cust_sales_functions TYPE cvis_customer_sales_func.DATA: lv_part_up TYPE zscmt0010-partner.CALL METHOD cvi_default_values_classic=>get_default_cust_functionsEXPORTINGi_account_group = u_alv-bu_group "账户组RECEIVINGr_functions_list = DATA(lt_partner_function).IF u_alv-zydc_sc_no IS NOT INITIAL.lv_part_up = u_alv-zydc_sc_no.SELECT SINGLE * FROM zscmt0010 INTO @DATA(ls_0010)WHERE partner = @lv_part_up."店中店上上级IF ls_0010-bu_group = 'K006' AND ls_0010-zydc_sc_no IS NOT INITIAL.lv_part_up = ls_0010-zydc_sc_no.ENDIF.ENDIF.LOOP AT lt_partner_function INTO ls_knvp.ls_functions-task = 'I'.ls_functions-data_key-parvw = ls_knvp-parvw.ls_functions-data_key-parza = ls_knvp-parza.
* LS_FUNCTIONS-DATA-PARTNER = LS_KNVP-PARNR.ls_functions-data-defpa = ls_knvp-defpa.ls_functions-data-knref = ls_knvp-knref.IF lv_part_up IS NOT INITIAL.IF ls_functions-data_key-parvw = 'RE' OR ls_functions-data_key-parvw = 'RG' .ls_functions-data-partner = lv_part_up.
* ELSE.
* ls_functions-data-partner = u_alv-partner.ENDIF.
* ELSE.
* ls_functions-data-partner = u_alv-partner.ENDIF.APPEND ls_functions TO ct_functions.CLEAR:ls_functions.ENDLOOP.ENDFORM.
税分类信息
FORM f_add_sale_tax_typ USING u_alv TYPE zscmt0001u_bp TYPE char10CHANGING ct_tax TYPE cmds_ei_tax_ind_t.DATA: ls_knvi TYPE knvi,ls_area TYPE cvis_sales_area,ls_cust_sales_tax_typ TYPE cvis_customer_sales_func,lt_knvi TYPE TABLE OF knvi,ls_tax TYPE cmds_ei_tax_ind.SELECT *INTO TABLE lt_knviFROM knviWHERE kunnr = u_bp.ls_area-sales_org = u_alv-vkorg.ls_area-dist_channel = u_alv-vtweg.ls_area-division = u_alv-spart.CALL METHOD cvi_default_values_classic=>get_default_cust_tax_indsEXPORTINGi_sales_area = ls_area "账户组RECEIVINGr_tax_indicators = DATA(lt_partner_tax_typ).LOOP AT lt_partner_tax_typ INTO DATA(ls_partner_tax_typ).READ TABLE lt_knvi INTO ls_knvi WITH KEY aland = ls_partner_tax_typ-alandtatyp = ls_partner_tax_typ-tatyp.IF sy-subrc = 0.ls_tax-task = 'U'.ls_tax-data-taxkd = u_alv-taxkd.ls_tax-datax-taxkd = abap_true.DELETE lt_knvi WHERE aland = ls_partner_tax_typ-aland ANDtatyp = ls_partner_tax_typ-tatyp.ELSE.ls_tax-task = 'I'.ENDIF.ls_tax-data-taxkd = u_alv-taxkd.ls_tax-data_key-aland = ls_partner_tax_typ-aland.ls_tax-data_key-tatyp = ls_partner_tax_typ-tatyp.APPEND ls_tax TO ct_tax.CLEAR ls_tax.ENDLOOP.LOOP AT lt_knvi INTO ls_knvi.ls_tax-task = 'D'.ls_tax-data-taxkd = ls_knvi-taxkd.ls_tax-data_key-aland = ls_knvi-aland.ls_tax-data_key-tatyp = ls_knvi-tatyp.APPEND ls_tax TO ct_tax.CLEAR ls_tax.ENDLOOP.ENDFORM.
信贷限额信息
FORM f_add_ukm_general USINGu_bp TYPE char10u_task TYPE cu_alv TYPE zscmt0001CHANGING c_data TYPE cvis_ei_extern.DATA:ls_profile TYPE ukm_ei_bp_cms.DATA:lt_segments TYPE ukmt_ei_bp_cms_sgm.DATA:ls_segments TYPE ukm_ei_bp_cms_sgm.IF u_alv-fukm000 = 'X' AND u_task = 'I'.ls_profile-data-check_rule = '01'.ls_profile-data-limit_rule = 'B2B-EXIST'.ls_profile-data-risk_class = 'A'.ls_profile-data-credit_group = '0001'.ls_profile-datax-check_rule = 'X'.ls_profile-datax-limit_rule = 'X'.ls_profile-datax-risk_class = 'X'.ls_profile-datax-credit_group = 'X'.c_data-partner-ukmbp_data-profile = ls_profile.* IF u_alv-credit > 0.ls_segments-task = u_task.ls_segments-data_key-partner = u_bp.ls_segments-data_key-credit_sgmnt = 'Z001'.ls_segments-data-credit_limit = u_alv-credit.ls_segments-data-limit_valid_date = '99991231'.APPEND ls_segments TO lt_segments.c_data-partner-ukmbp_data-segments-segments = lt_segments.
* ENDIF.ENDIF.ENDFORM.
总结
以上代码基本OK,可能有时候客户/供应商有些值为空时获取消息有些异常。有明白的欢迎交流。
一些BP相关的方案设计心得
SAP的标准主数据设计的很全面,同号码授权/分配到组织很灵活。不过在一些行业也会显得很冗余。例如零售。
个人建议通过一些动态指针配置,简化BP的一些字段,不论对自定义界面还是接口还是批导入,可以采用字段配置默认或者映射逻辑去减少模板长度,减少错误可能。
例如如果我们分组配置合理,那么很多时候你的统御科目应该时按分组唯一的,那为什么还必须手填呢?
以下配置可以集成到程序里。
当然如果你的项目是客户手工维护BP,那请无视哈哈。其实屏幕增强也可以实现。
欢迎讨论奥。
SAP BP 业务实践与ABAP 分享相关推荐
- SAP最佳业务实践:FI-导言
SAP最佳业务实践:FI-导言 (2017-08-23 09:21:11) 转载▼ 标签: fi 概览 分类: ERP.MES与企业信息化 ERP是为财务服务的,包括SAP和国内的用友.金蝶都是从财务 ...
- SAP最佳业务实践:重复制造(149)-4发料
1.MF60备料 在此活动中,您为生产备料.如果在生产存储地点有充足的库存可用,将不生成行项目. 必须有库存. 角色:车间主任 后勤- 生产-重复制造 -备料- 拉式清单-触发补货 1. 在 按计划订 ...
- 中科大脑知识图谱平台建设及业务实践
本文首发于 Nebula Graph Community 公众号 "为了支持城市复杂场景下各类需求,中科大脑知识图谱团队设计开发了一套包含本体可视化设计.数据映射.数据抽取.数据写入.图数据 ...
- SAP BP最佳业务实践
1.什么是 SAP Best Practices? SAP BestPractices 包提供量身定做的详细实施文档和预配置系统,以支持一般或特定行业和市场需要的端到端业务流程.基于 building ...
- python 支付宝个人账单_金融支付财务融合业务-实践分享1:订单、账单、交易流水、账套知识解构、原理解析...
本文作者从实际工作实践出发,结合案例等分享了电商金融支付财务融合中的基本概念和相关原理解析,包括:订单.账单.交易流水和账知识解构,供大家一同参考和学习. 从事电商.进销存.金融.支付.财务的产品同学 ...
- SAP资产折旧-工作量法业务实践和实操
文章目录 一.资产折旧概述 二.工作量法业务实践 2.1 相关数值计算 三.工作量法实操 3.1 配置折旧码-AFAMA 3.2 维护工作量-A025 / S_ALR_87009161 3.3 资产折 ...
- 机器学习业务实践之路-李博-专题视频课程
机器学习业务实践之路-7159人已学习 课程介绍 本系列课程为您讲述如何使用机器学习算法解决业务问题,会以实际业务作为出发点,所有实验都提供实验流程以及实验数据,帮您用短的时间学习机器 ...
- 神策数据胡士文:数据智能驱动业务实践
本文根据神策数据算法工程师胡士文,以<数据智能驱动业务实践>为主题的演讲整理而成,将为您重点介绍以下内容: 依据场景解读如何应用数据智能? Case 1:如何通过机器学习,促进付费用户识别 ...
- 视频PPT互动问答丨数据驱动的业务实践专题
2021年11月26日,以"数据驱动的业务实践"为主题的『2021数据技术嘉年华·ON LINE』第四期活动已经圆满结束啦!现在给大家安排上干货满满的PPT资源放送及视频回看,没来 ...
最新文章
- mysql 写锁需要等待读锁释放吗_Mysql实战45讲笔记:5、全局锁和表锁
- Swift结构体与类
- HDFS建筑与shell操作
- 必看!Spark 进阶之路之「SparkSQL」入门概述 | 博文精选
- 多线程调用同一个对象的方法_这一次,让我们完全掌握Java多线程(2/10)
- 软件版本命名规范及各阶段说明
- AS技巧合集「编码技巧篇」
- DirectSound学习笔记(4):设备性能
- 《深入剖析Tomcat》一3.3 小结
- 顶级大厂如何做好暗黑模式设计?来看 Ant Design 的规范文档
- 问题解决: Google企业邮箱收不到Postfix发的邮件
- ftp服务器端口修改,FTP端口:默认为21端口
- 八种抽样技术的科学指南
- php保存pdf旋转90度,怎么把pdf旋转90度 多个pdf文件页面旋转的方法|支持选择要旋转的页面及旋转角度...
- 1068 万绿丛中一点红 (20 分)
- python基础题-字符串列表训练
- sql cast 和convert用法详解
- 阿里正面阻击拼多多?店宝宝:百亿补贴进入新战场
- 【原神】各角色Pixiv涩图统计(一). 最多的是谁? R18涩图谁最多?
- 博览——万维网的发明者—蒂姆•伯纳斯-李 (一)
热门文章
- Spring如何用“声明式事务”保护亿万数据安全?【万字解决并发冲突】
- Gradle | Gradle构建之Groovy语言基础
- #Tensorflow Process finished with exit code 3#
- SpringBoot启动代表出现Process finished with exit code 0
- 炫云全新支持优化渲染质量了
- 橡胶密封圈的作用和优点
- 论文人强烈推荐必备的几个中英文文献网站
- 网易云热歌榜评论(爬虫项目)
- 从配置,外观,写一篇小米13测评报告
- java 全角_java字符全角半角转换