S4 BP供应商批导

业务场景和目的

批量创建S4 BP供应商

本文重点讨论的业务场景:使用用户上传的EXCLE文件批量创建供应商,节省时间操作时间。

开发申请要求:给出前台(TCODE:BP)创建供应商相关数据,批量创建供应商。

 

前台操作,根据界面底部的消息提示一步一步输入BP供应商的相关数据。

 

  1. 相关BAPI

2.1 BAPI_BUPA_CREATE_FROM_DATA (创建供应商主要数据)

2.1.1功能描述

根据供应商主数据创建供应商数据相关信息(主要数据)。

 

2.1.2调用代码示例

        CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA'
          EXPORTING
            BUSINESSPARTNEREXTERN   = GS_ALV-LIFNR
            PARTNERCATEGORY         = G_CAT
            PARTNERGROUP            = G_GRP
            CENTRALDATA             = IT_CENTR
*           CENTRALDATAPERSON       = T_CENTRALDATAPERSON
            CENTRALDATAORGANIZATION = T_ORGANIZATION
            ADDRESSDATA             = IT_ADDR
          IMPORTING
            BUSINESSPARTNER         = G_BP
          TABLES
            RETURN                  = I_RETURN
            TELEFONDATA             = I_TELEFONDATA
            FAXDATA                 = I_FAXDATA
            E_MAILDATA              = I_E_MAILDATA
            COMMUNICATIONNOTES      = I_COMMUNICATIONNOTES
*           ROLES                   = T_ROLES
          .

2.2 BAPI_BUPA_BANKDETAIL_ADD(创建银行数据)

代码示例

CALL FUNCTION 'BAPI_BUPA_BANKDETAIL_ADD'
                EXPORTING
                  BUSINESSPARTNER = GS_ALV-LIFNR
                  BANKDETAILDATA  = LS_BANKDETAIL
                TABLES
                  RETURN          = I_RETURN.

2.3 BAPI_BUPA_ROLE_ADD(角色添加)

对于前台控制页签下的税分类相关数据,如下图,需要用BAPI_BUTX_FRG0010_ADD才能添加进去。

 

调用代码示例:

 G_ROLL = 'FLVN00'.
            CALL FUNCTION 'BAPI_BUPA_ROLE_ADD'
              EXPORTING
                BUSINESSPARTNER     = GS_ALV-LIFNR
                BUSINESSPARTNERROLE = G_ROLL.

2.4 VMD_EI_API=>MAINTAIN_DIRECT_INPUT(采购数据、公司代码数据等)

 

调用代码示例

*&----调用类
        CALL METHOD VMD_EI_API=>MAINTAIN_DIRECT_INPUT
          EXPORTING
*           IV_TEST_RUN              = SPACE
            IS_MASTER_DATA           = LS_MAIN
          IMPORTING
            ES_MASTER_DATA_CORRECT   = LS_COR1 "正确
            ES_MESSAGE_CORRECT       = LS_MESG2
            ES_MASTER_DATA_DEFECTIVE = LS_COR2 "错误
            ES_MESSAGE_DEFECTIVE     = LS_MESG.

代码示例

 

REPORT ZMM020.
*----------------------------------------------------------------------*
* 表声明
*----------------------------------------------------------------------*

TABLES:SSCRFIELDS.
*----------------------------------------------------------------------*
* ALV参数声明
*----------------------------------------------------------------------*
DATA:GT_FIELDCAT TYPE LVC_T_FCAT, " 字段目录内表
     GS_FIELDCAT TYPE LVC_S_FCAT, " 字段目录工作区
     LAYOUT      TYPE LVC_S_LAYO. " ALV布局
*----------------------------------------------------------------------*
* 数据声明
*----------------------------------------------------------------------*
TYPES:BEGIN OF TY_ALV,
        LIFNR    TYPE  LFA1-LIFNR,  " 供应商编号
        BUKRS    TYPE  BUKRS,       " 公司代码
        EKORG    TYPE  EKORG,       " 采购组织
        KTOKK    TYPE  LFA1-KTOKK,  " 帐户组
        TITLE   TYPE  ADRC-TITLE,  " 称谓       WD  2
        NAME1    TYPE  LFA1-NAME1,  " 供应商名称
        MCOD1    TYPE  LFA1-MCOD1,  " 搜索项1
        STRAS    TYPE  LFA1-STRAS,  " 地址
        CITY1   TYPE  LFA1-ORT01,  " 城市
        LAND1   TYPE  LFA1-LAND1,   " 国家  WD
        REGION  TYPE  LFA1-ORT02,  " 地区
        PSTLZ    TYPE  LFA1-PSTLZ,  " 邮政编码
        SPRAS   TYPE  LFA1-SPRAS,  " 语言 WD
        NAME1_K TYPE  KNVK-NAME1,  " 联系人姓名 WD 地址注释
        TELF1    TYPE  LFA1-TELF1,  " 第一个电话号
        TELF2    TYPE  LFA1-TELF2,  " 移动电话
        TELFX   TYPE  LFA1-TELFX,  " 传真
        TELBX   TYPE  C LENGTH 200, " 电子邮件
        BANKS    TYPE  BANKS,       " 银行国家代码
        BANKL    TYPE  BANKL,       " 银行代码
        BANK    TYPE  C LENGTH 40, " 银行账号
        BKREF   TYPE  BU_BKREF,    " 银行细目的参考明细
        KOINH   TYPE LFBK-KOINH,   " 账号持有人 WD
        ACCNAME TYPE LFBK-EBPP_ACCNAME, " 账号名称 WD
        AKONT    TYPE  AKONT,       " 统驭科目
        ZUAWA    TYPE  LFB1-ZUAWA,  " 排序码
        ZTERM1  TYPE  LFB1-ZTERM,  " 付款条件(财务)
        REPRF   TYPE  LFB1-REPRF,  " 检查双重发票或信贷凭单的标志 WD
        WAERS    TYPE  LFM1-WAERS,  " 财务订单货币
        ZTERM    TYPE  LFB1-ZTERM,  " 付款条件(后勤)
        WEBRE    TYPE  LFM1-WEBRE,  " 基于收货的发票验证
        INCO1   TYPE  LFM1-INCO1,  " 贸易条款 WD
        INCO2_L TYPE  LFM1-INCO2_L, " 国际贸易条款位置 1 WD

*        HOUSE_NUM1 TYPE  ADDR1_DATA-HOUSE_NUM1,   " 门牌号
*        TEL_EXTENS TYPE  LFA1-TELF1,  " 电话分机
*        FAX_EXTENS TYPE  LFA1-TELFX,  " 传真分机
*        KRAUS      TYPE  LFA1-KRAUS,  " 邓白氏码
*        KUNNR       TYPE  KUNNR,       " 客户
*        VBUND       TYPE  VBUND,       " 贸易伙伴
*        STCD1       TYPE  LFA1-STCD1,  " 税务登记证号
*        VERKF       TYPE  LFM1-VERKF,  " 联系人
*        TELF3      TYPE  LFM1-TELF1,  " 电话
*        EKGRP      TYPE  LFM1-EKGRP,  " 采购组
*        TOGRU      TYPE  LFB1-TOGRU,  " 容差组
*        ZWELS      TYPE  LFB1-ZWELS,  " 付款方式

        ICON    TYPE C LENGTH 4,
        MESSAGE TYPE C LENGTH 360,
        BOX     TYPE C LENGTH 1,
      END OF TY_ALV.
DATA:GT_ALV TYPE STANDARD TABLE OF TY_ALV,
     GS_ALV TYPE TY_ALV.
DATA:GT_TEMP TYPE STANDARD TABLE OF TY_ALV,
     GS_TEMP TYPE TY_ALV.
TYPES:BEGIN OF TY_TAB,
        LIFNR   TYPE  LFA1-LIFNR,  " 供应商编号
        BUKRS    TYPE  BUKRS,       " 公司代码
        EKORG    TYPE  EKORG,       " 采购组织
        KTOKK    TYPE  LFA1-KTOKK,  " 帐户组
        TITLE   TYPE  ADRC-TITLE,  " 称谓       WD W
        NAME1    TYPE  LFA1-NAME1,  " 供应商名称
        MCOD1    TYPE  LFA1-MCOD1,  " 搜索项1
        STRAS    TYPE  LFA1-STRAS,  " 地址
        CITY1   TYPE  LFA1-ORT01,  " 城市
        LAND1   TYPE  LFA1-LAND1,   " 国家  WD
        REGION  TYPE  LFA1-ORT02,  " 地区
        PSTLZ    TYPE  LFA1-PSTLZ,  " 邮政编码
        SPRAS   TYPE  LFA1-SPRAS,  " 语言 WD
        NAME1_K TYPE  KNVK-NAME1,  " 联系人姓名 WD W
        TELF1    TYPE  LFA1-TELF1,  " 第一个电话号
        TELF2    TYPE  LFA1-TELF2,  " 移动电话
        TELFX   TYPE  LFA1-TELFX,  " 传真
        TELBX   TYPE  C LENGTH 200, " 电子邮件
        BANKS    TYPE  BANKS,       " 银行国家代码
        BANKL    TYPE  BANKL,       " 银行代码
        BANK    TYPE  C LENGTH 40, " 银行账号
        BKREF   TYPE  BU_BKREF,    " 银行细目的参考明细
        KOINH   TYPE  LFBK-KOINH,   " 账号持有人 WD
        ACCNAME TYPE  LFBK-EBPP_ACCNAME, "账号名称 WD
        AKONT    TYPE  AKONT,       " 统驭科目
        ZUAWA    TYPE  LFB1-ZUAWA,  " 排序码
        ZTERM1  TYPE  LFB1-ZTERM,  " 付款条件(财务)
        REPRF   TYPE  LFB1-REPRF,  " 检查双重发票或信贷凭单的标志 WD
        WAERS    TYPE  LFM1-WAERS,  " 采购订单货币
        ZTERM    TYPE  LFB1-ZTERM,  " 付款条件(后勤)
        WEBRE    TYPE  LFM1-WEBRE,  " 基于收货的发票验证
        INCO1   TYPE  LFM1-INCO1,  " 贸易条款 WD
        INCO2_L TYPE  LFM1-INCO2_L, " 国际贸易条款位置 1 WD
      END OF TY_TAB.

DATA:I_TAB TYPE TY_TAB OCCURS 0 WITH HEADER LINE.

DATA:I_FILETABLE TYPE FILETABLE,
     FILENAME    TYPE STRING,
     I_RC        TYPE I.
DATA:I_FILENAME TYPE RLGRAP-FILENAME .
DATA:ITAB TYPE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE. .

DATA:L_BANKN TYPE C LENGTH 40.

DATA:IT_HEADER TYPE BAPIBUS1006_HEAD OCCURS 0 WITH HEADER LINE.
DATA:IT_CENTR TYPE BAPIBUS1006_CENTRAL OCCURS 0 WITH HEADER LINE.
DATA:G_BP LIKE BAPIBUS1006_HEAD-BPARTNER.
DATA:G_CAT LIKE BAPIBUS1006_HEAD-PARTN_CAT VALUE '2',
     G_GRP LIKE BAPIBUS1006_HEAD-PARTN_GRP.
DATA:LS_BANKDETAIL TYPE BAPIBUS1006_BANKDETAIL.

DATA:IT_GUID LIKE BUS000___I OCCURS 0 WITH HEADER LINE.
DATA:IT_CUSTO LIKE BUS000_EEW OCCURS 0 WITH HEADER LINE.
DATA:IT_ADDR LIKE BAPIBUS1006_ADDRESS OCCURS 0 WITH HEADER LINE.
DATA:I_TELETEXDATA LIKE BAPIADTTX OCCURS 0 WITH HEADER LINE.
DATA:I_TELEFONDATA LIKE BAPIADTEL OCCURS 0 WITH HEADER LINE.
DATA:I_FAXDATA LIKE BAPIADFAX OCCURS 0 WITH HEADER LINE.
DATA:I_E_MAILDATA LIKE BAPIADSMTP OCCURS 0 WITH HEADER LINE.
DATA:I_COMMUNICATIONNOTES LIKE BAPICOMREM OCCURS 0 WITH HEADER LINE.

DATA:I_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA:I_CENTRALDATAPERSON LIKE BAPIBUS1006_CENTRAL_PERSON OCCURS 0 WITH
HEADER LINE.
DATA:T_CENTRALDATAPERSON LIKE BAPIBUS1006_CENTRAL_PERSON OCCURS 0 WITH
HEADER LINE.

DATA:T_ORGANIZATION LIKE BAPIBUS1006_CENTRAL_ORGAN OCCURS 0 WITH HEADER LINE.
DATA:I_TIMES TYPE N LENGTH 3 VALUE 1.

DATA:T_ROLES TYPE BAPIBUSISB990_BPROLES  OCCURS 0 WITH HEADER LINE.

*****
DATA: G_ROLL TYPE BAPIBUS1006_HEAD-PARTNERROLE.

****
FIELD-SYMBOLS: <FS>.
DATA:MESTX TYPE BAPIRET2.
DATA:IT_ERROR_MESSAGE TYPE ESP1_MESSAGE_TAB_TYPE WITH HEADER LINE.
DATA:V_LINENO TYPE MESG-ZEILE.




DATA: LT_RETURN TYPE BAPIRET2 OCCURS 0 WITH HEADER LINE,
      LIFNR     TYPE  LIFNR.

DATA:LV_FLG,
     LV_IF03 TYPE C ."是否主账号与支付账号相同
DATA:LS_MAIN         TYPE VMDS_EI_MAIN,
     LS_MAIN1        TYPE VMDS_EI_MAIN,
     LS_MESG         TYPE CVIS_MESSAGE,

     LT_MSG          TYPE BAPIRET2_T,
     LWA_MSG         TYPE BAPIRET2,

     LT_VEND         TYPE VMDS_EI_EXTERN_T, "扩展数据
     LWA_VEND        TYPE VMDS_EI_EXTERN,

     LT_COMPANY      TYPE VMDS_EI_COMPANY_T, "公司代码数据
     LWA_COMPANY     TYPE VMDS_EI_COMPANY,

     LT_BANKDETAILS  TYPE CVIS_EI_BANKDETAIL_T, "银行
     LWA_BANKDETAILS TYPE CVIS_EI_CVI_BANKDETAIL,

     LT_PURCHASING   TYPE VMDS_EI_PURCHASING_T, "外部接口:商业组织
     LWA_PURCHASING  TYPE VMDS_EI_PURCHASING,

     LT_FUNCTIONS    TYPE VMDS_EI_FUNCTIONS_T, "外部界面:合作伙伴角色
     LWA_FUNCTIONS   TYPE VMDS_EI_FUNCTIONS.
DATA:LW_LFA1 TYPE LFA1.



DATA:L_FLAG TYPE C VALUE '',
     L_TASK TYPE VMD_EI_OBJECT_TASK VALUE 'M'.

DATA :LS_MESG2 TYPE CVIS_MESSAGE,
      LS_COR1  TYPE VMDS_EI_MAIN,
      LS_COR2  TYPE VMDS_EI_MAIN.

DATA LT_PHONE   TYPE  CVIS_EI_PHONE_T."电话
DATA LW_PHONE   TYPE  CVIS_EI_PHONE_STR.
DATA LT_FAX     TYPE  CVIS_EI_FAX_T."传真
DATA LW_FAX     TYPE  CVIS_EI_FAX_STR.
DATA LT_SMTP    TYPE  CVIS_EI_SMTP_T."邮件
DATA LW_SMTP    TYPE  CVIS_EI_SMTP_STR.
DATA LT_REMARKS TYPE  CVIS_EI_REM_T."备注
DATA LW_REMARKS TYPE  CVIS_EI_REM.
DATA LT_EXT     TYPE VMDS_EI_EXTERN_T.
DATA LW_EXT     TYPE VMDS_EI_EXTERN.
DATA L_LIFNR    TYPE LIFNR.
DATA L_BAHNS    TYPE LFA1-BAHNS.

*--进度条
"进度条标志
DATA:V_FLAG TYPE C.
"进度条变量
DATA:V_TABIX TYPE I.
"上传模板条目数
DATA:LV_LINES TYPE I.
*----------------------------------------------------------------------*
* 选择屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK SC1 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_FILE TYPE RLGRAP-FILENAME MEMORY ID M1.
SELECTION-SCREEN END OF BLOCK SC1.
SELECTION-SCREEN FUNCTION KEY 1. "在初始屏幕上出现下载按钮

*----------------------------------------------------------------------*
* INITIALIZATION事件
*----------------------------------------------------------------------*
INITIALIZATION.
  SSCRFIELDS-FUNCTXT_01 = '@49@下载导入模板'.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = '选择数据文件'
      MULTISELECTION          = SPACE
      FILE_FILTER             = 'Excel Files(*.xls)|*.xls;*.XLS;*.xlsx;*.XLSX'
    CHANGING
      FILE_TABLE              = I_FILETABLE
      RC                      = I_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 I_RC = 1.                      "判断是否成功打开
    READ TABLE I_FILETABLE INTO P_FILE INDEX 1.
    FILENAME = P_FILE.
  ENDIF.

AT SELECTION-SCREEN.
  IF SSCRFIELDS-UCOMM = 'FC01'.
    PERFORM DOWNLOAD_TEMPLATE.   "下载SWM0上传过的模版
  ENDIF.
*----------------------------------------------------------------------*
* START-OF-SELECTION事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
  IF P_FILE IS INITIAL.
    MESSAGE '请选择文件!' TYPE 'S' DISPLAY LIKE 'E'.
    STOP.
  ELSE.
    FILENAME  = P_FILE.
    PERFORM UPLOAD_DATA.      "上载数据
    PERFORM FRM_SET_LAYOUT.   " 设置布局
    PERFORM FRM_SET_FIELDCAT. " 设置字段目录
    PERFORM FRM_DISPLAY_DATA. " 展示数据
    CLEAR:I_FILETABLE.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWNLOAD_TEMPLATE .

  DATA: LS_WWWDATATAB     LIKE WWWDATATAB,
        LT_MIME           LIKE W3MIME OCCURS 10,
        LV_FILENAME       TYPE STRING,
        LV_PATH           TYPE STRING,
        LV_FULLPATH       TYPE STRING,
        WINDOW_TITLE      TYPE STRING,
        DEFAULT_FILE_NAME TYPE STRING.

  CLEAR: LS_WWWDATATAB,LT_MIME[],LV_FILENAME,LV_PATH,LV_FULLPATH,WINDOW_TITLE,DEFAULT_FILE_NAME.

  LS_WWWDATATAB-RELID = 'MI'.         "IMPORT/EXPORT 数据表中的区域


  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      LS_WWWDATATAB-OBJID = 'ZMM020'.
      LS_WWWDATATAB-TEXT  = '供应商导入程序模版.xlsx'."WWWDATA 对象的短文本
      DEFAULT_FILE_NAME   = '供应商导入程序模版.xlsx'.
  ENDCASE.



  WINDOW_TITLE        = '下载导入模板'.


  CALL FUNCTION 'WWWDATA_IMPORT'                            "#EC *
    EXPORTING
      KEY               = LS_WWWDATATAB
    TABLES
      MIME              = LT_MIME
    EXCEPTIONS
      WRONG_OBJECT_TYPE = 1
      IMPORT_ERROR      = 2
      OTHERS            = 3.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE         = WINDOW_TITLE
      DEFAULT_EXTENSION    = 'xlsx'
      DEFAULT_FILE_NAME    = DEFAULT_FILE_NAME
      FILE_FILTER          = 'EXCEL'
    CHANGING
      FILENAME             = LV_FILENAME
      PATH                 = LV_PATH
      FULLPATH             = LV_FULLPATH
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.

  IF SY-SUBRC <> 0.
    STOP.
  ENDIF.

  IF LV_FULLPATH IS NOT INITIAL.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        FILENAME = LV_FULLPATH
        FILETYPE = 'BIN'
      TABLES
        DATA_TAB = LT_MIME.
  ENDIF.


ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UPLOAD_DATA .

  I_FILENAME = FILENAME.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = I_FILENAME
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 2
      I_END_COL               = 255
      I_END_ROW               = 65535
    TABLES
      INTERN                  = ITAB
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  IF ITAB[] IS NOT INITIAL.
    LOOP AT ITAB.
      ON CHANGE OF ITAB-ROW.
        IF SY-TABIX NE 1.
          APPEND I_TAB.
          CLEAR I_TAB.
        ENDIF.
      ENDON.

      ASSIGN COMPONENT ITAB-COL OF STRUCTURE I_TAB TO <FS>.
      <FS> = ITAB-VALUE.
    ENDLOOP.
    APPEND I_TAB.
    CLEAR I_TAB.
  ENDIF.
  LOOP AT I_TAB.
    CLEAR GS_ALV.
    MOVE-CORRESPONDING I_TAB TO GS_ALV.
    APPEND GS_ALV TO GT_ALV.
    CLEAR I_TAB.
  ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
  CLEAR LAYOUT.
  LAYOUT-BOX_FNAME = 'BOX'.
  LAYOUT-SEL_MODE   = 'A'.     "选择行模式
  LAYOUT-CWIDTH_OPT = 'X'.     "优化列宽设置
  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' '消息'            '' '' ''.
  FC 'LIFNR' '供应商编号'       '' '' 'X'.
  FC 'BUKRS' '公司代码'        '' '' ''.
  FC 'EKORG' '采购组织'        '' '' ''.
  FC 'KTOKK' '帐户组'           '' '' ''.
  FC 'TITLE' '称谓 '           '' '' ''.
  FC 'NAME1' '供应商名称'   '' '' ''.
  FC 'MCOD1' '搜索项'       '' '' ''.
  FC 'STRAS' '地址'       '' '' ''.
  FC 'CITY1' '城市'         '' '' ''.
  FC 'LAND1' '国家'         '' '' ''.
  FC 'REGION' '地区'       '' '' ''.
  FC 'PSTLZ' '邮政编码'    '' '' ''.
  FC 'SPRAS' '语言'    '' '' ''.
  FC 'NAME1_K' '联系人姓名'    '' '' ''.
  FC 'TELF1' '第一个电话号'          '' '' ''.
  FC 'TELF2' '移动电话'        '' '' ''.
  FC 'TELFX' '传真'        '' '' ''.
  FC 'TELBX' '电子邮件'      '' '' ''.
  FC 'BANKS' '银行国家代码'        '' '' ''.
  FC 'BANKL' '银行代码'   '' '' ''.
  FC 'BANK'  '银行账户'       '' '' ''.
  FC 'BKREF' '银行细目的参考明细'         '' '' ''.
  FC 'KOINH' '账号持有人'         '' '' ''.
  FC 'ACCNAME' '账号名称'         '' '' ''.
  FC 'AKONT' '统驭科目'        '' '' ''.
  FC 'ZUAWA' '排序码'          '' '' ''.
  FC 'ZTERM1' '付款条件(财务)'            '' '' ''.
  FC 'REPRF' '检查双重发票或信贷凭单的标志)'            '' '' ''.
  FC 'WAERS' '采购订单货币'       '' '' ''.
  FC 'ZTERM' '付款条件(后勤)'       '' '' ''.
  FC 'WEBRE' '基于收货的发票校验'          '' '' ''.
  FC 'INCO1' '贸易条款'          '' '' ''.
  FC 'INCO2_L' '国际贸易条款位置'          '' '' ''.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_DATA .
  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            = 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.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_STATUS  USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_FULLSCREEN' .
ENDFORM.
*&---------------------------------------------------------------------*
*& 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.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = REF_GRID.                    " 获取全局变量

  CALL METHOD REF_GRID->CHECK_CHANGED_DATA. " 获取响应事件
  RS_SELFIELD-REFRESH = 'X'.
  CASE R_UCOMM.
    WHEN 'CREATE'.
      PERFORM FRM_CALL_BAPI.
  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
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CALL_BAPI .
  DATA:L_PARTNER TYPE BP001-PARTNER.
  DATA:BUSINESSPARTNEREXTERN TYPE BU_PARTNER.
  CLEAR:GS_TEMP,GT_TEMP.
  DATA:LT_REMARKS TYPE CVIS_EI_REM_T,
       LS_REMARKS TYPE CVIS_EI_REM.

  GT_TEMP = GT_ALV.
*  DELETE GT_TEMP WHERE BOX <> 'X'. "导入所有

*&---进度条使用标志
  CLEAR:V_FLAG.
*&---循环导入
  V_TABIX = 0.
  DESCRIBE TABLE GT_TEMP LINES LV_LINES .

  IF GT_TEMP IS INITIAL.
    MESSAGE '请选择一行进行导入!' TYPE 'E'.
  ELSE.
    LOOP AT GT_ALV INTO GS_ALV WHERE BOX = 'X'.

*----------------进度条----------------------------------------------------*

*&---当前条目
      V_TABIX = V_TABIX + 1.
*&---进度条
*    WAIT UP TO 3 SECONDS.
      PERFORM FRM_INDICATOR USING V_TABIX.


      CLEAR:IT_CENTR,IT_CENTR[],T_ORGANIZATION,T_ORGANIZATION[],
            IT_ADDR,IT_ADDR[],I_RETURN,I_RETURN[],
            I_TELEFONDATA,I_TELEFONDATA[],I_FAXDATA,I_FAXDATA[],
            I_E_MAILDATA,I_E_MAILDATA[].
      SELECT SINGLE PARTNER INTO L_PARTNER FROM BP001
      WHERE PARTNER = GS_ALV-LIFNR.

      IF SY-SUBRC <> 0.
        G_GRP = GS_ALV-KTOKK.                         " 分组
        IT_CENTR-TITLE_KEY   = '0003'.                " 地址关键字的表格
        IT_CENTR-SEARCHTERM1 = GS_ALV-MCOD1.          " 搜索项1
        APPEND IT_CENTR.

        T_ORGANIZATION-NAME1     =  GS_ALV-NAME1.     " 供应商名称
        APPEND T_ORGANIZATION.

        IT_ADDR-COUNTRY =  GS_ALV-LAND1 .             " 国家代码
        IT_ADDR-CITY   =   GS_ALV-CITY1.              " 城市
        IT_ADDR-REGION  = GS_ALV-REGION.              " 地区
        IT_ADDR-STREET   = GS_ALV-STRAS.              " 街道
*        IT_ADDR-HOUSE_NO = GS_ALV-HOUSE_NUM1.         " 门牌号
        IT_ADDR-POSTL_COD1 = GS_ALV-PSTLZ.            " 邮政编码
        IT_ADDR-LANGU      = '1'.
        APPEND IT_ADDR.


        IT_ADDR-COUNTRY =  GS_ALV-LAND1 .             " 国家代码
        I_TELEFONDATA-TELEPHONE = GS_ALV-TELF1.       " 办公电话
*        I_TELEFONDATA-EXTENSION = GS_ALV-TEL_EXTENS.  " 电话分机
        APPEND I_TELEFONDATA.
        CLEAR I_TELEFONDATA.

        IT_ADDR-COUNTRY =  GS_ALV-LAND1 .             " 国家代码
        I_FAXDATA-FAX        = GS_ALV-TELFX.         " 传真
*        I_FAXDATA-EXTENSION  = GS_ALV-FAX_EXTENS.    " 传真分机
        APPEND I_FAXDATA.
        CLEAR I_FAXDATA..

        I_E_MAILDATA-E_MAIL = GS_ALV-TELBX.         " EMAIL地址
        APPEND I_E_MAILDATA.
        CLEAR  I_E_MAILDATA.

        IT_ADDR-COUNTRY =  GS_ALV-LAND1 .           " 国家代码
        I_TELEFONDATA-TELEPHONE = GS_ALV-TELF2.    " 供应商手机
        APPEND I_TELEFONDATA.
        CLEAR I_TELEFONDATA.



        I_COMMUNICATIONNOTES[] = VALUE #( ( COMM_TYPE  = 'TEL'
                                            LANGU      = SY-LANGU
                                            COMM_NOTES = GS_ALV-NAME1_K
                                        )
                                      ).


        CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA'
          EXPORTING
            BUSINESSPARTNEREXTERN   = GS_ALV-LIFNR
            PARTNERCATEGORY         = G_CAT
            PARTNERGROUP            = G_GRP
            CENTRALDATA             = IT_CENTR
*           CENTRALDATAPERSON       = T_CENTRALDATAPERSON
            CENTRALDATAORGANIZATION = T_ORGANIZATION
            ADDRESSDATA             = IT_ADDR
          IMPORTING
            BUSINESSPARTNER         = G_BP
          TABLES
            RETURN                  = I_RETURN
            TELEFONDATA             = I_TELEFONDATA
            FAXDATA                 = I_FAXDATA
            E_MAILDATA              = I_E_MAILDATA
            COMMUNICATIONNOTES      = I_COMMUNICATIONNOTES
*           ROLES                   = T_ROLES
          .

        READ TABLE I_RETURN  WITH KEY TYPE = 'E'.
        IF SY-SUBRC = 0.
          GS_ALV-ICON = ICON_RED_LIGHT.
          GS_ALV-MESSAGE = I_RETURN-MESSAGE.
        ELSE.
          READ TABLE I_RETURN WITH KEY TYPE = 'A'.
          IF SY-SUBRC = 0.
            GS_ALV-ICON = ICON_RED_LIGHT.
            GS_ALV-MESSAGE = I_RETURN-MESSAGE.
          ELSE.
**银行数据
            GS_ALV-LIFNR = G_BP.
            CLEAR LS_BANKDETAIL.
            IF GS_ALV-BANK IS NOT INITIAL.
              LS_BANKDETAIL-BANK_CTRY = GS_ALV-BANKS.    " 银行国家代码
              LS_BANKDETAIL-BANK_KEY  = GS_ALV-BANKL.    " 银行代码
              LS_BANKDETAIL-BANK_ACCT = GS_ALV-BANK.     " 银行帐户号码
              LS_BANKDETAIL-BANK_REF  = GS_ALV-BKREF.    " 银行帐户的参考规定
              LS_BANKDETAIL-ACCOUNTHOLDER = GS_ALV-KOINH."账号持有人 WD
              LS_BANKDETAIL-BANKACCOUNTNAME = GS_ALV-ACCNAME . "账号名称 WD
              IF STRLEN( GS_ALV-BANK ) GT 18.
                CLEAR L_BANKN.
                L_BANKN = GS_ALV-BANK.
                SHIFT L_BANKN BY 18 PLACES.
                CONDENSE L_BANKN.
                LS_BANKDETAIL-BANK_REF    = L_BANKN.
              ENDIF.
              CALL FUNCTION 'BAPI_BUPA_BANKDETAIL_ADD'
                EXPORTING
                  BUSINESSPARTNER = GS_ALV-LIFNR
                  BANKDETAILDATA  = LS_BANKDETAIL
                TABLES
                  RETURN          = I_RETURN.
              READ TABLE I_RETURN WITH KEY TYPE  = 'E'.
              IF SY-SUBRC = 0.
                GS_ALV-ICON = ICON_RED_LIGHT.
                GS_ALV-MESSAGE = I_RETURN.
              ENDIF.

            ENDIF.
            G_ROLL = 'FLVN00'.
            CALL FUNCTION 'BAPI_BUPA_ROLE_ADD'
              EXPORTING
                BUSINESSPARTNER     = GS_ALV-LIFNR
                BUSINESSPARTNERROLE = G_ROLL.

            G_ROLL = 'FLVN01'.
            CALL FUNCTION 'BAPI_BUPA_ROLE_ADD'
              EXPORTING
                BUSINESSPARTNER     = GS_ALV-LIFNR
                BUSINESSPARTNERROLE = G_ROLL.

          ENDIF.
        ENDIF.
      ELSE.
        GS_ALV-ICON = ICON_RED_LIGHT.
        GS_ALV-MESSAGE = '合作伙伴已存在,只能更新!'.
      ENDIF.


      IF GS_ALV-ICON = ICON_RED_LIGHT.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
        WAIT UP TO '0.5' SECONDS.

        CLEAR:L_LIFNR,LS_MAIN,L_BAHNS.
        CLEAR:LS_COR1, LS_MESG2,  LS_COR2 , LS_MESG,LV_FLG.
        CLEAR:LS_MAIN1 ,LS_MESG,LT_MSG,LWA_MSG,LT_VEND,LWA_VEND,
              LT_COMPANY,LWA_COMPANY,LT_BANKDETAILS, LWA_BANKDETAILS,
              LT_PURCHASING,LWA_PURCHASING,LT_FUNCTIONS,  LWA_FUNCTIONS.
        L_LIFNR = GS_ALV-LIFNR.
*          IF I_TAB-KTOKK = 'Z003'.
*            I_TAB-KTOKK = 'Z006'.
*          ENDIF.
        LWA_VEND-HEADER-OBJECT_INSTANCE-LIFNR  = GS_ALV-LIFNR.
        LWA_VEND-CENTRAL_DATA-CENTRAL-DATA-KTOKK = GS_ALV-KTOKK."账户组
        LWA_VEND-CENTRAL_DATA-CENTRAL-DATAX-KTOKK = 'X'.


* 主数据
        LWA_VEND-HEADER-OBJECT_TASK = L_TASK.
*        LWA_VEND-CENTRAL_DATA-CENTRAL-DATA-STENR  = GS_ALV-STCD1." 税号
        LWA_VEND-CENTRAL_DATA-CENTRAL-DATAX-STENR = 'X'.

*        LWA_VEND-CENTRAL_DATA-CENTRAL-DATA-KRAUS = GS_ALV-KRAUS. " 邓白氏码
        LWA_VEND-CENTRAL_DATA-CENTRAL-DATAX-KRAUS = 'X'.
*地址数据
*        IF GS_ALV-KUNNR IS NOT INITIAL.
*          LWA_VEND-CENTRAL_DATA-CENTRAL-DATA-KUNNR = GS_ALV-KUNNR.
*          LWA_VEND-CENTRAL_DATA-CENTRAL-DATAX-KUNNR = 'X'.
*        ENDIF.
*        IF GS_ALV-VBUND IS NOT INITIAL.
*          LWA_VEND-CENTRAL_DATA-CENTRAL-DATA-VBUND = GS_ALV-VBUND.
*          LWA_VEND-CENTRAL_DATA-CENTRAL-DATAX-VBUND = 'X'.
*        ENDIF.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-LANGU        = GS_ALV-SPRAS."语言
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-LANGU        = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-SORT1        = GS_ALV-MCOD1."简称
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-SORT1        = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-COUNTRY      =  'CN'."国家
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-COUNTRY      = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-REGION       = GS_ALV-REGION."地区
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-REGION       = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-CITY         = GS_ALV-CITY1."城市
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-CITY         = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-POSTL_COD1   = GS_ALV-PSTLZ. "邮政编码
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-POSTL_COD1   = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-STREET       = GS_ALV-STRAS."地址
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-STREET       = 'X'.

        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATA-NAME         = GS_ALV-NAME1.      "名称
        LWA_VEND-CENTRAL_DATA-ADDRESS-POSTAL-DATAX-NAME = 'X'.


*地址注释
        CLEAR LS_REMARKS.
        REFRESH LT_REMARKS.
        LS_REMARKS-TASK = 'I'.
        LS_REMARKS-DATA-LANGU       = GS_ALV-SPRAS.
        LS_REMARKS-DATA-ADR_NOTES   = GS_ALV-NAME1_K.
        LS_REMARKS-DATAX-LANGU      = 'X'.
        LS_REMARKS-DATAX-ADR_NOTES  = 'X'.
        APPEND LS_REMARKS TO LT_REMARKS.

        LWA_VEND-CENTRAL_DATA-ADDRESS-REMARK-CURRENT_STATE = 'X'.
        LWA_VEND-CENTRAL_DATA-ADDRESS-REMARK-REMARKS = LT_REMARKS.


        I_TELEFONDATA-R_3_USER  = '3'.              "
        APPEND I_TELEFONDATA.
        CLEAR I_TELEFONDATA.





* 公司代码数据

        LWA_COMPANY-TASK =  L_TASK.
        LWA_COMPANY-DATA_KEY-BUKRS = GS_ALV-BUKRS.  " 公司代码

        LWA_COMPANY-DATA-AKONT  = GS_ALV-AKONT.     " 统驭科目
        LWA_COMPANY-DATA-ZUAWA  = GS_ALV-ZUAWA.     " 排序码
        LWA_COMPANY-DATA-ZTERM  = GS_ALV-ZTERM1.    " 付款条件
*        LWA_COMPANY-DATA-ZWELS  = GS_ALV-ZWELS.     " 付款方式
*        LWA_COMPANY-DATA-REPRF  = 'X'.              " 双重发票校验
*        LWA_COMPANY-DATA-TOGRU  = GS_ALV-TOGRU.     " 单独收付标识
        LWA_COMPANY-DATA-REPRF = GS_ALV-REPRF."检查双重发票或信贷凭单的标志 WD


        LWA_COMPANY-DATAX-AKONT = 'X'.
        LWA_COMPANY-DATAX-ZUAWA = 'X'.
        LWA_COMPANY-DATAX-ZTERM = 'X'.
        LWA_COMPANY-DATAX-ZWELS = 'X'.
        LWA_COMPANY-DATAX-REPRF = 'X'.
        LWA_COMPANY-DATAX-TOGRU  = 'X'.


        APPEND LWA_COMPANY TO LT_COMPANY.
        LWA_VEND-COMPANY_DATA-COMPANY = LT_COMPANY.


*采购数据
        LWA_PURCHASING-TASK = L_TASK.
        LWA_PURCHASING-DATA_KEY-EKORG = GS_ALV-EKORG.

        LWA_PURCHASING-DATA-WAERS = GS_ALV-WAERS. " 货币
        LWA_PURCHASING-DATA-ZTERM = GS_ALV-ZTERM. " 付款条件
*        LWA_PURCHASING-DATA-VERKF = GS_ALV-VERKF. " 销售人
*        LWA_PURCHASING-DATA-TELF1 = GS_ALV-TELF1. " 电话
        LWA_PURCHASING-DATA-WEBRE = GS_ALV-WEBRE. " 标识:基于收货的发票验证
*        LWA_PURCHASING-DATA-EKGRP = GS_ALV-EKGRP. " 采购组

        LWA_PURCHASING-DATA-INCO1   = GS_ALV-INCO1.   "贸易条款 WD
        LWA_PURCHASING-DATA-INCO2_L = GS_ALV-INCO2_L. "国际贸易条款位置 1 WD

        LWA_PURCHASING-DATAX-WAERS = 'X'.
        LWA_PURCHASING-DATAX-ZTERM = 'X'.
        LWA_PURCHASING-DATAX-VERKF = 'X'.
        LWA_PURCHASING-DATAX-TELF1 = 'X'.
        LWA_PURCHASING-DATAX-WEBRE =  'X'.
        LWA_PURCHASING-DATAX-EKGRP = 'X'.

        LWA_PURCHASING-DATAX-INCO1 = 'X'.  "贸易条款 WD
        LWA_PURCHASING-DATAX-INCO2_L = 'X'."国际贸易条款位置 1 WD

*功能

        LWA_FUNCTIONS-TASK = L_TASK.
        LWA_FUNCTIONS-DATA_KEY-PARVW = 'BA'.
        LWA_FUNCTIONS-DATA-PARTNER = L_LIFNR.    " SD业务合作伙伴号
        LWA_FUNCTIONS-DATAX-PARTNER = 'X'.       " SD业务合作伙伴号
        APPEND LWA_FUNCTIONS TO LT_FUNCTIONS.

        LWA_FUNCTIONS-TASK = L_TASK.
        LWA_FUNCTIONS-DATA_KEY-PARVW = 'LF'.
        LWA_FUNCTIONS-DATA-PARTNER = L_LIFNR. "SD业务合作伙伴号
        LWA_FUNCTIONS-DATAX-PARTNER = 'X'.    "SD业务合作伙伴号
        APPEND LWA_FUNCTIONS TO LT_FUNCTIONS.

        LWA_FUNCTIONS-TASK = L_TASK.
        LWA_FUNCTIONS-DATA_KEY-PARVW = 'RS'.
        LWA_FUNCTIONS-DATA-PARTNER = L_LIFNR. "SD业务合作伙伴号
        LWA_FUNCTIONS-DATAX-PARTNER = 'X'. "SD业务合作伙伴号
        APPEND LWA_FUNCTIONS TO LT_FUNCTIONS.

        LWA_PURCHASING-FUNCTIONS-FUNCTIONS = LT_FUNCTIONS.

        APPEND LWA_PURCHASING TO LT_PURCHASING.
        LWA_VEND-PURCHASING_DATA-PURCHASING = LT_PURCHASING.

        APPEND LWA_VEND TO LT_VEND.
        LS_MAIN-VENDORS = LT_VEND.

*&----调用类
        CALL METHOD VMD_EI_API=>MAINTAIN_DIRECT_INPUT
          EXPORTING
*           IV_TEST_RUN              = SPACE
            IS_MASTER_DATA           = LS_MAIN
          IMPORTING
            ES_MASTER_DATA_CORRECT   = LS_COR1 "正确
            ES_MESSAGE_CORRECT       = LS_MESG2
            ES_MASTER_DATA_DEFECTIVE = LS_COR2 "错误
            ES_MESSAGE_DEFECTIVE     = LS_MESG.


        LT_MSG = LS_MESG-MESSAGES.
        DELETE LT_MSG WHERE TYPE = 'W'.
        LOOP AT LT_MSG INTO LWA_MSG.
          IF LWA_MSG-TYPE = 'E' OR LWA_MSG-TYPE = 'A'.
            LV_FLG = 'X'.
            CONCATENATE LWA_MSG-MESSAGE_V1 LWA_MSG-MESSAGE_V2 LWA_MSG-MESSAGE_V3 LWA_MSG-MESSAGE_V4 INTO GS_ALV-MESSAGE.
          ENDIF.
        ENDLOOP.

        IF LV_FLG IS INITIAL.
*          IF GS_ALV-VBUND IS NOT INITIAL.
*            UPDATE BP001 SET VBUND = GS_ALV-VBUND WHERE PARTNER = GS_ALV-LIFNR.
*          ENDIF.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              WAIT = 'X'.
          GS_ALV-ICON = ICON_GREEN_LIGHT.
          LT_EXT = LS_COR1-VENDORS .
          READ TABLE LT_EXT INTO LW_EXT INDEX 1.
          GS_ALV-LIFNR = LW_EXT-HEADER-OBJECT_INSTANCE-LIFNR.
          CONCATENATE '供应商' GS_ALV-LIFNR  '创建成功' INTO GS_ALV-MESSAGE.

        ELSE.
          GS_ALV-LIFNR = ''.
          GS_ALV-ICON = ICON_RED_LIGHT.
          ROLLBACK WORK.

        ENDIF.
      ENDIF.
      MODIFY GT_ALV FROM GS_ALV.
      CLEAR GS_ALV.
    ENDLOOP.
  ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  FRM_INDICATOR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p_1        text
*  <--  p_2        text
*----------------------------------------------------------------------*
FORM FRM_INDICATOR USING P_INDEX.
  "data declaration/进度条变量
  CONSTANTS LC_STEP_WIDTH TYPE I VALUE 1." 5.     "Width of each step
  DATA: LV_STEP       TYPE I VALUE LC_STEP_WIDTH, "current step
*        lv_lines      TYPE i,                    "total records to be processed
        LV_LINESC     TYPE C LENGTH 20,           "total records to be processed of string
        LV_INDEX      TYPE I,                     "current records being processed
        LV_PERCENTAGE TYPE F,                     "percentage of processed records
        LV_REMAINING  TYPE I,                     "remaining records to be processed
        LV_TEXT       TYPE C LENGTH 80,           "info displayed at progress indicator
        LV_START      TYPE TIMESTAMP.             "time stamp of process started

  "process logic
  LV_INDEX = P_INDEX.

  "Initialization
  IF V_FLAG IS INITIAL."sy-batch IS INITIAL.
    V_FLAG = 'X'.
    GET TIME STAMP FIELD LV_START.
  ENDIF.

  "show progress indicator/显示进度条
  IF LV_LINES GE LC_STEP_WIDTH AND LV_INDEX >= LV_STEP.
    ADD LC_STEP_WIDTH TO LV_STEP.
    "当前占比%
    LV_PERCENTAGE = LV_INDEX / LV_LINES * 100.
    "剩余条目数
    LV_REMAINING = LV_LINES - LV_INDEX.
    "数字文本强制转换
    WRITE LV_LINES     TO LV_LINESC LEFT-JUSTIFIED.
    WRITE LV_REMAINING TO LV_TEXT   LEFT-JUSTIFIED.
    "进度条(记录)
    CONCATENATE TEXT-904 "'Processing remaining'(005)
    LV_TEXT
    '/'
    LV_LINESC
    TEXT-905"'items'(007)
    INTO LV_TEXT SEPARATED BY SPACE.
    "时间记录
    PERFORM ESTIMATE_REMAINING_TIME USING LV_START
          LV_INDEX
          LV_LINES
    CHANGING LV_TEXT.
    "SAP GUI 进度条
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        PERCENTAGE = LV_PERCENTAGE
        TEXT       = LV_TEXT.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ESTIMATE_REMAINING_TIME
*&---------------------------------------------------------------------*
*       text 时间设定
*----------------------------------------------------------------------*
*      -->P_LV_START  text
*      -->P_LV_INDEX  text
*      -->P_LV_LINES  text
*      <--P_LV_TEXT  text
*----------------------------------------------------------------------*
FORM ESTIMATE_REMAINING_TIME
USING PV_START TYPE P "timestamp of start processing
      PV_INDEX TYPE I "current record being processed
      PV_TOTAL TYPE I "total number of records to be processed
CHANGING PV_TEXT  TYPE C."text to display remaining time

  "Data declaration/进度条时间变量
  DATA:LV_CURRENT   TYPE TIMESTAMP,    "当前时间戳
       LV_DURATION  TYPE TZNTSTMPL,    "持续时间
       LV_REMAINING TYPE C LENGTH 15,  "剩余时间
       LV_HOURS     TYPE C LENGTH 4,   "换算小时数
       LV_MINUTES   TYPE N LENGTH 2,   "换算分钟数
       LV_SECONDS   TYPE N LENGTH 2.   "换算秒数

  "Get current time stamp/获取当前时间戳
  GET TIME STAMP FIELD LV_CURRENT.
  "calculate execution time (so far)/计算持续时间
  TRY.
      CALL METHOD CL_ABAP_TSTMP=>SUBTRACT
        EXPORTING
          TSTMP1 = LV_CURRENT
          TSTMP2 = PV_START
        RECEIVING
          R_SECS = LV_DURATION.
    CATCH CX_PARAMETER_INVALID_RANGE .                  "#EC NO_HANDLER
    CATCH CX_PARAMETER_INVALID_TYPE .                   "#EC NO_HANDLER
  ENDTRY.

  "estimate remaining execution time/剩余执行时间
  LV_REMAINING = LV_DURATION / PV_INDEX * ( PV_TOTAL - PV_INDEX ).
  "整小时数
  LV_HOURS     = LV_REMAINING DIV 3600.
  "剩余分钟数
  LV_REMAINING = LV_REMAINING MOD 3600.
  "整分钟数
  LV_MINUTES   = LV_REMAINING DIV 60.
  "剩余秒数
  LV_SECONDS   = LV_REMAINING MOD 60.
  "append to the text/文本
  CONCATENATE PV_TEXT
  ' ('
  TEXT-906" 'estimated remaining time:'(006)
  LV_HOURS
  ':'
  LV_MINUTES
  ':'
  LV_SECONDS
  ')'
  INTO PV_TEXT.
ENDFORM. " ESTIMATE_REMAINING_TIME

猜你喜欢

转载自blog.csdn.net/z_x_xing_/article/details/90079218