ABAP 客户主数据批导 CVI_EI_INBOUND_MAIN

本文介绍如何通过Excel文件上传,利用BAPI CVI_EI_INBOUND_MAIN功能批量导入客户主数据,包括更新标识处理、伙伴功能覆盖及数据验证等关键步骤。

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

使用BAPI批导客户主数据

BAPI: CVI_EI_INBOUND_MAIN

场景: 上传EXCEL文件,程序读出EXCEL文件并显示在ALV上,点击按钮即可批量导入客户主数据。
打上更新标识的数据,即为更新而不是创建

注意点:
客户角色FLCU00、FLCU01
FUNCTIONS伙伴功能的覆盖

客户主数据前台T-CODE:BP

REPORT: zsdb002.
*----------------------------------------------------------------------*
*  表声明
*----------------------------------------------------------------------*
TABLES:sscrfields.                 "选择屏幕上的字段
*----------------------------------------------------------------------*
* 数据类型
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_input,
        zgxbs        TYPE c,                  "更新标识
        bu_partner   TYPE bu_partner,         " 合作伙伴号
        partner_role TYPE bu_role,            " 屏幕用途的BP角色
        bu_group     TYPE tb001-bu_group,     " 业务伙伴分组
*       BPEXT        TYPE BUT000-BPEXT,       " 外部客户号
        name_org1    TYPE but000-name_org1,   " 名称1
        name_org2    TYPE but000-name_org2,   " 名称2
*       NAME_ORG3    TYPE BUT000-NAME_ORG3,   " 名称3
*       NAME_ORG4    TYPE BUT000-NAME_ORG4,   " 名称4
        bu_sort1     TYPE but000-bu_sort1,    " 搜索项1
        bu_sort2     TYPE but000-bu_sort2,    " 搜索项2
        post_code1   TYPE ad_pstcd1,          " 邮政编码
        region       TYPE regio,              " 省份/地区
        city         TYPE ad_city1,           " 城市
        country      TYPE land1,              " 国家
        street1      TYPE char200, "adrc-street,        " 街道1
*       STREET2      TYPE ADRC-STR_SUPPL1,    " 街道2
        comp_head    TYPE bp_comp_hd,         " 身份证号(原字段描述为街道办事处)
        tel_number   TYPE ad_tlnmbr1,         " 电话
*       LANGU        TYPE SY-LANGU,           " 语言 (传1位 eg:1)
        langue       TYPE char2,              " 语言(传2位 eg:EN)
        taxtype      TYPE bptaxtype,          " 税号类别
        taxnumxl     TYPE bptaxnum,           " 业务伙伴税号
        zzcust_sc    TYPE kna1-zzcust_sc,     "客户来源
        zzcust_cls   TYPE kna1-zzcust_cls,     "客户分类
        zzchannel_m  TYPE kna1-zzchannel_m,     "渠道管理
        zzrelated    TYPE kna1-zzrelated,     "是否关联方
        banks        TYPE bu_banks,           " 银行国家代码
        bankn        TYPE bu_bankn,           " 银行账户
        bkref        TYPE bu_bkref,           " 参考明细
        bankl        TYPE bu_bankk,           " 银行代码
        banka        TYPE banka,              " 开户行
        bahne        TYPE bahne,              " 组织机构代码
        kukla        TYPE kukla,              " 客户集团
        bran1        TYPE bran1_d,            " 二级公司
*       REMARK       TYPE AD_REMARK1,         " 注释
        bukrs        TYPE t001-bukrs,         " 公司代码
        togru        TYPE knb1-togru,         " 容差组
        akont        TYPE knb1-akont,         " 统驭科目
        zterm        TYPE knb1-zterm,         " 公司付款条件
        zuawa        TYPE dzuawa,             " 排序码
*       TEXT         TYPE C LENGTH 1000,      " 公司文本(部门)
        vkorg        TYPE rf02d-vkorg,        " 销售组织
        vtweg        TYPE rf02d-vtweg,        " 分销渠道
        spart        TYPE rf02d-spart,        " 产品组
        bzirk        TYPE knvv-bzirk,         " 销售区域
        vkbur        TYPE knvv-vkbur,         " 销售部门
        vkgrp        TYPE knvv-vkgrp,         " 销售组
        waers        TYPE knvv-waers,         " 币种
        konda        TYPE knvv-konda,         " 价格组
        kalks        TYPE knvv-kalks,         " 定价过程
        vwerk        TYPE knvv-vwerk,         " 交货工厂
        vsbed        TYPE knvv-vsbed,         " 装运条件
        podkz        TYPE knvv-podkz,         " POD-相关的
        zterm2       TYPE knb1-zterm,         " 销售付款条件
        ktgrd        TYPE knvv-ktgrd,         " 客户分配账户组别
        taxkd        TYPE knvi-taxkd,         " 税分类
        parvw        TYPE parvw,              " 合作伙伴功能
        xsy          TYPE kna1-kunnr,         " 销售员ID
        icon         TYPE c LENGTH 4,         " 预警信号灯
        message      TYPE c LENGTH 360,       " 信息
        box          TYPE c,
        langu        TYPE sy-langu,           " 语言
        num          TYPE i,                  " 行数
      END OF ty_input.

DATA:gt_alv TYPE STANDARD TABLE OF ty_input,   "ALV内表
     gs_alv TYPE ty_input.

TYPES:BEGIN OF ty_input2,
        bu_partner       TYPE bu_partner,         " 合作伙伴号
        partner_role     TYPE bu_role,            " 屏幕用途的BP角色
        limit_rule       TYPE ukm_limit_rule,     " 规则
        risk_class       TYPE ukm_risk_class,     " 风险类
        check_rule       TYPE ukm_check_rule,     " 检查规则
        credit_group     TYPE ukm_cred_group,     " 信用组
        credit_sgmnt     TYPE ukm_credit_sgmnt,     " 信用段
        credit_limit     TYPE ukm_credit_limit,     " 信用额度
        limit_valid_date TYPE ukm_valid_date,     " 有效期
        icon             TYPE c LENGTH 4,         " 预警信号灯
        message          TYPE c LENGTH 360,       " 信息
        box              TYPE c,
        partner_guid     TYPE bu_partner_guid,         " 合作伙伴GUID
        role_exist       TYPE c,
        sgmnt_exist      TYPE c,
      END OF ty_input2.
DATA:gt_alv2 TYPE STANDARD TABLE OF ty_input2,   "ALV内表
     gs_alv2 TYPE ty_input2.

DATA gt_alv_tax     TYPE STANDARD TABLE OF ty_input.    "校验税号重复临时表
DATA gt_tax_post    TYPE STANDARD TABLE OF dfkkbptaxnum."税号存在性校验临时内表
*----------------------------------------------------------------------*
* ALV参数声明
*----------------------------------------------------------------------*
DATA:gt_fieldcat TYPE lvc_t_fcat, " 字段目录内表
     gs_fieldcat TYPE lvc_s_fcat, " 字段目录工作区
     gs_layout   TYPE lvc_s_layo. " ALV布局

"选择界面下载按钮参数
DATA: functxt TYPE smp_dyntxt.

CONSTANTS : c_parvw1 TYPE parvw VALUE 'SP',
            c_parvw2 TYPE parvw VALUE 'BP',
            c_parvw3 TYPE parvw VALUE 'PY',
            c_parvw4 TYPE parvw VALUE 'SH'.

*----------------------------------------------------------------------*
* 选择屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN:FUNCTION KEY 1. "在屏幕定义功能码
SELECTION-SCREEN:FUNCTION KEY 2. "在屏幕定义功能码

SELECTION-SCREEN: BEGIN OF BLOCK blk1.
  SELECTION-SCREEN SKIP 1.
  PARAMETERS: p_file TYPE dxfields-longpath. "文件路径
  SELECTION-SCREEN SKIP 1.
  PARAMETERS: p_rd1 RADIOBUTTON GROUP rg1 DEFAULT 'X',
              p_rd2 RADIOBUTTON GROUP rg1.
SELECTION-SCREEN: END OF BLOCK blk1.

*----------------------------------------------------------------------*
* INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
*&---初始化选择屏幕值
*&---初始化变量
  functxt-icon_id   = icon_export.
  functxt-icon_text = '模板下载'.
  sscrfields-functxt_01 = functxt.
  functxt-icon_id   = icon_export.
  functxt-icon_text = '信贷模板下载'.
  sscrfields-functxt_02 = functxt.

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN                                                  *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
  "下载模板
  CASE sscrfields-ucomm.
    WHEN 'FC01'."系统预留的功能码
      "下载模板文件
      PERFORM frm_download.
    WHEN 'FC02'."系统预留的功能码
      "下载模板文件
      PERFORM frm_download_cms.
    WHEN OTHERS.
  ENDCASE.

*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN OUTPUT                                          *
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN ON VALUE-REQUEST                                *
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  "选择路径
  PERFORM frm_select_infile CHANGING p_file.

************************************************************************
* S T A R T   O F   S E L E C T I O N
************************************************************************
START-OF-SELECTION.
* 检查导入文件是否存在
  PERFORM frm_check_para.
*  导入文件
  PERFORM frm_upload.
* 校验导入的数据
  PERFORM frm_check_data.

************************************************************************
* E N D   O F   S E L E C T I O N
************************************************************************
END-OF-SELECTION.
  PERFORM frm_set_layout.
  PERFORM frm_set_fieldcat.
  PERFORM frm_display_data.


*&---------------------------------------------------------------------*
*&      Form  FRM_F4_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0010   text
*----------------------------------------------------------------------*
FORM frm_f4_file CHANGING p_0010 .
  DATA:lt_filetable TYPE filetable,
       lv_rc        TYPE i.

* 打开文件对话
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '请选择导入文件'                           " 默认名称'请选择导入文件'
      file_filter             = cl_gui_frontend_services=>filetype_excel   " 默认文件后缀名
      multiselection          = space            "
    CHANGING
      file_table              = lt_filetable     "导入数据放入内表
      rc                      = lv_rc             "返回正误判断
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

* 打开文件对话成功的情况下
  IF sy-subrc = 0 AND lv_rc = 1.
*   读取内表
    READ TABLE lt_filetable INTO p_0010 INDEX 1.
*   因为执行成功,读取第一行一定可以读到
    IF sy-subrc NE 0.
      CLEAR p_0010.
    ENDIF.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& 下载 SMW0中上传的文件
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download .
  DATA: fname(128), ftype(3), fsize TYPE i.
  DATA: l_fieldname TYPE string.
  DATA: lv_num TYPE i.
  DATA: user_action TYPE i. "文件保存对话框,用户行为
  DATA: lv_filename TYPE string, "下载文件名
        lv_wintitle TYPE string, "下载对话框标题名
        lv_filepath TYPE string, "文件路径
        lv_fullpath TYPE string, "全文件路径
        lv_file     TYPE rlgrap-filename,
        lv_title    TYPE string,
        lv_xlsname  TYPE wwwdatatab-objid VALUE 'ZSDB002',  "模板名称
        lv_key      TYPE wwwdatatab,
        lv_subrc    TYPE sy-subrc.

  DATA :def_file_name TYPE string.  "默认文件名
  CONCATENATE '客户批导导入模板' '.xlsx' INTO def_file_name.

  "文件保存对话框,获得保存路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
*     window_title      = '另存为'  "对话框的标题
      default_extension = 'XLSX'          "默认的文件后缀名
      default_file_name = def_file_name   "默认文件名
      file_filter       = 'EXCEL 文档|*.'   "文件类型过滤(只显示本地文件夹)
*     INITIAL_DIRECTORY =            "初始化的目录
    CHANGING
      filename          = lv_filename      "保存的文件名
      path              = lv_filepath      "文件路径
      fullpath          = lv_fullpath      "全文件路径
      user_action       = user_action
    EXCEPTIONS
      cntl_error        = 1
      error_no_gui      = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
    MESSAGE TEXT-003 TYPE 'S' DISPLAY LIKE 'E'. "文件保存失败
    RETURN.
  ENDIF.

*  取消下载


  IF user_action = '9'.
    MESSAGE TEXT-004 TYPE 'S' DISPLAY LIKE 'E'. "下载已取消
    RETURN.
  ENDIF.

  "从SAP资源库中下载文件
  lv_file = lv_fullpath.
  lv_key-relid = 'MI'.
  lv_key-objid = lv_xlsname.  "SMW0 中对象ID

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = lv_key
      destination = lv_file
    IMPORTING
      rc          = lv_subrc.

  IF sy-subrc <> 0.
    MESSAGE TEXT-005 TYPE 'S' DISPLAY LIKE 'E'. "SAP WEB资源库中无可用模板供使用,请检查模板是否存在!
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_download_CMS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download_cms .
  DATA: fname(128), ftype(3), fsize TYPE i.
  DATA: l_fieldname TYPE string.
  DATA: lv_num TYPE i.
  DATA: user_action TYPE i. "文件保存对话框,用户行为
  DATA: lv_filename TYPE string, "下载文件名
        lv_wintitle TYPE string, "下载对话框标题名
        lv_filepath TYPE string, "文件路径
        lv_fullpath TYPE string, "全文件路径
        lv_file     TYPE rlgrap-filename,
        lv_title    TYPE string,
        lv_xlsname  TYPE wwwdatatab-objid VALUE 'ZSDB002_XD',  "模板名称
        lv_key      TYPE wwwdatatab,
        lv_subrc    TYPE sy-subrc.

  DATA :def_file_name TYPE string.  "默认文件名
  CONCATENATE '客户-信贷批导导入模板' '.xlsx' INTO def_file_name.

  "文件保存对话框,获得保存路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
*     window_title      = '另存为'  "对话框的标题
      default_extension = 'XLSX'          "默认的文件后缀名
      default_file_name = def_file_name   "默认文件名
      file_filter       = 'EXCEL 文档|*.'   "文件类型过滤(只显示本地文件夹)
*     INITIAL_DIRECTORY =            "初始化的目录
    CHANGING
      filename          = lv_filename      "保存的文件名
      path              = lv_filepath      "文件路径
      fullpath          = lv_fullpath      "全文件路径
      user_action       = user_action
    EXCEPTIONS
      cntl_error        = 1
      error_no_gui      = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
    MESSAGE TEXT-003 TYPE 'S' DISPLAY LIKE 'E'. "文件保存失败
    RETURN.
  ENDIF.

*  取消下载


  IF user_action = '9'.
    MESSAGE TEXT-004 TYPE 'S' DISPLAY LIKE 'E'. "下载已取消
    RETURN.
  ENDIF.

  "从SAP资源库中下载文件
  lv_file = lv_fullpath.
  lv_key-relid = 'MI'.
  lv_key-objid = lv_xlsname.  "SMW0 中对象ID

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = lv_key
      destination = lv_file
    IMPORTING
      rc          = lv_subrc.

  IF sy-subrc <> 0.
    MESSAGE TEXT-005 TYPE 'S' DISPLAY LIKE 'E'. "SAP WEB资源库中无可用模板供使用,请检查模板是否存在!
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CHECK_PARA
*&---------------------------------------------------------------------*
*& 检查导入文件是否存在
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_para .
  IF p_file IS INITIAL .
    MESSAGE TEXT-001 TYPE 'S' DISPLAY LIKE 'E' .
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD
*&---------------------------------------------------------------------*
*& 导入文件
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload .
  DATA lt_raw TYPE truxs_t_text_data .
  DATA lv_path TYPE rlgrap-filename .
  DATA lt_line TYPE c VALUE 1.
  lv_path = p_file .

  CASE 'X'.
    WHEN p_rd1.
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
        EXPORTING
          i_field_seperator    = 'X'
          i_line_header        = lt_line "第一行不读
          i_tab_raw_data       = lt_raw "必输参数
          i_filename           = lv_path "路径
        TABLES
          i_tab_converted_data = gt_alv[] "读取EXCEL数据到内表
        EXCEPTIONS
          conversion_failed    = 1
          OTHERS               = 2.
    WHEN p_rd2.
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
        EXPORTING
          i_field_seperator    = 'X'
          i_line_header        = lt_line "第一行不读
          i_tab_raw_data       = lt_raw "必输参数
          i_filename           = lv_path "路径
        TABLES
          i_tab_converted_data = gt_alv2[] "读取EXCEL数据到内表
        EXCEPTIONS
          conversion_failed    = 1
          OTHERS               = 2.
    WHEN OTHERS.
  ENDCASE.

*&---校验数据是否为空
  IF p_rd1 = 'X' AND gt_alv IS INITIAL OR p_rd2 = 'X' AND gt_alv2 IS INITIAL.
    MESSAGE TEXT-002 TYPE 'S' DISPLAY LIKE 'E'.
*    MESSAGE S003(ZMSG). "无数据
    LEAVE LIST-PROCESSING.
  ENDIF.
  IF p_rd2 = 'X'.
    LOOP AT gt_alv2 INTO gs_alv2.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = gs_alv2-bu_partner
        IMPORTING
          output = gs_alv2-bu_partner.
      MODIFY gt_alv2 FROM gs_alv2.
      CLEAR gs_alv2.
    ENDLOOP.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
  CLEAR gs_layout.
  gs_layout-box_fname  = 'BOX'.
  gs_layout-sel_mode   = 'A'.     "选择行模式
  gs_layout-cwidth_opt = 'X'.     "优化列宽设置
  gs_layout-zebra      = 'X'.     "设置斑马线
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
  CLEAR:gs_fieldcat,gt_fieldcat.
*&--field宏设置
  DEFINE fc.
    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname  = &1.
    gs_fieldcat-scrtext_l  = &2.
    gs_fieldcat-ref_table  = &3.
    gs_fieldcat-ref_field  = &4.
    gs_fieldcat-no_zero    = &5.
    APPEND gs_fieldcat TO gt_fieldcat.
  END-OF-DEFINITION.
  fc 'ICON'         '预警信号灯'      '' '' ''.
  fc 'MESSAGE'      '消息'            '' '' ''.
  CASE 'X'.
    WHEN p_rd1.
      fc 'ZGXBS'        '更新标识'       '' '' ''.
      fc 'BU_PARTNER'   '合作伙伴编号'           '' '' 'X'.
      fc 'PARTNER_ROLE' '客户类型'       '' '' ''.
      fc 'BU_GROUP'     '分组'           ''  '' ''.
      fc 'NAME_ORG1'    '名称1'         '' '' ''.
      fc 'NAME_ORG2'    '名称2'         '' '' ''.
      fc 'BU_SORT1'     '搜索项1'       '' '' ''.
      fc 'BU_SORT2'     '搜索项2'       '' '' 'X'.
      fc 'POST_CODE1'   '邮政编码'           '' '' ''.
      fc 'REGION'       '省份'          '' '' ''.
      fc 'CITY'         '城市'           '' '' ''.
      fc 'COUNTRY'      '国家'          '' '' ''.
      fc 'STREET1'      '街道1'          '' '' ''.
      fc 'COMP_HEAD'    '身份证号'          '' '' ''.
      fc 'TEL_NUMBER'   '电话'          '' '' ''.
      fc 'LANGUE'       '语言'          '' '' ''.
      fc 'TAXTYPE'      '税号类别'          '' '' ''.
      fc 'TAXNUMXL'     '业务伙伴税号'          '' '' ''.
      fc 'ZZCUST_SC  '        '客户来源'           '' '' ''.
      fc 'ZZCUST_CLS '        '客户分类'           '' '' ''.
      fc 'ZZCHANNEL_M'        '渠道管理'           '' '' ''.
      fc 'ZZRELATED  '        '是否关联方'           '' '' ''.
      fc 'BANKS'        '银行国家代码'          '' '' ''.
      fc 'BANKN'        '银行账户'          '' '' ''.
      fc 'BKREF'        '参考明细'          '' '' ''.
      fc 'BANKL'        '银行代码'          '' '' ''.
      fc 'BANKA'        '开户行'          '' '' ''.
      fc 'BAHNE'        '组织机构代码'     '' '' ''.
      fc 'KUKLA'        '客户集团'         '' '' ''.
      fc 'BRAN1'        '二级公司'         '' '' ''.
      fc 'BUKRS'        '公司代码'         '' '' ''.
      fc 'TOGRU'        '容差组'           '' '' ''.
      fc 'AKONT'        '统驭科目'         '' '' ''.
      fc 'ZTERM'        '付款条件'         '' '' ''.
      fc 'ZUAWA'        '排序码'           '' '' ''.
      fc 'VKORG'        '销售组织'         '' '' ''.
      fc 'VTWEG'        '分销渠道'         '' '' ''.
      fc 'SPART'        '产品组'           '' '' ''.
      fc 'BZIRK'        '销售区域'         '' '' ''.
      fc 'VKBUR'        '销售部门'         '' '' ''.
      fc 'vkgrp'        '销售组'           '' '' ''.
      fc 'WAERS'        '币种'             '' '' ''.
      fc 'KONDA'        '价格组'           '' '' ''.
      fc 'KALKS'        '定价过程'         '' '' ''.
      fc 'VWERK'        '交货工厂'         '' '' ''.
      fc 'VSBED'        '装运条件'         '' '' ''.
      fc 'PODKZ'        'POD-相关的'         '' '' ''.
      fc 'ZTERM2'       '付款条件'         '' '' ''.
      fc 'KTGRD'        '客户分配帐户组别' '' '' ''.
      fc 'TAXKD'        '税分类'           '' '' ''.
      fc 'PARVW'        '合作伙伴功能'           '' '' ''.
      fc 'XSY'        '销售员ID'           '' '' ''.
    WHEN p_rd2.
      fc 'BU_PARTNER'   '合作伙伴编号'           '' '' 'X'.
      fc 'PARTNER_ROLE    ' ' 屏幕用途的BP角色'       '' '' ''.
      fc 'LIMIT_RULE      ' ' 规则'       '' '' ''.
      fc 'RISK_CLASS      ' ' 风险类'       '' '' ''.
      fc 'CHECK_RULE      ' ' 检查规则'       '' '' ''.
      fc 'CREDIT_GROUP    ' ' 信用组'       '' '' ''.
      fc 'CREDIT_SGMNT    ' ' 信用段'       '' '' ''.
      fc 'CREDIT_LIMIT    ' ' 信用额度'       '' '' ''.
      fc 'LIMIT_VALID_DATE' ' 有效期'       '' '' ''.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  CASE 'X'.
    WHEN p_rd1.
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          i_callback_program       = sy-repid
          i_callback_pf_status_set = 'FRM_SET_STATUS'
          i_callback_user_command  = 'FRM_USER_COMMAND'
          is_layout_lvc            = gs_layout
          it_fieldcat_lvc          = gt_fieldcat
        TABLES
          t_outtab                 = gt_alv
        EXCEPTIONS
          program_error            = 1
          OTHERS                   = 2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    WHEN p_rd2.
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          i_callback_program       = sy-repid
          i_callback_pf_status_set = 'FRM_SET_STATUS'
          i_callback_user_command  = 'FRM_USER_COMMAND'
          is_layout_lvc            = gs_layout
          it_fieldcat_lvc          = gt_fieldcat
        TABLES
          t_outtab                 = gt_alv2
        EXCEPTIONS
          program_error            = 1
          OTHERS                   = 2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_status  USING rt_extab TYPE slis_t_extab.
  DATA ls_alv    TYPE ty_input.
  DATA ls_extab  LIKE LINE OF rt_extab.

*当有错误时,隐藏创建客户按钮
  READ TABLE gt_alv  INTO ls_alv WITH  KEY  icon = icon_red_light.
  IF sy-subrc = 0.
    ls_extab-fcode = 'CREATE'.
    APPEND ls_extab TO rt_extab.
  ENDIF.

*当有错误时,隐藏创建客户按钮
  READ TABLE gt_alv2  INTO gs_alv2 WITH  KEY  icon = icon_red_light.
  IF sy-subrc = 0.
    ls_extab-fcode = 'CREATE'.
    APPEND ls_extab TO rt_extab.
  ENDIF.

  SET PF-STATUS 'STATUS_1000' EXCLUDING rt_extab..

ENDFORM.

FORM top_of_page USING cl_dd TYPE REF TO cl_dd_document.
  DATA:
    lv_lines TYPE i,
    lv_buff  TYPE sdydo_text_element,
    lv_sline TYPE string.

  CLEAR: lv_buff,lv_lines.
  DESCRIBE TABLE gt_alv LINES lv_lines.
  lv_sline =  lv_lines.
  CONCATENATE  '条数,共:'  lv_sline  '条'  INTO lv_buff.  " 居中  <H1>设置字体格式

  CALL METHOD cl_dd->add_text
    EXPORTING
      text      = lv_buff
      sap_style = 'KEY'.
ENDFORM.                    "TOP_OF_PAGE

*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_user_command USING  r_ucomm     LIKE sy-ucomm
                             rs_selfield TYPE slis_selfield.


  DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
  DATA ls_alv TYPE ty_input.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.                    " 获取全局变量

  CASE r_ucomm.
    WHEN 'CREATE'.
      CASE 'X'.
        WHEN p_rd1.
*     检查税号是否存在(防止创建后,再次点击创建按钮)
          PERFORM frm_check_data_post.

          IF gt_tax_post[] IS NOT INITIAL.
            MESSAGE '税号已存在' TYPE 'E'.
          ELSE.
            "创建客户数据
*           PERFORM FRM_CALL_BAPI.
            PERFORM frm_call_bapi_cvi_ei.
          ENDIF.
        WHEN p_rd2.
          PERFORM frm_call_bapi_cvi_cms.
        WHEN OTHERS.
      ENDCASE.

  ENDCASE.

  "刷新ALV
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.                    " 获取全局变量

  CALL METHOD ref_grid->check_changed_data. " 获取响应事件
  rs_selfield-refresh = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_call_bapi_cvi_ei
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_bapi_cvi_ei .
  DATA : lv_bpartnerguid TYPE bu_partner_guid_bapi.
  DATA : lt_data   TYPE  cvis_ei_extern_t,
         ls_data   TYPE  cvis_ei_extern,
         lt_return TYPE  bapiretm,
         ls_return TYPE  bapireti,
         ls_msg    TYPE bapiretc.
  DATA : lv_msg TYPE string.
  DATA : ls_partner	 TYPE bus_ei_extern,
         ls_customer TYPE cmds_ei_extern.
  DATA : lt_roles         TYPE bus_ei_bupa_roles_t,
         ls_roles         TYPE bus_ei_bupa_roles,
         lt_banks         TYPE bus_ei_bupa_bankdetail_t,
         ls_banks         TYPE bus_ei_bupa_bankdetail,
         lt_taxs          TYPE bus_ei_bupa_taxnumber_t,
         ls_taxs          TYPE bus_ei_bupa_taxnumber,
         lt_ident_numbers TYPE bus_ei_bupa_identification_t,
         ls_ident_numbers TYPE bus_ei_bupa_identification,
         lt_addresses     TYPE bus_ei_bupa_address_t,
         ls_addresses     TYPE bus_ei_bupa_address,
         lt_phone         TYPE bus_ei_bupa_telephone_t,
         ls_phone         TYPE bus_ei_bupa_telephone,
         lt_fax           TYPE bus_ei_bupa_fax_t,
         ls_fax           TYPE bus_ei_bupa_fax,
         lt_smtp          TYPE bus_ei_bupa_smtp_t,
         ls_smtp          TYPE bus_ei_bupa_smtp,
         ls_central       TYPE cmds_ei_cmd_central,
         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_functions     TYPE cmds_ei_functions_t,
         ls_functions     TYPE cmds_ei_functions,
         lt_texts         TYPE cvis_ei_text_t,
         ls_texts         TYPE cvis_ei_text,
         lt_tab           TYPE tline_tab,
         ls_tab           TYPE tline,
         lt_tax_ind       TYPE cmds_ei_tax_ind_t,
         ls_tax_ind       TYPE cmds_ei_tax_ind,
         ls_remarks       TYPE bus_ei_bupa_comrem,
         lt_remarks       TYPE bus_ei_bupa_comrem_t.
  DATA : lt_partnerguid_list TYPE bu_partner_guid_t,
         ls_partnerguid_list LIKE LINE OF lt_partnerguid_list.
  DATA : lt_customer_list TYPE cvis_cust_link_t,
         ls_customer_list TYPE cvi_cust_link.
  DATA : ls_header       TYPE cmds_ei_header,
         ls_central_data TYPE cmds_ei_central_data,
         ls_company_data TYPE cmds_ei_cmd_company,
         ls_sales_data   TYPE cmds_ei_cmd_sales.


  CONSTANTS: gc_insert TYPE c VALUE 'I',
             gc_update TYPE c VALUE 'U',
             gc_modify TYPE c VALUE 'M',
             gc_DELETE TYPE c VALUE 'D'.
  DATA: lv_task TYPE c.
  DATA: lv_object_task TYPE c.
  DATA: lv_functions_task TYPE c.

  DATA: lv_guid TYPE but000-partner_guid.


  LOOP AT gt_alv INTO gs_alv WHERE box = 'X'.

    CLEAR:lt_data,lt_return,lt_partnerguid_list,lt_customer_list.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = gs_alv-bu_partner
      IMPORTING
        output = gs_alv-bu_partner.


    IF gs_alv-zgxbs = 'X'.
      lv_object_task = gc_update.
      lv_task = gc_modify.
      lv_functions_task = gc_modify.

      "查业务伙伴是否存在
      CLEAR lv_guid.
      SELECT SINGLE partner_guid INTO lv_guid
              FROM but000 WHERE partner = gs_alv-bu_partner.
      lv_bpartnerguid = lv_guid.

    ELSE.
      lv_object_task = gc_insert.
      lv_task = gc_insert.
      lv_functions_task = gc_insert.
      TRY .
          CLEAR lv_bpartnerguid.
          lv_bpartnerguid = cl_uuid_factory=>create_system_uuid( )->create_uuid_x16( ).
        CATCH cx_uuid_error.
          "返回消息
      ENDTRY.
    ENDIF.


    CHECK lv_bpartnerguid IS NOT INITIAL.
    CLEAR ls_partner.
    ls_partner-header-object_task = lv_object_task.
    ls_partner-header-object_instance-bpartner = gs_alv-bu_partner.
    ls_partner-header-object_instance-bpartnerguid = lv_bpartnerguid.

****业务合作伙伴数据的中心数据***********************************
    ls_partner-central_data-common-data-bp_control-category = '2'.                 "业务伙伴类别(1代表人员,2代表组织,3代表组)
    ls_partner-central_data-common-data-bp_control-grouping = gs_alv-bu_group.             "业务伙伴分组
    ls_partner-central_data-common-data-bp_centraldata-title_key = '0003'.  "固定值,代表公司
    ls_partner-central_data-common-data-bp_centraldata-searchterm1 = gs_alv-bu_sort1.      "检索项1
    ls_partner-central_data-common-data-bp_centraldata-searchterm2 = gs_alv-bu_sort2.      "检索项2
*    ls_partner-central_data-common-data-bp_centraldata-partnerexternal = gs_alv-bpext.  "外部系统中的业务伙伴编号
    ls_partner-central_data-common-data-bp_organization-name1 = gs_alv-name_org1.      "供应商名称1
    ls_partner-central_data-common-data-bp_organization-name2 = gs_alv-name_org2.      "供应商名称2
*    ls_partner-central_data-common-data-bp_organization-name3 = gs_alv-name_org1+80(40).      "供应商名称3
*    ls_partner-central_data-common-data-bp_organization-name4 = gs_alv-name_org1+120(40).      "供应商名称4
    ls_partner-central_data-common-data-bp_organization-foundationdate = sy-datum."'20170508' "建立日期

    ls_partner-central_data-common-datax-bp_centraldata-title_key = abap_true.
    ls_partner-central_data-common-datax-bp_centraldata-searchterm1 = abap_true.
    ls_partner-central_data-common-datax-bp_centraldata-searchterm2 = abap_true.
    ls_partner-central_data-common-datax-bp_centraldata-partnerexternal = abap_true.
    ls_partner-central_data-common-datax-bp_organization-name1 = abap_true.
    ls_partner-central_data-common-datax-bp_organization-name2 = abap_true.
    ls_partner-central_data-common-datax-bp_organization-name3 = abap_true.
    ls_partner-central_data-common-datax-bp_organization-name4 = abap_true.
    ls_partner-central_data-common-datax-bp_organization-foundationdate = abap_true.

    CLEAR:lt_roles.
    IF gs_alv-partner_role = 'FLCU01'.
      ls_roles-task = lv_task.
      ls_roles-data_key = 'FLCU01'.     "销售角色
      APPEND ls_roles TO lt_roles.
      ls_roles-task = lv_task.
      ls_roles-data_key = 'FLCU00'.     "公司角色
      APPEND ls_roles TO lt_roles.
    ELSEIF gs_alv-partner_role = 'FLCU00'.
      ls_roles-task = lv_task.
      ls_roles-data_key = 'FLCU00'.     "公司角色
      APPEND ls_roles TO lt_roles.
    ENDIF.
    ls_partner-central_data-role-roles = lt_roles.

    CLEAR: lt_banks.
    IF gs_alv-bankn IS NOT INITIAL.
      ls_banks-task = lv_task.
      ls_banks-data-bank_ctry = gs_alv-banks.   "银行国家代码
      ls_banks-data-bank_key = gs_alv-bankl.    "银行代码
      ls_banks-data-bank_acct = gs_alv-bankn.   "银行帐户号码
      ls_banks-data-bank_ref = gs_alv-bkref.   "银行帐户号码
      ls_banks-data-bankaccountname = gs_alv-banka.   "开户行
      ls_banks-datax-bank_ctry = 'X'.
      ls_banks-datax-bank_key = 'X'.
      ls_banks-datax-bank_acct = 'X'.
      ls_banks-datax-bank_ref = 'X'.
      ls_banks-datax-bankaccountname = 'X'.
      APPEND ls_banks TO lt_banks.
      ls_partner-central_data-bankdetail-bankdetails = lt_banks.
    ENDIF.

    CLEAR: lt_taxs.
    IF gs_alv-taxnumxl IS NOT INITIAL.
      ls_taxs-task = lv_task.
      ls_taxs-data_key-taxtype = gs_alv-taxtype.   "CN0 税号类别
      ls_taxs-data_key-taxnumber = gs_alv-taxnumxl.   "增值税登记号
      APPEND ls_taxs TO lt_taxs.
      ls_partner-central_data-taxnumber-taxnumbers = lt_taxs.
    ENDIF.

***地址信息
    CLEAR:lt_remarks,lt_phone,lt_fax,lt_smtp,lt_addresses.
    ls_addresses-task = lv_task.
    ls_addresses-data-postal-data-postl_cod1 = gs_alv-post_code1.      "邮编
    ls_addresses-data-postal-data-city = gs_alv-city.              "城市
    ls_addresses-data-postal-data-street = gs_alv-street1(40).            "街道
    ls_addresses-data-postal-data-str_suppl1 = gs_alv-street1+40(40).            "街道
    ls_addresses-data-postal-data-str_suppl2 = gs_alv-street1+80(40).            "街道
    ls_addresses-data-postal-data-str_suppl3 = gs_alv-street1+120(40).            "街道
    ls_addresses-data-postal-data-location = gs_alv-street1+160(40).            "街道
    ls_addresses-data-postal-data-country = gs_alv-country.             "国家
    ls_addresses-data-postal-data-region = gs_alv-region.             "地区
    ls_addresses-data-postal-data-languiso = gs_alv-langue.                "语言

    ls_addresses-data-postal-datax-postl_cod1 = abap_true.
    ls_addresses-data-postal-datax-city = abap_true.
    ls_addresses-data-postal-datax-street = abap_true.
    ls_addresses-data-postal-datax-country = abap_true.
    ls_addresses-data-postal-datax-region = abap_true.       "地区
    ls_addresses-data-postal-datax-langu_iso = abap_true.        "语言
    ls_addresses-data-postal-datax-str_suppl1 = abap_true.
    ls_addresses-data-postal-datax-str_suppl2 = abap_true.
    ls_addresses-data-postal-datax-str_suppl3 = abap_true.
    ls_addresses-data-postal-datax-location = abap_true.

    "电话1
    CLEAR:ls_phone.
    ls_phone-contact-task = lv_task.
    ls_phone-contact-data-telephone = gs_alv-tel_number.  "电话1
    ls_phone-contact-datax-telephone = abap_true.
*    "电话备注1(联系人)
*    ls_remarks-task = 'I'.
*    ls_remarks-data-langu = sy-langu.
*    ls_remarks-data-comm_notes = gs_alv-remark.
*    ls_remarks-datax-langu = abap_true.
*    ls_remarks-datax-comm_notes = abap_true.
*    APPEND ls_remarks TO lt_remarks.
*    ls_phone-remark-remarks = lt_remarks.
    APPEND ls_phone TO lt_phone.

    "手机1
*    CLEAR:ls_phone.
*    ls_phone-contact-task = 'I'.
*    ls_phone-contact-data-telephone = gs_alv-phone."手机1
*    ls_phone-contact-data-r_3_user = '3'.    "3表示移动电话
*    ls_phone-contact-datax-telephone = abap_true.
*    ls_phone-contact-datax-r_3_user = abap_true.
    "手机备注1(联系人)
*    ls_remarks-task = 'I'.
*    ls_remarks-data-langu = sy-langu.
*    ls_remarks-data-comm_notes = gs_alv-remark.
*    ls_remarks-datax-langu = abap_true.
*    ls_remarks-datax-comm_notes = abap_true.
*    APPEND ls_remarks TO lt_remarks.
*    ls_phone-remark-remarks = lt_remarks.
*    APPEND ls_phone TO lt_phone.
    ls_addresses-data-communication-phone-phone = lt_phone.

    "传真1
*    CLEAR:lt_fax.
*    ls_fax-contact-task = 'I'.
*    ls_fax-contact-data-fax = gs_alv-telfx.     "传真号
*    ls_fax-contact-datax-fax = abap_true.
*    APPEND ls_fax TO lt_fax.
*    ls_addresses-data-communication-fax-fax = lt_fax.

    "邮件1
*    CLEAR:lt_smtp.
*    ls_smtp-contact-task = 'I'.
*    ls_smtp-contact-data-e_mail = gs_alv-email. "邮件
*    ls_smtp-contact-datax-e_mail = abap_true.
*    APPEND ls_smtp TO lt_smtp.
*    ls_addresses-data-communication-smtp-smtp = lt_smtp.
    APPEND ls_addresses TO lt_addresses.
    ls_partner-central_data-address-addresses = lt_addresses.

    CLEAR: ls_phone,lt_phone,ls_remarks,lt_remarks,ls_fax,lt_fax,ls_smtp,lt_smtp.
*    "电话2
*    ls_phone-contact-task = 'I'.
*    ls_phone-contact-data-telephone = gs_alv-tel1.  "电话2
*    ls_phone-contact-datax-telephone = abap_true.
*    "电话备注2(联系人)
*    ls_remarks-task = 'I'.
*    ls_remarks-data-langu = sy-langu.
*    ls_remarks-data-comm_notes = gs_alv-remark1.
*    ls_remarks-datax-langu = abap_true.
*    ls_remarks-datax-comm_notes = abap_true.
*    APPEND ls_remarks TO lt_remarks.
*    ls_phone-remark-remarks = lt_remarks.
*    APPEND ls_phone TO lt_phone.

*    "手机2
*    ls_phone-contact-task = 'I'.
*    ls_phone-contact-data-telephone = gs_alv-phone1."手机1
*    ls_phone-contact-data-r_3_user = '3'.    "3表示移动电话
*    ls_phone-contact-datax-telephone = abap_true.
*    ls_phone-contact-datax-r_3_user = abap_true.
*    "手机备注2(联系人)
*    ls_remarks-task = 'I'.
*    ls_remarks-data-langu = sy-langu.
*    ls_remarks-data-comm_notes = gs_alv-remark1.
*    ls_remarks-datax-langu = abap_true.
*    ls_remarks-datax-comm_notes = abap_true.
*    APPEND ls_remarks TO lt_remarks.
*    ls_phone-remark-remarks = lt_remarks.
*    APPEND ls_phone TO lt_phone.
*
*    "传真2
*    ls_fax-contact-task = 'I'.
*    ls_fax-contact-data-fax = gs_alv-telfx1.     "传真号
*    ls_fax-contact-datax-fax = abap_true.
*    APPEND ls_fax TO lt_fax.
*
*    "邮件2
*    ls_smtp-contact-task = 'I'.
*    ls_smtp-contact-data-e_mail = gs_alv-email1. "邮件
*    ls_smtp-contact-datax-e_mail = abap_true.
*    APPEND ls_smtp TO lt_smtp.
*    ls_partner-central_data-communication-phone-phone = lt_phone.
*    ls_partner-central_data-communication-fax-fax = lt_fax.
*    ls_partner-central_data-communication-smtp-smtp = lt_smtp.



****供应商数据表头**********************************************
    ls_header-object_task = lv_object_task.
    ls_header-object_instance-kunnr = gs_alv-bu_partner.
    ls_customer-header = ls_header.

****中心数据****************************************************
    "数据已经在BP里面录入了,此处不需重复的填写了
    ls_central-data-stcd5 = gs_alv-taxnumxl.  "增值税登记号
    ls_central-datax-stcd5 = abap_true.
    ls_central-data-zzcust_sc = gs_alv-zzcust_sc.  "客户来源
    ls_central-datax-zzcust_sc = abap_true.
    ls_central-data-zzcust_cls = gs_alv-zzcust_cls.  "客户分类
    ls_central-datax-zzcust_cls = abap_true.
    ls_central-data-zzchannel_m = gs_alv-zzchannel_m.  "渠道管理
    ls_central-datax-zzchannel_m = abap_true.
    ls_central-data-zzrelated = gs_alv-zzrelated.  "是否关联方
    ls_central-datax-zzrelated = abap_true.
    ls_central-data-kukla = gs_alv-kukla.  "客户集团
    ls_central-datax-kukla = abap_true.
    ls_central-data-bran1 = gs_alv-bran1.  "二级公司
    ls_central-datax-bran1 = abap_true.
    ls_central-data-bahne = gs_alv-bahne.  "组织机构代码
    ls_central-datax-bahne = abap_true.
    ls_central_data-central = ls_central.
    ls_customer-central_data = ls_central_data.
    IF gs_alv-taxkd IS NOT INITIAL.
      ls_customer-central_data-tax_ind-tax_ind = VALUE cmds_ei_cmd_tax_ind-tax_ind( (
        task = 'M'
        data_key-aland = gs_alv-country
        data_key-tatyp = 'MWST'
        data-taxkd =   gs_alv-taxkd  " 客户税分类
        datax-taxkd =   'X'          " 客户税分类
        ) ).
    ENDIF.

****公司代码数据************************************************
    "---------ADD BY WENJ-------------
    IF gs_alv-bukrs IS NOT INITIAL.
      "---------ADD BY WENJ-------------

      CLEAR:lt_company.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'   " 统驭科目补零
        EXPORTING
          input  = gs_alv-akont
        IMPORTING
          output = gs_alv-akont.
      ls_company-task = lv_task.
      ls_company-data_key-bukrs = gs_alv-bukrs.     "公司代码
      ls_company-data-akont =  gs_alv-akont.  "统驭科目
      ls_company-data-zuawa = gs_alv-zuawa.             "排序码
      ls_company-data-zterm = gs_alv-zterm.         "付款条件
      ls_company-data-togru = gs_alv-togru.         "容差组
*    ls_company-data-zwels = gs_alv-zwels.         "付款条件
*    ls_company-data-reprf = gs_alv-reprf.             "检查重复发票
      ls_company-datax-akont = abap_true.
      ls_company-datax-zuawa = abap_true.
      ls_company-datax-zterm = abap_true.
      ls_company-datax-togru = abap_true.
*    ls_company-datax-reprf = abap_true.
*    ls_company-datax-zwels = abap_true.
      APPEND ls_company TO lt_company.

      ls_company_data-company = lt_company.
      ls_customer-company_data = ls_company_data.
    ENDIF.

****销售数据****************************************************
    "---------ADD BY WENJ-------------
    IF  gs_alv-vkorg IS NOT INITIAL
                AND gs_alv-vtweg IS NOT INITIAL
                AND gs_alv-spart IS NOT INITIAL.
      "---------ADD BY WENJ-------------

      IF gs_alv-partner_role = 'FLCU01'.
        CLEAR:lt_functions,lt_sales.
        CLEAR ls_sales.
        ls_sales-task = lv_task.
        ls_sales-data_key-vkorg = gs_alv-vkorg.  "销售组织
        ls_sales-data_key-vtweg = gs_alv-vtweg.  "分销渠道
        ls_sales-data_key-spart = gs_alv-spart.  "产品组
        ls_sales-data-bzirk = gs_alv-bzirk.       "销售区域
        ls_sales-data-vkbur = gs_alv-vkbur.         "销售部门
        "---------ADD BY WENJ-------------
        ls_sales-data-vkgrp = gs_alv-vkgrp.         "销售组
        "---------ADD BY WENJ-------------
        ls_sales-data-zterm = gs_alv-zterm2.      "销售付款条件
        ls_sales-data-waers = gs_alv-waers.         "币种
        ls_sales-data-konda = gs_alv-konda.         "价格组
        ls_sales-data-kalks = gs_alv-kalks.         "定价过程
        ls_sales-data-vwerk = gs_alv-vwerk.         "交货工厂
        ls_sales-data-vsbed = gs_alv-vsbed.         "装运条件
        ls_sales-data-ktgrd = gs_alv-ktgrd.         "客户分配账户组别
        "---------ADD BY WENJ-------------
        ls_sales-data-podkz = gs_alv-podkz.         "POD-相关的
        "---------ADD BY WENJ-------------
        ls_sales-datax-bzirk = abap_true.
        ls_sales-datax-vkbur = abap_true.
        "---------ADD BY WENJ-------------
        ls_sales-datax-vkgrp = abap_true.
        "---------ADD BY WENJ-------------
        ls_sales-datax-zterm = abap_true.
        "---------ADD BY WENJ-------------
        IF gs_alv-waers IS NOT INITIAL.
          "---------ADD BY WENJ-------------
          ls_sales-datax-waers = abap_true.
        ENDIF.
        ls_sales-datax-konda = abap_true.
        IF gs_alv-kalks IS NOT INITIAL.
          ls_sales-datax-kalks = abap_true.
        ENDIF.
        ls_sales-datax-vwerk = abap_true.
        ls_sales-datax-vsbed = abap_true.
        IF gs_alv-ktgrd IS NOT INITIAL.
          ls_sales-datax-ktgrd = abap_true.
        ENDIF.
        "---------ADD BY WENJ-------------
        ls_sales-datax-podkz = abap_true.
        "---------ADD BY WENJ-------------

      ENDIF.

      "Function伙伴功能
      CLEAR ls_functions.
      ls_functions-task = lv_functions_task.
      CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
        EXPORTING
          input  = c_parvw1  "SP  售达方
        IMPORTING
          output = ls_functions-data_key-parvw.
      APPEND ls_functions TO lt_functions.

      CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
        EXPORTING
          input  = c_parvw2 "BP	收票方
        IMPORTING
          output = ls_functions-data_key-parvw.
      APPEND ls_functions TO lt_functions.

      CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
        EXPORTING
          input  = c_parvw3 "PY	付款方
        IMPORTING
          output = ls_functions-data_key-parvw.
      APPEND ls_functions TO lt_functions.

      CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
        EXPORTING
          input  = c_parvw4 "SH	送达方
        IMPORTING
          output = ls_functions-data_key-parvw.
      APPEND ls_functions TO lt_functions.

*      Z1	业务员
*      Z2	物流商
*      Z3	商米客户层次
      IF gs_alv-parvw IS NOT INITIAL.
        IF gs_alv-parvw = 'Z1'.
          SELECT SINGLE
            knvp~lifnr
            FROM knvp
            INTO @DATA(lv_lifnr)
            WHERE
              kunnr = @gs_alv-bu_partner AND
              vkorg = @gs_alv-vkorg AND
              vtweg = @gs_alv-vtweg AND
              spart = @gs_alv-spart AND
              parvw = @gs_alv-parvw AND
              parza = 0.
          IF lv_lifnr IS NOT INITIAL.
            ls_functions-task = gc_DELETE.
            CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
              EXPORTING
                input  = gs_alv-parvw
              IMPORTING
                output = ls_functions-data_key-parvw.
            ls_functions-data_key-parza = 0.
            ls_functions-data-partner = lv_lifnr.
            APPEND ls_functions TO lt_functions.
          ENDIF.
        ENDIF.
        ls_functions-task = gc_modify.
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = gs_alv-parvw
          IMPORTING
            output = ls_functions-data_key-parvw.
        ls_functions-data_key-parza = 0.
        ls_functions-data-partner = gs_alv-xsy.
        APPEND ls_functions TO lt_functions.
      ENDIF.
      ls_sales-functions-functions = lt_functions.

*text文本
*      CLEAR:lt_tab,lt_texts.
*      ls_texts-task = 'I'.
*      ls_texts-data_key-langu = sy-langu.
*      ls_texts-data_key-text_id = '0002'.
*      ls_tab-tdline = gs_alv-ltext.
*      APPEND ls_tab TO lt_tab.
*      ls_texts-data = lt_tab.
*      APPEND ls_texts TO lt_texts.
*      ls_sales-texts-texts = lt_texts.

      APPEND ls_sales TO lt_sales.
      ls_sales_data-sales = lt_sales.
      ls_customer-sales_data = ls_sales_data.
    ENDIF.

    ls_data-partner = ls_partner.
    ls_data-customer = ls_customer.
    APPEND ls_data TO lt_data.

    CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
      EXPORTING
        i_data   = lt_data
*       I_EXT_DATA       =
      IMPORTING
        e_return = lt_return.

    CLEAR lv_msg.
    LOOP AT lt_return INTO ls_return.
      LOOP AT ls_return-object_msg INTO ls_msg WHERE type = 'E' OR type = 'A'.
        CONCATENATE lv_msg ls_msg-message INTO lv_msg.
      ENDLOOP.
    ENDLOOP.

    IF lv_msg IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.

* 根据伙伴GUID取出供应商编号
      ls_partnerguid_list = ls_partner-header-object_instance-bpartnerguid.
      APPEND ls_partnerguid_list TO lt_partnerguid_list.
      lt_customer_list = cvi_mapper=>get_instance( )->get_assigned_customers_for_bps(
                                                i_partner_guids = lt_partnerguid_list ).
      IF lt_customer_list IS NOT INITIAL.
        READ TABLE lt_customer_list INTO ls_customer_list INDEX 1 .
        IF sy-subrc EQ 0.
          CONCATENATE '客户' ls_customer_list-customer '创建成功!' INTO gs_alv-message.
          gs_alv-icon = icon_green_light.

          PERFORM frm_add_comp_head USING gs_alv-bu_partner gs_alv.
        ENDIF.
      ELSE.
        "可能创建成功了BP,但未创建成功Vendor
        DATA : ls_cvis_error TYPE cvis_error.
        ls_cvis_error = cvi_mapper=>get_instance( )->undo_assignments(
                                                i_for_partners = lt_partnerguid_list ).
        gs_alv-message = '供应商创建出错,供应商部分数据出错,请检查是否是BP伙伴功能问题'.
        gs_alv-icon = icon_red_light.
      ENDIF.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      gs_alv-message = lv_msg.
      gs_alv-icon = icon_red_light.
    ENDIF.
    MODIFY gt_alv FROM gs_alv.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_call_bapi_cvi_cms
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_bapi_cvi_cms .
  DATA : lv_bpartnerguid TYPE bu_partner_guid_bapi.
  DATA : lt_data   TYPE  cvis_ei_extern_t,
         ls_data   TYPE  cvis_ei_extern,
         lt_return TYPE  bapiretm,
         ls_return TYPE  bapireti,
         ls_msg    TYPE bapiretc.
  DATA : lv_msg TYPE string.
  DATA : ls_partner	 TYPE bus_ei_extern,
         ls_customer TYPE cmds_ei_extern.
  DATA : lt_roles         TYPE bus_ei_bupa_roles_t,
         ls_roles         TYPE bus_ei_bupa_roles,
         lt_banks         TYPE bus_ei_bupa_bankdetail_t,
         ls_banks         TYPE bus_ei_bupa_bankdetail,
         lt_taxs          TYPE bus_ei_bupa_taxnumber_t,
         ls_taxs          TYPE bus_ei_bupa_taxnumber,
         lt_ident_numbers TYPE bus_ei_bupa_identification_t,
         ls_ident_numbers TYPE bus_ei_bupa_identification,
         lt_addresses     TYPE bus_ei_bupa_address_t,
         ls_addresses     TYPE bus_ei_bupa_address,
         lt_phone         TYPE bus_ei_bupa_telephone_t,
         ls_phone         TYPE bus_ei_bupa_telephone,
         lt_fax           TYPE bus_ei_bupa_fax_t,
         ls_fax           TYPE bus_ei_bupa_fax,
         lt_smtp          TYPE bus_ei_bupa_smtp_t,
         ls_smtp          TYPE bus_ei_bupa_smtp,
         ls_central       TYPE cmds_ei_cmd_central,
         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_functions     TYPE cmds_ei_functions_t,
         ls_functions     TYPE cmds_ei_functions,
         lt_texts         TYPE cvis_ei_text_t,
         ls_texts         TYPE cvis_ei_text,
         lt_tab           TYPE tline_tab,
         ls_tab           TYPE tline,
         lt_tax_ind       TYPE cmds_ei_tax_ind_t,
         ls_tax_ind       TYPE cmds_ei_tax_ind,
         ls_remarks       TYPE bus_ei_bupa_comrem,
         lt_remarks       TYPE bus_ei_bupa_comrem_t.
  DATA : lt_partnerguid_list TYPE bu_partner_guid_t,
         ls_partnerguid_list LIKE LINE OF lt_partnerguid_list.
  DATA : lt_customer_list TYPE cvis_cust_link_t,
         ls_customer_list TYPE cvi_cust_link.
  DATA : ls_header       TYPE cmds_ei_header,
         ls_central_data TYPE cmds_ei_central_data,
         ls_company_data TYPE cmds_ei_cmd_company,
         ls_sales_data   TYPE cmds_ei_cmd_sales.
  DATA : ls_cms_profile  TYPE ukm_ei_bp_cms,
         lt_cms_segments TYPE ukmt_ei_bp_cms_sgm,
         ls_cms_segments TYPE ukm_ei_bp_cms_sgm.

  LOOP AT gt_alv2 INTO gs_alv2 WHERE box = 'X'.
    CLEAR:lt_data,lt_return,lt_partnerguid_list,lt_customer_list.
    CHECK gs_alv2-partner_guid IS NOT INITIAL.
    CLEAR ls_partner.
    ls_partner-header-object_task = 'M'.
    ls_partner-header-object_instance-bpartner = gs_alv2-bu_partner.
    ls_partner-header-object_instance-bpartnerguid = gs_alv2-partner_guid.

***角色
    CLEAR:lt_roles.
    IF gs_alv2-role_exist <> 'X'.
      ls_roles-task = 'I'.
      ls_roles-data_key = gs_alv2-partner_role.     "信贷角色
      APPEND ls_roles TO lt_roles.
      ls_partner-central_data-role-roles = lt_roles.
    ENDIF.

***信贷
    CLEAR ls_cms_profile.
    ls_cms_profile-data-limit_rule = gs_alv2-limit_rule.  " 规则
    ls_cms_profile-data-risk_class = gs_alv2-risk_class.  " 风险类
    ls_cms_profile-data-check_rule = gs_alv2-check_rule.  " 检查规则
    ls_cms_profile-data-credit_group = gs_alv2-credit_group.  " 信用组
    ls_cms_profile-datax-limit_rule = abap_true.
    ls_cms_profile-datax-risk_class = abap_true.
    ls_cms_profile-datax-check_rule = abap_true.
    ls_cms_profile-datax-credit_group = abap_true.
    ls_partner-ukmbp_data-profile = ls_cms_profile.

    CLEAR lt_cms_segments.
    CLEAR ls_cms_segments.
    IF gs_alv2-sgmnt_exist = 'X'.
      ls_cms_segments-task = 'M'.
    ELSE.
      ls_cms_segments-task = 'I'.
    ENDIF.
    ls_cms_segments-data_key-partner = gs_alv2-bu_partner.
    ls_cms_segments-data_key-credit_sgmnt = gs_alv2-credit_sgmnt.
    ls_cms_segments-data-credit_limit = gs_alv2-credit_limit.
    ls_cms_segments-data-limit_valid_date = gs_alv2-limit_valid_date.
    ls_cms_segments-datax-credit_limit = abap_true.
    ls_cms_segments-datax-limit_valid_date = abap_true.
    APPEND ls_cms_segments TO lt_cms_segments.
    ls_partner-ukmbp_data-segments-segments = lt_cms_segments.

    ls_data-partner = ls_partner.
    APPEND ls_data TO lt_data.

    CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
      EXPORTING
        i_data   = lt_data
*       I_EXT_DATA       =
      IMPORTING
        e_return = lt_return.

    CLEAR lv_msg.
    LOOP AT lt_return INTO ls_return.
      LOOP AT ls_return-object_msg INTO ls_msg WHERE type = 'E' OR type = 'A'.
        CONCATENATE lv_msg ls_msg-message INTO lv_msg.
      ENDLOOP.
    ENDLOOP.

    IF lv_msg IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.
      CONCATENATE '客户' gs_alv2-bu_partner '信贷批导成功!' INTO gs_alv2-message.
      gs_alv2-icon = icon_green_light.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      gs_alv2-message = lv_msg.
      gs_alv2-icon = icon_red_light.
    ENDIF.
    MODIFY gt_alv2 FROM gs_alv2.
    IF gs_alv2-icon = icon_green_light.
      gs_alv2-role_exist = 'X'.
      MODIFY gt_alv2 FROM gs_alv2 TRANSPORTING role_exist WHERE bu_partner = gs_alv2-bu_partner
                                                            AND partner_role = gs_alv2-partner_role.
      gs_alv2-sgmnt_exist =  'X'.
      MODIFY gt_alv2 FROM gs_alv2 TRANSPORTING sgmnt_exist WHERE bu_partner = gs_alv2-bu_partner
                                                            AND credit_sgmnt = gs_alv2-credit_sgmnt.
    ENDIF.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CALL_BAPI
*&---------------------------------------------------------------------*
*& 创建客户数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_bapi .
  DATA:lv_partner      LIKE bapibus1006_head-bpartner.  "业务伙伴编号

  DATA lv_flg TYPE char1.
  LOOP AT gt_alv INTO gs_alv WHERE box = 'X'.

*   创建合作伙伴主体数据
    PERFORM frm_create_partner USING gs_alv CHANGING lv_partner  lv_flg.

*   主数据创建失败,不允许继续创建
    IF lv_flg = 'X'.
      CLEAR lv_flg.
      CONTINUE.
    ELSE.

      IF lv_partner IS NOT INITIAL.

*       添加合作伙伴角色
        PERFORM frm_add_role USING lv_partner  gs_alv lv_flg.

*        伙伴角色创建失败,不允许继续创建对应角色下的数据
        IF lv_flg = 'X'.
          CLEAR lv_flg.
          CONTINUE.
        ENDIF.

*       添加税
        PERFORM frm_add_tax USING lv_partner  gs_alv.

*       添加银行信息
        PERFORM frm_add_bank USING lv_partner  gs_alv.

*       添加客户身份证号(原字段注册办事处)
        PERFORM frm_add_comp_head USING lv_partner  gs_alv.

*       调用CMD_EI_API,添加外部客户
        PERFORM f_call_cmd_api USING lv_partner gs_alv.
      ENDIF.
      gs_alv-bu_partner = lv_partner.
      MODIFY gt_alv FROM gs_alv.

    ENDIF.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_PARTNER
*&---------------------------------------------------------------------*
*& 创建合作伙伴主体数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_partner USING ls_gs_alv STRUCTURE gs_alv
                         CHANGING lv_businesspartner   lv_flg TYPE char1.

  DATA:lv_businesspartnerextern   TYPE bapibus1006_head-bpartner,
       lv_partnercategory         TYPE bapibus1006_head-partn_cat,
       lv_partnergroup            TYPE bapibus1006_head-partn_grp,
       ls_centraldata             TYPE bapibus1006_central,
       ls_centraldataorganization TYPE bapibus1006_central_organ,
       ls_addressdata             TYPE bapibus1006_address.


  DATA:lt_telefondata  TYPE STANDARD TABLE OF bapiadtel,
       ls_telefondata  TYPE bapiadtel,
       lt_addressnotes TYPE STANDARD TABLE OF bapiad_rem,
       ls_addressnotes TYPE bapiad_rem,
       lt_return       TYPE STANDARD TABLE OF bapiret2,
       ls_return       TYPE bapiret2.


  " 外部客户号:如果您需要在外部分配号码,您可以在创建业务伙伴时提供号码,在内部号码分配的情况下,您将此参数留空。
  lv_businesspartnerextern = ls_gs_alv-bu_partner.
  " 业务伙伴类别(1代表人员,2代表组织,3代表组)
  lv_partnercategory = '2'.
  " 业务伙伴分组:创建业务伙伴时,在“分组”字段中输入的内容决定业务伙伴号码字段是否以及如何填写数据。
  lv_partnergroup = ls_gs_alv-bu_group.

*&--检索项信息
  " 搜索项1
  ls_centraldata-searchterm1 = ls_gs_alv-bu_sort1.
  " 搜索项2
  ls_centraldata-searchterm2 = ls_gs_alv-bu_sort2.

  " 外部业务伙伴编号
*  LS_CENTRALDATA-PARTNEREXTERNAL = LS_GS_ALV-BPEXT.
*&--名称信息
  "名称1
  ls_centraldataorganization-name1 = ls_gs_alv-name_org1.
*  "名称2
  ls_centraldataorganization-name2 = ls_gs_alv-name_org2.
*  "名称3
*  LS_CENTRALDATAORGANIZATION-NAME3 = LS_GS_ALV-NAME_ORG3.
*  "名称4
*  LS_CENTRALDATAORGANIZATION-NAME4 = LS_GS_ALV-NAME_ORG4.
*&--标准地址
  " 邮政编码
  ls_addressdata-postl_cod1 = ls_gs_alv-post_code1.
  " 城市
  ls_addressdata-city = ls_gs_alv-city.
  " 国家
  ls_addressdata-country = ls_gs_alv-country.
  " 省份/地区
  ls_addressdata-region  = ls_gs_alv-region.
  " 街道1
  ls_addressdata-street = ls_gs_alv-street1.
  " 街道2
*  LS_ADDRESSDATA-STR_SUPPL1 = LS_GS_ALV-STREET2.
  "语言代码
  ls_addressdata-langu      =  ls_gs_alv-langu.
*&--通信
  "语言代码
  ls_addressnotes-langu      =  ls_gs_alv-langu.
  " 地址注释
*  LS_ADDRESSNOTES-ADR_NOTES = LS_GS_ALV-REMARK.
  APPEND  ls_addressnotes TO lt_addressnotes.

  ls_telefondata-telephone    =  ls_gs_alv-tel_number. "电话号码: 拨区号 + 号码

  APPEND  ls_telefondata  TO lt_telefondata.

*  创建BP基本数据
  CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA'
    EXPORTING
      businesspartnerextern   = lv_businesspartnerextern
      partnercategory         = lv_partnercategory
      partnergroup            = lv_partnergroup
      centraldata             = ls_centraldata
      centraldataorganization = ls_centraldataorganization
      addressdata             = ls_addressdata
    IMPORTING
      businesspartner         = lv_businesspartner
    TABLES
      telefondata             = lt_telefondata
*     FAXDATA                 =
*     TELETEXDATA             =
*     TELEXDATA               =
*     E_MAILDATA              = E_MAILDATA
      addressnotes            = lt_addressnotes
      return                  = lt_return
*     ADDRESSDUPLICATES       =
    .
  CLEAR lv_flg .
  READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    gs_alv-icon = icon_red_light.
    gs_alv-message = ls_return-message.
    MODIFY gt_alv FROM gs_alv.
    lv_flg = 'X'.

  ELSE.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.
  CLEAR:
  lv_businesspartnerextern,
  lv_partnercategory,
  lv_partnergroup,
  ls_centraldata,
  ls_centraldataorganization,
  ls_addressdata,
  ls_addressnotes,
  lt_addressnotes,
  ls_return,
  lt_return.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_ROLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_add_role USING lv_partner
                          ls_gs_alv STRUCTURE gs_alv  lv_flg TYPE char1.
  DATA:lt_return    TYPE STANDARD TABLE OF bapiret2.
  DATA lt_tb003i    TYPE STANDARD TABLE OF tb003i.
  DATA ls_tb003i    TYPE tb003i.

  CLEAR:lt_tb003i[],lv_flg.

* 查询角色视图
  SELECT rltgr
         role
    INTO CORRESPONDING FIELDS OF TABLE lt_tb003i
     FROM tb003i
    WHERE rltgr = 'S_CUST'. "LS_GS_ALV-PARTNER_ROLE.

  SORT lt_tb003i.
  DELETE ADJACENT DUPLICATES FROM lt_tb003i COMPARING ALL FIELDS.

  LOOP AT lt_tb003i INTO ls_tb003i.
    CALL FUNCTION 'BAPI_BUPA_ROLE_ADD'
      EXPORTING
        businesspartner     = lv_partner
        businesspartnerrole = ls_tb003i-role   "财务视图
      TABLES
        return              = lt_return.

    READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      lv_flg = 'X'.
      EXIT.
    ENDIF.
    CLEAR ls_tb003i.
  ENDLOOP.

  IF lv_flg = 'X'.
    gs_alv-icon = icon_red_light.
    gs_alv-message = '角色添加失败'.
    MODIFY gt_alv FROM gs_alv.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

*
*  CALL FUNCTION 'BAPI_BUPA_ROLE_ADD'
*    EXPORTING
*      BUSINESSPARTNER     = LV_PARTNER
*      BUSINESSPARTNERROLE = 'ZFLCU0'   "财务视图
**     BUSINESSPARTNERROLE = LS_GS_ALV-PARTNER_ROLE   "客户角色
*    TABLES
*      RETURN              = LT_RETURN.
*
*  CALL FUNCTION 'BAPI_BUPA_ROLE_ADD'
*    EXPORTING
*      BUSINESSPARTNER     = LV_PARTNER
*      BUSINESSPARTNERROLE = 'ZFLCU1'   "销售视图
**     BUSINESSPARTNERROLE = LS_GS_ALV-PARTNER_ROLE   "客户角色
*    TABLES
*      RETURN              = LT_RETURN.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_CALL_CMD_API
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_V_PARTNER  text
*      -->LS_GS_ALV  text
*&---------------------------------------------------------------------*
FORM f_call_cmd_api  USING    lv_partner
                              ls_gs_alv STRUCTURE gs_alv.
  DATA:ls_master_data           TYPE cmds_ei_main,
       ls_extern                TYPE cmds_ei_extern,
       ls_master_data_correct   TYPE cmds_ei_main,
       ls_message_correct       TYPE cvis_message,
       ls_master_data_defective TYPE cmds_ei_main,
       ls_message_defective     TYPE cvis_message,
       ls_return                TYPE bapiret2.
  DATA:ls_cvi_cust_link         TYPE cvi_cust_link.

  CLEAR:ls_master_data ,ls_extern .

*&--1.1外部接口:客户数据表头
  ls_extern-header-object_instance-kunnr = lv_partner.
  ls_extern-header-object_task   = 'M' .            "I 创建 ;U 更改 ;M 创建/更改 ;C  当前状态
***************************************

*&--1.2外部界面:中心数据
  PERFORM frm_prepare_partner USING gs_alv   CHANGING ls_extern .


  IF gs_alv-bukrs IS NOT INITIAL.
*&--1.3外部接口:公司代码数据
    PERFORM frm_prepare_bukrs USING gs_alv CHANGING ls_extern .

    IF gs_alv-vkorg IS NOT INITIAL.
*&--1.4外部接口:销售数据
      PERFORM frm_prepare_vkorg USING lv_partner gs_alv CHANGING ls_extern .
    ENDIF.
*&--添加数据进入LS_MASTER_DATA-CUSTOMERS内表中
    APPEND ls_extern TO ls_master_data-customers .

  ENDIF.
*   Initialize all the data
  cmd_ei_api=>initialize( ).

  CALL METHOD cmd_ei_api=>maintain_bapi
    EXPORTING
      iv_test_run              = space
      iv_collect_messages      = 'X'
      is_master_data           = ls_master_data
    IMPORTING
      es_master_data_correct   = ls_master_data_correct      "LO_CMDS_CORRECT
      es_message_correct       = ls_message_correct         "LO_CVIS_MSG_CORRECT
      es_master_data_defective = ls_master_data_defective   "LO_CMDS
      es_message_defective     = ls_message_defective.      "LO_CVIS_MSG_ERROR.

  IF ls_message_defective-is_error IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    SELECT SINGLE * INTO  ls_cvi_cust_link FROM cvi_cust_link WHERE customer = lv_partner.
    IF sy-subrc = 0.
      gs_alv-icon = icon_green_light.
      CONCATENATE '创建成功,客户编号为:' lv_partner INTO gs_alv-message.
      MODIFY gt_alv FROM gs_alv.
    ENDIF.

  ELSE.
    gs_alv-icon = icon_red_light.
    LOOP AT ls_message_defective-messages INTO ls_return WHERE type = 'E'.
      CONCATENATE ls_return-message gs_alv-message INTO gs_alv-message.
    ENDLOOP.
    MODIFY gt_alv FROM gs_alv.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PREPARE_PARTNER
*&---------------------------------------------------------------------*
*& 外部界面:中心数据
*&---------------------------------------------------------------------*
*      -->LS_GS_ALV  text
*      <--P_L_EXTERN  text
*&---------------------------------------------------------------------*
FORM frm_prepare_partner    USING ls_gs_alv STRUCTURE gs_alv
                         CHANGING ls_extern TYPE cmds_ei_extern.

  DATA:ls_tbd001 TYPE tbd001.

*&--外部接口:中心客户数据
  " 需要获取账户组
  CLEAR ls_tbd001.
  SELECT SINGLE * INTO ls_tbd001 FROM tbd001 WHERE bu_group = ls_gs_alv-bu_group.

  ls_extern-central_data-central-data-ktokd =  ls_tbd001-ktokd . "客户账户组
  ls_extern-central_data-central-datax-ktokd = 'X' .


  ls_extern-central_data-central-data-kukla =  ls_gs_alv-kukla . "客户集团
  ls_extern-central_data-central-datax-kukla = 'X' .

  ls_extern-central_data-central-data-bran1 =  ls_gs_alv-bran1 . "二级公司
  ls_extern-central_data-central-datax-bran1 = 'X' .

  ls_extern-central_data-central-data-bahne =  ls_gs_alv-bahne . "组织机构代码
  ls_extern-central_data-central-datax-bahne = 'X' .


*&--外部接口:税收标识
  ls_extern-central_data-tax_ind-tax_ind = VALUE cmds_ei_cmd_tax_ind-tax_ind( (
  task = 'M'
  data_key-aland = gs_alv-country
  data_key-tatyp = 'MWST'
  data-taxkd =   gs_alv-taxkd  " 客户税分类
  datax-taxkd =   'X'          " 客户税分类
  ) ).
*&----外部接口:组织地址
  ls_extern-central_data-address-postal-data-name        = gs_alv-name_org1  . " 名称1
  ls_extern-central_data-address-postal-data-name_2      = gs_alv-name_org2  . " 名称2
  ls_extern-central_data-address-postal-data-sort1       = gs_alv-bu_sort1   . " 搜索项1
  ls_extern-central_data-address-postal-data-sort2       = gs_alv-bu_sort2   . " 搜索项2
  ls_extern-central_data-address-postal-data-city        = gs_alv-city.        " 城市
  ls_extern-central_data-address-postal-data-postl_cod1  = gs_alv-post_code1.  "邮政编码
  ls_extern-central_data-address-postal-data-country     = gs_alv-country.     "国家
  ls_extern-central_data-address-postal-data-countryiso  = gs_alv-country.     "国家的ISO代码
  ls_extern-central_data-address-postal-data-street      = gs_alv-street1.     "街道1
*  LS_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-STREET_NO  = GS_ALV-STREET2.      街道2
  ls_extern-central_data-address-postal-data-langu       = gs_alv-langu.       "语言 (1)
*  LS_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATA-ADDR_VERS = 'C'.                 " 国际地址的版本标识

  ls_extern-central_data-address-postal-datax-name          = 'X'   .
  ls_extern-central_data-address-postal-datax-name_2        = 'X'   .
  ls_extern-central_data-address-postal-datax-sort1         = 'X'   .
  ls_extern-central_data-address-postal-datax-sort2         = 'X'   .
  ls_extern-central_data-address-postal-datax-city          = 'X'   .
  ls_extern-central_data-address-postal-datax-postl_cod1    = 'X'   .
  ls_extern-central_data-address-postal-datax-country       = 'X'   .
  ls_extern-central_data-address-postal-datax-countryiso    = 'X'   .
  ls_extern-central_data-address-postal-datax-street        = 'X'   .
*  LS_EXTERN-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-STREET_NO    = 'X'   .
  ls_extern-central_data-address-postal-datax-langu         = 'X'   .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PREPARE_BUKRS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->LS_GS_ALV  text
*      <--P_L_EXTERN  text
*&---------------------------------------------------------------------*
FORM frm_prepare_bukrs  USING    ls_gs_alv STRUCTURE gs_alv
                        CHANGING ls_extern TYPE cmds_ei_extern.

  DATA:ls_company TYPE cmds_ei_company.
  DATA:ls_texts TYPE cvis_ei_cvis_text.
  DATA:lt_text TYPE STANDARD TABLE OF cvis_ei_text,
       ls_text TYPE cvis_ei_text.
  DATA:lt_data TYPE STANDARD TABLE OF tline,
       ls_data TYPE tline.

*&--外部接口:公司代码数据
  ls_text-task = 'M'.
  ls_text-data_key-text_id = '0001'. "文本 ID
  ls_text-data_key-langu =  ls_gs_alv-langu. "语言 1
  ls_text-data_key-languiso = ''.
  ls_data-tdformat = ''.
*  LS_DATA-TDLINE = GS_ALV-TEXT.

  APPEND ls_data TO lt_data.
  ls_text-data = lt_data.
  APPEND ls_text TO lt_text.
  ls_texts-texts = lt_text.

  ls_company-texts = ls_texts.
  ls_company-task = 'I'.
  ls_company-data_key-bukrs = gs_alv-bukrs. " 公司代码
*  LS_COMPANY-DATA-SPERR =  'X'.
  ls_company-data-akont = gs_alv-akont.   "统驭科目
  ls_company-data-zterm = gs_alv-zterm.   "付款条款
  ls_company-data-togru = gs_alv-togru.   "容差组
  ls_company-data-zuawa = gs_alv-zuawa.   "排序码
  ls_company-datax-zuawa = 'X'   .        "排序码
  ls_company-datax-akont = 'X'.
  ls_company-datax-zterm = 'X'.
  ls_company-datax-togru = 'X'.
  APPEND ls_company TO ls_extern-company_data-company.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PREPARE_VKORG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LV_PARTNER  text
*      -->LS_GS_ALV  text
*      <--P_L_EXTERN  text
*&---------------------------------------------------------------------*
FORM frm_prepare_vkorg  USING    lv_partner
                                 ls_gs_alv STRUCTURE gs_alv
                        CHANGING ls_extern TYPE cmds_ei_extern.


*&--外部接口:销售数据
  ls_extern-sales_data-sales = VALUE cmds_ei_cmd_sales-sales(
    (

      task = 'I'

      data_key-vkorg = ls_gs_alv-vkorg "销售组织
      data_key-vtweg = ls_gs_alv-vtweg "分销渠道
      data_key-spart = ls_gs_alv-spart "产品组


      data-bzirk = ls_gs_alv-bzirk   " 销售地区
      data-vkbur = ls_gs_alv-vkbur   " 销售部门
      data-waers = gs_alv-waers   " 币种
*     DATA-KDGRP = PL_GOAL-KDGRP  " 客户组
      data-konda = ls_gs_alv-konda   " 客户价格组
      data-kalks = ls_gs_alv-kalks   " 用于确定定价过程的客户分类
      data-vwerk = ls_gs_alv-vwerk   " 交货工厂
      data-vsbed = ls_gs_alv-vsbed   " 装运条件
      data-zterm = ls_gs_alv-zterm2   " 付款条件
      data-ktgrd = ls_gs_alv-ktgrd   " 客户组的帐户分配

*      DATA-AWAHR = '100'          " 该项目的订单可能性

      datax-bzirk = 'X'
      datax-vkbur = 'X'
      datax-waers = 'X'
      datax-konda = 'X'
      datax-kalks = 'X'
      datax-vwerk = 'X'
      datax-vsbed = 'X'
      datax-zterm = 'X'
      datax-ktgrd = 'X'

*     业务伙伴功能
      functions-functions = VALUE cmds_ei_cmd_functions-functions(

       (
        task = 'M'
        data_key-parvw = 'AG'
        data-partner = lv_partner
        datax-partner = 'X'

       )

     (
        task = 'M'
        data_key-parvw = 'RE'
        data-partner = lv_partner
        datax-partner = 'X'

       )
       (
        task = 'M'
        data_key-parvw = 'RG'
        data-partner = lv_partner
        datax-partner = 'X'

       )
       (
        task = 'M'
        data_key-parvw = 'WE'
*        DATA-DEFPA = ''
        data-partner = lv_partner
*        DATAX-DEFPA = 'X'
        datax-partner = 'X'

       )
      )
    )
  ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_TAX
*&---------------------------------------------------------------------*
*& 添加税
*&---------------------------------------------------------------------*
*&      --> V_PARTNER
*&      --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_add_tax USING lv_partner
                          ls_gs_alv STRUCTURE gs_alv.
  DATA:lt_return TYPE STANDARD TABLE OF bapiret2.

* 传入税信息存在时,再调用该BAPI,否则会认为添加空税信息并报错
  IF ls_gs_alv-taxtype IS NOT INITIAL.
    CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
      EXPORTING
        businesspartner = lv_partner
        taxtype         = ls_gs_alv-taxtype
        taxnumber       = ls_gs_alv-taxnumxl
      TABLES
        return          = lt_return.

    READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      gs_alv-icon = icon_red_light.
      gs_alv-message = '税信息添加失败'.
      MODIFY gt_alv FROM gs_alv.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_BANK
*&---------------------------------------------------------------------*
*& 添加银行信息
*&---------------------------------------------------------------------*
*&      --> V_PARTNER
*&      --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_add_bank  USING lv_partner
                          ls_gs_alv STRUCTURE gs_alv.

  DATA:lt_return TYPE STANDARD TABLE OF bapiret2.
  DATA ls_bankdetaildata TYPE bapibus1006_bankdetail.

  DATA:ls_bapi1011_address TYPE bapi1011_address,
       lv_bank_key         TYPE bapi1011_key-bank_key.

* 传入银行信息存在,创建银行页数据
  IF ls_gs_alv-banks IS NOT INITIAL.
    CLEAR:lv_bank_key, ls_bapi1011_address.

*   根据传入的银行帐户的名称,自动生成内部流水银行代码
    ls_bapi1011_address-bank_name = ls_gs_alv-banka."开户行/银行帐户的名称
    CALL FUNCTION 'BAPI_BANK_CREATE'
      EXPORTING
        bank_ctry    = ls_gs_alv-banks               "国家
        bank_address = ls_bapi1011_address
        i_xupdate    = 'X'
      IMPORTING
        bankkey      = lv_bank_key.                   "内部流水号:银行代码

*   在表NBNK生成当前流水号
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    CLEAR ls_bankdetaildata.
    ls_bankdetaildata-bank_ctry = ls_gs_alv-banks.            "国家
    ls_bankdetaildata-bank_acct = ls_gs_alv-bankn.            "银行账户/银行帐户号码
    ls_bankdetaildata-bankaccountname = ls_gs_alv-banka.      "开户行/银行帐户的名称
    ls_bankdetaildata-bank_ref = ls_gs_alv-bkref.             "参考明细
*   LS_BANKDETAILDATA-BANK_KEY = LS_GS_ALV-BANKL.             "银行代码
    ls_bankdetaildata-bank_key = lv_bank_key.                   "银行代码

    CALL FUNCTION 'BAPI_BUPA_BANKDETAIL_ADD'
      EXPORTING
        businesspartner = lv_partner
*       BANKDETAILID    = '0001'
        bankdetaildata  = ls_bankdetaildata
* IMPORTING
*       BANKDETAILIDOUT =
      TABLES
        return          = lt_return.


    READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      gs_alv-icon = icon_red_light.
*      GS_ALV-MESSAGE = '银行信息添加失败'.
      CONCATENATE gs_alv-message '银行信息添加失败' INTO gs_alv-message.
      MODIFY gt_alv FROM gs_alv.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.
*  ENDIF.
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_IDNUMBER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
**&      --> V_PARTNER
**&      --> GS_ALV
**&---------------------------------------------------------------------*
*FORM FRM_ADD_IDNUMBER   USING LV_PARTNER
*                          LS_GS_ALV STRUCTURE GS_ALV.
*
**  DATA : w_identification TYPE bapibus1006_identification.
**  uv_id_type TYPE bu_id_category
*
*  DATA:LT_RETURN TYPE STANDARD TABLE OF BAPIRET2.
*  DATA L_IDENTIFICATIONNUMBER TYPE BU_ID_NUMBER.     "标识号
*  CLEAR L_IDENTIFICATIONNUMBER.
*
*  L_IDENTIFICATIONNUMBER = LS_GS_ALV-IDNUMBER.            "标识号
*
*
*
*  CALL FUNCTION 'BAPI_IDENTIFICATION_ADD'
*    EXPORTING
*      BUSINESSPARTNER      = LV_PARTNER
**     IDENTIFICATIONCATEGORY       =
*      IDENTIFICATIONNUMBER = L_IDENTIFICATIONNUMBER
**     IDENTIFICATION       =
*    TABLES
*      RETURN               = LT_RETURN.
*
*
*
*  READ TABLE LT_RETURN TRANSPORTING NO FIELDS WITH KEY TYPE = 'E'.
*  IF SY-SUBRC = 0.
*    GS_ALV-ICON = ICON_RED_LIGHT.
*    GS_ALV-MESSAGE = '身份信息添加失败'.
*    MODIFY GT_ALV FROM GS_ALV.
*  ELSE.
*    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*      EXPORTING
*        WAIT = 'X'.
*  ENDIF.
**  ENDIF.
*ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_COMP_HEAD
*&---------------------------------------------------------------------*
*& 添加客户身份证号(原字段注册办事处
*&---------------------------------------------------------------------*
*&      --> V_PARTNER
*&      --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_add_comp_head  USING lv_partner
                              ls_gs_alv STRUCTURE gs_alv.

  DATA ls_treasurydata       TYPE bapi_str_bupa_fs_treasury.
  DATA ls_treasurydatachange TYPE bapi_str_bupa_fs_treasury_x.
  DATA:lt_return             TYPE STANDARD TABLE OF bapiret2.

* 当身份证号存在
  IF ls_gs_alv-comp_head IS NOT INITIAL.
    ls_treasurydata-comp_head          = ls_gs_alv-comp_head. "身份证号(原字段:注册办事处)
    ls_treasurydatachange-comp_head    =  'X'.

    CALL FUNCTION 'BAPI_BUPA_FS_TREASURY_CHANGE'
      EXPORTING
        businesspartner    = lv_partner
        treasurydata       = ls_treasurydata
*       TESTRUN            =
        treasurydatachange = ls_treasurydatachange
*       CHANGEDOCU         =
      TABLES
        return             = lt_return.

    .
    READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
    IF sy-subrc = 0.
      gs_alv-icon = icon_red_light.
      CONCATENATE gs_alv-message '身份信息添加失败' INTO gs_alv-message.
      MODIFY gt_alv FROM gs_alv.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.
  ENDIF.



ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& 校验导入的数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_data .

  DATA lt_tax     TYPE  STANDARD TABLE OF dfkkbptaxnum.
  DATA ls_tax     TYPE  dfkkbptaxnum.
  DATA ls_alv     TYPE  ty_input.
  DATA ls_alv_tmp TYPE  ty_input.
  DATA lv_tabix    TYPE  sy-tabix.
  DATA lt_alv_tmp TYPE  STANDARD TABLE OF  ty_input.
  DATA lv_num      TYPE  i.

  FIELD-SYMBOLS <fs_alv> TYPE  ty_input.

  CASE 'X'.
    WHEN p_rd1.
      CLEAR lv_num.
      LOOP AT gt_alv INTO ls_alv.

        lv_num = lv_num + 1.

*   转化导入的语言代码(EN->1CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
          EXPORTING
            input            = ls_alv-langue
          IMPORTING
            output           = ls_alv-langu
          EXCEPTIONS
            unknown_language = 1
            OTHERS           = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        ls_alv-num  = lv_num.
        MODIFY gt_alv  FROM ls_alv.
        CLEAR ls_alv.
      ENDLOOP.

*  得到传入税号的行
      LOOP AT gt_alv INTO ls_alv WHERE taxnumxl IS NOT INITIAL.

        "---------ADD BY WENJ-------------
        IF ls_alv-zgxbs = 'X'.
          CONTINUE.
        ENDIF.
        "---------ADD BY WENJ-------------

        APPEND ls_alv TO gt_alv_tax[].
        CLEAR ls_alv.
      ENDLOOP.

* 校验是否有重复(税号具有唯一性)
      IF gt_alv_tax[] IS NOT INITIAL.
        SORT gt_alv_tax BY taxnumxl.
        REFRESH lt_alv_tmp.
        lt_alv_tmp[] = gt_alv_tax[].

        LOOP AT gt_alv_tax ASSIGNING <fs_alv>.
          CLEAR lv_tabix.
          lv_tabix = sy-tabix.
          CLEAR sy-tabix.
          LOOP AT lt_alv_tmp INTO ls_alv WHERE taxnumxl =  <fs_alv>-taxnumxl.
            IF sy-tabix <> lv_tabix .
              <fs_alv>-icon = icon_red_light.
              <fs_alv>-message = '税号重复!'.
              CONTINUE.
            ENDIF.
            CLEAR ls_alv.
          ENDLOOP.
        ENDLOOP.

* 检查导入的税号是否已存在
        SELECT *
          INTO CORRESPONDING FIELDS OF TABLE lt_tax
          FROM dfkkbptaxnum
           FOR ALL ENTRIES IN gt_alv_tax
         WHERE taxtype = gt_alv_tax-taxtype
           AND taxnum = gt_alv_tax-taxnumxl.

        IF lt_tax[] IS NOT INITIAL.
          LOOP AT gt_alv_tax INTO ls_alv.
            READ TABLE lt_tax INTO ls_tax WITH KEY taxtype = ls_alv-taxtype
                                                    taxnum = ls_alv-taxnumxl.

            IF sy-subrc = 0.
              ls_alv-icon = icon_red_light.
              CONCATENATE ls_alv-message ' 税号已存在!' INTO ls_alv-message .
              MODIFY gt_alv_tax FROM ls_alv.
            ENDIF.
            CLEAR ls_alv.
          ENDLOOP.
        ENDIF.

        LOOP AT  gt_alv INTO ls_alv .
          READ TABLE gt_alv_tax INTO ls_alv_tmp WITH KEY num = ls_alv-num.
          IF sy-subrc = 0.
            ls_alv-icon    = ls_alv_tmp-icon .
            ls_alv-message = ls_alv_tmp-message.
          ENDIF.
          MODIFY gt_alv FROM ls_alv.
          CLEAR :ls_alv,ls_alv_tmp.
        ENDLOOP.

      ENDIF.
    WHEN p_rd2.
      DATA(lt_temp_cms) = gt_alv2.
      SORT lt_temp_cms BY bu_partner.
      DELETE ADJACENT DUPLICATES FROM lt_temp_cms COMPARING bu_partner.
      SELECT FROM but000
        FIELDS partner, partner_guid
        FOR ALL ENTRIES IN @lt_temp_cms
        WHERE partner = @lt_temp_cms-bu_partner
        INTO TABLE @DATA(lt_but000).
      SORT lt_but000 BY partner.
      SELECT FROM but100
        FIELDS partner, rltyp
        FOR ALL ENTRIES IN @lt_temp_cms
        WHERE partner = @lt_temp_cms-bu_partner
        INTO TABLE @DATA(lt_but100).
      SORT lt_but100 BY partner rltyp.
      SELECT FROM ukmbp_cms_sgm
        FIELDS partner, credit_sgmnt
        FOR ALL ENTRIES IN @lt_temp_cms
        WHERE partner = @lt_temp_cms-bu_partner
        INTO TABLE @DATA(lt_cms_sgm).
      SORT lt_cms_sgm BY partner credit_sgmnt.
      LOOP AT gt_alv2 INTO gs_alv2.
        READ TABLE lt_but000 WITH KEY partner = gs_alv2-bu_partner BINARY SEARCH
          INTO DATA(ls_but000).
        IF sy-subrc <> 0.
          gs_alv2-icon    = icon_red_light .
          gs_alv2-message = |客户{ gs_alv2-bu_partner }不存在|.
        ELSE.
          gs_alv2-partner_guid = ls_but000-partner_guid.
        ENDIF.

        READ TABLE lt_but100 WITH KEY partner = gs_alv2-bu_partner
                                      rltyp = gs_alv2-partner_role BINARY SEARCH
          TRANSPORTING NO FIELDS.
        IF sy-subrc = 0.
          gs_alv2-role_exist = abap_true.
        ENDIF.

        READ TABLE lt_cms_sgm WITH KEY partner = gs_alv2-bu_partner
                                      credit_sgmnt = gs_alv2-credit_sgmnt BINARY SEARCH
          TRANSPORTING NO FIELDS.
        IF sy-subrc = 0.
          gs_alv2-sgmnt_exist = abap_true.
        ENDIF.
        MODIFY gt_alv2 FROM gs_alv2.
      ENDLOOP.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA_POST
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_data_post .
*  校验数据
  DATA ls_tax     TYPE  dfkkbptaxnum.
  DATA ls_alv     TYPE  ty_input.
  DATA lt_alv_tmp     TYPE STANDARD TABLE OF  ty_input.

* 检查导入的税号是否已存在
  LOOP AT gt_alv INTO ls_alv WHERE taxnumxl IS NOT INITIAL AND  box = 'X' AND zgxbs IS INITIAL.
    APPEND ls_alv TO lt_alv_tmp[].
    CLEAR ls_alv.
  ENDLOOP.

  IF lt_alv_tmp[] IS NOT INITIAL.
    SELECT *
      INTO CORRESPONDING FIELDS OF TABLE gt_tax_post
      FROM dfkkbptaxnum
       FOR ALL ENTRIES IN lt_alv_tmp
     WHERE taxtype = lt_alv_tmp-taxtype
       AND taxnum = lt_alv_tmp-taxnumxl.
  ENDIF.



ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_SELECT_INFILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- P_FILE
*&---------------------------------------------------------------------*
FORM frm_select_infile CHANGING p_p_file.
*&---定义传出文件名内表 和传出参数
  DATA:wl_t_upfile TYPE filetable,
       wl_rc       TYPE i.

*&---调用类方法
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title     = '请选择本地文件'
      file_filter      = 'EXCEL文件 (*.xlsx)|*.xlsx|EXCEL文件 (*.xls)|*.xls|文本|*.txt|'
      default_filename = '*.xlsx'
    CHANGING
      file_table       = wl_t_upfile
      rc               = wl_rc.

*&---读取成功
  IF sy-subrc = 0 AND wl_rc = 1.
    READ TABLE wl_t_upfile INTO p_file INDEX 1.
  ENDIF.
ENDFORM.

*Text elements
*----------------------------------------------------------
* 001 选择路径
*
*
*Selection texts
*----------------------------------------------------------
* P_FILE         文件路径
* RB_B1         上传文件
* RB_B2         下载模板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值