作者:​Harvey​


供应商主数据创建有三种方法:第一种是BDC 第二种是用SAP自身的一个方法VMD_EI_API=>MAINTAIN_BAPI 第三种是用IDOC的方式。IDOC的方式比较简单,通过配置IDOC然后就可以实现。IDOC TYPE为CREMAS03或者CREMAS05都可以 看你的需要啦。如果有些字段在IDOC TYPE里面没有的(比如EMAIL这样的字段)那么就要写IDOC增强,不过写增强还得找出口还得去增强标准的一些代码我觉得很烦,我是把它的IDOC关联的标准FUNCTION COPY出来创建完成后生成了供应商代码,然后再写一个更新EMAIL的function去更新email信息和其他IDOC TYPE 里面没有的字段信息。以下为通过VMD_EI_API=>MAINTAIN_BAPI 去创建供应商主数据的部分数据代码。

*&---------------------------------------------------------------------*
*& Report  ZVENDOR
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZVENDOR.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_VENDOR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --> text
*----------------------------------------------------------------------*
              " FRM_CREATE_VENDOR

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_VENDOR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --> text
*----------------------------------------------------------------------*

  DATA: LS_RETURN TYPE BAPIRET2.
  DATA: LS_MASTER_DATA TYPE VMDS_EI_MAIN.
  DATA: LS_MASTER_DATA_CORRECT  TYPE  VMDS_EI_MAIN,
        LS_MESSAGE_CORRECT  TYPE  CVIS_MESSAGE,
        LS_MASTER_DATA_DEFECTIVE  TYPE  VMDS_EI_MAIN,
        LS_MESSAGE_DEFECTIVE  TYPE  CVIS_MESSAGE.
  DATA: LS_VMDS_EI_EXTERN TYPE VMDS_EI_EXTERN.
  DATA: LS_CORRECT_EXTERN TYPE VMDS_EI_EXTERN.
  DATA: LS_REMARKS TYPE CVIS_EI_REM.
  DATA: LS_BANK TYPE CVIS_EI_CVI_BANKDETAIL.
  DATA: LS_COMMUNICATION_PHONE TYPE CVIS_EI_PHONE_STR,
        LS_COMMUNICATION_FAX TYPE  CVIS_EI_FAX_STR,
        LS_COMMUNICATION_SMTP TYPE CVIS_EI_SMTP_STR.
  DATA: LV_STRING TYPE STRING .
  DATA: LV_APPROVED_DATE TYPE STRING,
        LV_APPROVED_DATE1 TYPE STRING.
  DATA: LV_ADRNR TYPE ADRNR,
        LS_KNVK TYPE KNVK,
*        LS_ZMMR1010 TYPE ZMMR1010,
        LV_RETCODE TYPE NRRETURN,
        LV_PERSON_NUMBER TYPE AD_PERSNUM.
  DATA: LS_CVI_BANKDETAIL TYPE CVIS_EI_CVI_BANKDETAIL,
        LS_BANKDETAIL_KEY TYPE CVIS_EI_BANKDETAIL_KEY,
        LS_BANKDETAIL_DATA TYPE CVIS_EI_BANKDETAIL_DATA,
        LS_BANKDETAIL_DATAX TYPE CVIS_EI_BANKDETAIL_DATAX.
  DATA: LV_MAX_LIFNR TYPE LIFNR.
  DATA: LS_VMDS_CMP TYPE VMDS_EI_COMPANY,
        LS_VMDS_PUR TYPE VMDS_EI_PURCHASING,
        LS_VMDS_FUN TYPE VMDS_EI_FUNCTIONS.
  DATA: ZLFBK TYPE LFBK.
  DATA:IV_FLAG  TYPE C .
  CLEAR:LS_RETURN ,
        LS_MASTER_DATA ,
        LS_MASTER_DATA_CORRECT ,
        LS_MESSAGE_CORRECT  ,
        LS_MASTER_DATA_DEFECTIVE  ,
        LS_MESSAGE_DEFECTIVE  ,
        LS_VMDS_EI_EXTERN ,
        LS_CORRECT_EXTERN ,
        LS_REMARKS ,
        LS_BANK ,
        LS_COMMUNICATION_PHONE ,
        LS_COMMUNICATION_FAX ,
        LS_COMMUNICATION_SMTP ,
        LV_STRING ,
        LV_APPROVED_DATE ,
        LV_APPROVED_DATE1 ,
        LV_ADRNR ,
        LS_KNVK ,
        LV_RETCODE  ,
        LV_PERSON_NUMBER ,
        LS_CVI_BANKDETAIL ,
        LS_BANKDETAIL_KEY ,
        LS_BANKDETAIL_DATA ,
        LS_BANKDETAIL_DATAX ,
        LV_MAX_LIFNR ,
        LS_VMDS_CMP ,
        LS_VMDS_PUR ,
        LS_VMDS_FUN ,
        ZLFBK ,
        IV_FLAG .
  CLEAR LS_VMDS_EI_EXTERN.

* 维护标识:插入、更新
  IV_FLAG =  'I' .
  LS_VMDS_EI_EXTERN-HEADER-OBJECT_TASK = IV_FLAG.
*  LS_VMDS_EI_EXTERN-HEADER-OBJECT_INSTANCE-LIFNR = IT_LIFNR-LIFNR.  "供应商

* 公司代码默认:JNPC    ???
  CLEAR LS_VMDS_CMP.
  LS_VMDS_CMP-TASK = IV_FLAG.
  LS_VMDS_CMP-DATA_KEY-BUKRS = '2000' .  "取采购组织下的
  LS_VMDS_CMP-DATA-AKONT  = '0000062130'.        "总帐中的统驭科目  其他应付款-往来
  LS_VMDS_CMP-DATA-FDGRV  = 'A5'.
*  LS_VMDS_CMP-DATA-XVERR  = 'X'.                 " 结算客户

  LS_VMDS_CMP-DATAX-AKONT = 'X'.                  "总帐中的统驭科目  其他应付款-往来
  LS_VMDS_CMP-DATAX-FDGRV = 'X'.
*  LS_VMDS_CMP-DATAX-XVERR = 'X'.                "结算客户
  APPEND LS_VMDS_CMP TO LS_VMDS_EI_EXTERN-COMPANY_DATA-COMPANY.

* 采购组织默认:1000
*  CLEAR LS_VMDS_PUR.
*  LS_VMDS_PUR-TASK = IV_FLAG.
*  LS_VMDS_PUR-DATA_KEY-EKORG = IS_VENDOR_DATA-EKORG.
*  LS_VMDS_PUR-DATA-WAERS     = IS_VENDOR_DATA-WAERS."'RMB'.

* 合同伙伴
*  LS_VMDS_FUN-TASK = IV_FLAG.
*  LS_VMDS_FUN-DATA_KEY-PARVW = 'LF'.   "供应商
*  LS_VMDS_FUN-DATA-PARTNER =  .
*  LS_VMDS_FUN-DATAX-PARTNER = 'X'.
*  APPEND LS_VMDS_FUN TO LS_VMDS_PUR-FUNCTIONS-FUNCTIONS.

*  CLEAR LS_VMDS_FUN.
*  LS_VMDS_FUN-TASK = IV_FLAG.
*  LS_VMDS_FUN-DATA_KEY-PARVW = 'RS'. "发票提供者
*  LS_VMDS_FUN-DATA-PARTNER = LV_LIFNR.
*  LS_VMDS_FUN-DATAX-PARTNER = 'X'.
*  APPEND LS_VMDS_FUN TO LS_VMDS_PUR-FUNCTIONS-FUNCTIONS.

*  CLEAR LS_VMDS_FUN.
*  LS_VMDS_FUN-TASK = IV_FLAG.
*  LS_VMDS_FUN-DATA_KEY-PARVW = 'BA'. "订货地址在表TPAR里查  原厂商  VN 供应商
*  LS_VMDS_FUN-DATA-PARTNER = LV_LIFNR.
*  LS_VMDS_FUN-DATAX-PARTNER = 'X'.
*  APPEND LS_VMDS_FUN TO LS_VMDS_PUR-FUNCTIONS-FUNCTIONS.
*  APPEND LS_VMDS_PUR TO LS_VMDS_EI_EXTERN-PURCHASING_DATA-PURCHASING.

* 外部接口:组织地址
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-TASK = IV_FLAG.
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-TITLE   =  '0003'.       "公司
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-NAME    = '我擦'."描述
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-COUNTRY = 'CN' .         "国家
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-LANGU   = SY-LANGU.      "语言
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-SORT1  = '搜索条件.
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-CITY = IS_VENDOR_DATA-ORT01.        "城市
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-POSTL_COD1 = IS_VENDOR_DATA-PSTLZ.  "邮编
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-SORT1 = IS_VENDOR_DATA-ZGFJC. "简称
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-COMM_TYPE = 'INT'. "???邮件
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-EXTENS_1 = LV_APPROVED_DATE. "资质有效期

  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-TITLE   = 'X'.
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-NAME    = 'X'.
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-COUNTRY = 'X'.
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-LANGU   = 'X'.
   LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-SORT1 = 'X' .
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-CITY = 'X'.        "城市
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-DISTRICT = 'X'.     "???
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-POSTL_COD1 = 'X' . “邮编
*  ls_vmds_ei_extern-central_data-address-postal-datax-postl_cod2 = 'X'.
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-PO_BOX = 'X'.      "邮政信箱???
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-STREET = 'X'.      "街道
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-SORT1 = 'X'.
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-REGION = 'X'."地区(省/自治区/直辖市、市、县)
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-COMM_TYPE = 'X'.
*  LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-EXTENS_1 = 'X'. "资质有效期

*
*  CLEAR:LV_STRING, LS_VMDS_FUN.
*  CONCATENATE 'L_' IT_LIFNR-LIFNR INTO  LV_STRING .
*  IF IT_LIFNR-LIFNR =  'Y001'.
*    LV_STRING = 'Y_SH01' .   "特殊情况
*  ENDIF.
*  CONDENSE LV_STRING NO-GAPS .
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-CENTRAL-DATA-KUNNR     = '0000000484' .    "客户
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-CENTRAL-DATA-VBUND     = '002000' .    "贸易伙伴
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-CENTRAL-DATA-KTOKK     = 'Z001'.   "帐户组

  LS_VMDS_EI_EXTERN-CENTRAL_DATA-CENTRAL-DATAX-KUNNR    = 'X' .   "客户
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-CENTRAL-DATAX-VBUND    = 'X' .   "贸易伙伴
  LS_VMDS_EI_EXTERN-CENTRAL_DATA-CENTRAL-DATAX-KTOKK    = 'X' .

*  IF IS_VENDOR_DATA-BANKN IS NOT INITIAL AND IS_VENDOR_DATA-BANKL IS NOT INITIAL.
*    LS_bank-TASK = IV_FLAG.
*    LS_bank-DATA_KEY-BANKS = IS_VENDOR_DATA-LAND1. "银行国家代码 = IV_FLAG.
*    LS_bank-DATA_KEY-BANKL = IS_VENDOR_DATA-BANKL. "银行帐户号码
*    LS_bank-DATA_KEY-BANKN =  IS_VENDOR_DATA-BANKN."银行编号
*    LS_bank-DATA-BKREF =  IS_VENDOR_DATA-BANKN2."银行编号参考
*    IF IV_FLAG = 'U'.
*      SELECT SINGLE * INTO ZLFBK FROM LFBK WHERE LIFNR =  LV_LIFNR.
*      IF SY-SUBRC = 0.
*        LS_BANK-TASK = 'D'.
*        LS_BANK-DATA_KEY-BANKS = ZLFBK-BANKS. "银行国家代码 = IV_FLAG.
*        LS_BANK-DATA_KEY-BANKL = ZLFBK-BANKL. "银行帐户号码
*        LS_BANK-DATA_KEY-BANKN = ZLFBK-BANKN."银行编号
*      LS_bank-DATA-BKREF =  IS_VENDOR_DATA-BANKN2."银行编号参考
*      LS_bank-DATAX-BKREF =  'X'."银行编号参考
*        APPEND LS_BANK TO LS_VMDS_EI_EXTERN-CENTRAL_DATA-BANKDETAIL-BANKDETAILS.
*      ENDIF.
*    ENDIF.
*    LS_BANK-TASK = 'I'.
*    LS_BANK-DATA_KEY-BANKS = IS_VENDOR_DATA-LAND1. "银行国家代码 = IV_FLAG.
*    LS_BANK-DATA_KEY-BANKL = IS_VENDOR_DATA-BANKL. "银行帐户号码
*    LS_BANK-DATA_KEY-BANKN =  IS_VENDOR_DATA-BANKN."银行编号
*    LS_BANK-DATA-BKREF =  IS_VENDOR_DATA-BANKN2."银行编号参考
*    APPEND LS_BANK TO LS_VMDS_EI_EXTERN-CENTRAL_DATA-BANKDETAIL-BANKDETAILS.
*    if IV_FLAG = 'U'.
*      LS_VMDS_EI_EXTERN-CENTRAL_DATA-BANKDETAIL-CURRENT_STATE = IV_FLAG.
*    endif.
*  ENDIF.
* 外部接口:地址注释
*  LS_REMARKS-TASK = IV_FLAG.
*
*  LS_REMARKS-DATA-LANGU =  SY-LANGU.
*  LS_REMARKS-DATAX-LANGU = 'X'.
*  LS_REMARKS-DATAX-ADR_NOTES = 'X'.
*  APPEND LS_REMARKS TO LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-REMARK-REMARKS.
*
** 外部接口:电话号码
*  LS_COMMUNICATION_PHONE-CONTACT-TASK = IV_FLAG.
*  LS_COMMUNICATION_PHONE-CONTACT-DATA-TELEPHONE = IS_VENDOR_DATA-TELF1.
*  LS_COMMUNICATION_PHONE-CONTACT-DATA-COUNTRY = IS_VENDOR_DATA-LAND1. "'CN'.IS_VENDOR_DATA-COUNTRY.
*
*  LS_COMMUNICATION_PHONE-CONTACT-DATAX-TELEPHONE = 'X'.
*  LS_COMMUNICATION_PHONE-CONTACT-DATAX-COUNTRY = 'X'.
*  APPEND LS_COMMUNICATION_PHONE TO LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-COMMUNICATION-PHONE-PHONE.
** 外部接口:传真
*  LS_COMMUNICATION_FAX-CONTACT-TASK = IV_FLAG.
*  LS_COMMUNICATION_FAX-CONTACT-DATA-FAX = IS_VENDOR_DATA-TELFX.
*  LS_COMMUNICATION_FAX-CONTACT-DATA-COUNTRY = IS_VENDOR_DATA-LAND1. "'CN'.IS_VENDOR_DATA-COUNTRY.
*
*  LS_COMMUNICATION_FAX-CONTACT-DATAX-FAX = 'X'.
*  LS_COMMUNICATION_FAX-CONTACT-DATAX-COUNTRY = 'X'.
*  APPEND LS_COMMUNICATION_FAX TO LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-COMMUNICATION-FAX-FAX.
*
*
** 扩展接口:电子邮件号
*  LS_COMMUNICATION_SMTP-CONTACT-TASK = IV_FLAG.
*  LS_COMMUNICATION_SMTP-CONTACT-DATA-E_MAIL = IS_VENDOR_DATA-SMTP_ADDR.
*  LS_COMMUNICATION_SMTP-CONTACT-DATAX-E_MAIL = 'X'.
*  APPEND LS_COMMUNICATION_SMTP TO LS_VMDS_EI_EXTERN-CENTRAL_DATA-ADDRESS-COMMUNICATION-SMTP-SMTP.

* 复杂外部接口的供应商
  APPEND LS_VMDS_EI_EXTERN TO LS_MASTER_DATA-VENDORS.

  SET UPDATE TASK LOCAL.

* 调用api维护供应商
  CALL METHOD VMD_EI_API=>MAINTAIN_BAPI
    EXPORTING
      IV_COLLECT_MESSAGES      = 'X'
      IS_MASTER_DATA           = LS_MASTER_DATA
    IMPORTING
      ES_MASTER_DATA_CORRECT   = LS_MASTER_DATA_CORRECT
      ES_MESSAGE_CORRECT       = LS_MESSAGE_CORRECT
      ES_MASTER_DATA_DEFECTIVE = LS_MASTER_DATA_DEFECTIVE
      ES_MESSAGE_DEFECTIVE     = LS_MESSAGE_DEFECTIVE.

* 返回结果处理
  LOOP AT LS_MESSAGE_DEFECTIVE-MESSAGES
  TRANSPORTING NO FIELDS
  WHERE TYPE CA 'EA'.
    EXIT.
  ENDLOOP.
  IF SY-SUBRC = 0. "失败

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*    IT_LIFNR-FLAG = 'N' .
  ELSE."成功

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
*    IT_LIFNR-FLAG = 'Y' .

  ENDIF.
                    " FRM_CREATE_VENDOR