zoukankan      html  css  js  c++  java
  • DEMO 大全

    1、已开发程序查询

    *&---------------------------------------------------------------------*
    *& Report ZHAVE
    *&---------------------------------------------------------------------*
    *&
    *&---------------------------------------------------------------------*
    REPORT ZHAVE.
    
    
      TABLES: trdir, tstc.
    
      DATA: BEGIN OF gs_data,
              sel   TYPE boolean,     " 用于选择多行
              name  TYPE trdir-name,  " 程序名
              subc  TYPE trdir-subc,  " 程序类型
              rstat TYPE trdir-rstat, " 状态
              tcode TYPE tstc-tcode,  " 事务码
              ttext TYPE tstct-ttext, " 事务码描述
              cnam  TYPE trdir-cnam,  " 创建者
              cdat  TYPE trdir-cdat,  " 创建日期
              unam  TYPE trdir-unam,  " 最后修改人
              udat  TYPE trdir-udat,  " 修改日期
            END OF gs_data.
      DATA: gt_data LIKE TABLE OF gs_data. " ALV显示內表
      DATA: line TYPE i." ALV行数
      " 选择屏幕
      SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
      SELECT-OPTIONS: s_name  FOR trdir-name,            " 程序名
                      s_tcode FOR  tstc-tcode,           " 事务码
                      s_cnam  FOR  trdir-cnam,           " 创建者
                      s_unam  FOR  trdir-unam,           " 最后修改人
                      s_subc  FOR  trdir-subc DEFAULT 1, " 程序类型
                      s_rstat FOR  trdir-rstat.          " 状态
      SELECTION-SCREEN END OF BLOCK b1.
    
      INITIALIZATION.
        %_s_name_%_app_%-text = '程序名'.
        %_s_tcode_%_app_%-text = '事务码'.
        %_s_cnam_%_app_%-text = '创建者'.
        %_s_unam_%_app_%-text = '最后修改人'.
        %_s_subc_%_app_%-text = '程序类型'.
        %_s_rstat_%_app_%-text = '状态'.
        " F8事件
    
      AT SELECTION-SCREEN.
        DATA p_prog TYPE programm .
        DATA: l_rc(5).
        p_prog = sy-repid.
        PERFORM copy_status_diff_progs_new IN PROGRAM saplsmpe IF FOUND
        USING 'X' 'SAPLKKBL' p_prog 'STANDARD_FULLSCREEN' 'STATUS_ALV'
        CHANGING l_rc.
    
      START-OF-SELECTION.
        IF s_name[]  IS INITIAL AND " 程序名
           s_cnam[]  IS INITIAL AND " 创建者
           s_unam[]  IS INITIAL AND " 最后修改人
           s_subc[]  IS INITIAL AND " 程序类型
           s_tcode[] IS INITIAL AND " 事务码
           s_rstat[] IS INITIAL.    " 状态
    
          MESSAGE '请至少输入一个条件!' TYPE 'S' DISPLAY LIKE 'E'.
          EXIT.
        ENDIF.
        PERFORM get_data.
        IF gt_data[] IS INITIAL.
          MESSAGE '无符合条件的记录' TYPE 'S' DISPLAY LIKE 'E'.
          EXIT.
        ENDIF.
        PERFORM alv_data.
    *&---------------------------------------------------------------------*
    *&      Form  get_data
    *&---------------------------------------------------------------------*
    *       text  获取数据
    *----------------------------------------------------------------------*
      FORM get_data.
        DATA: BEGIN OF ls_tstc,
                tcode TYPE tstc-tcode,
                ttext TYPE tstct-ttext,
              END OF ls_tstc.
    
        DATA: lt_tstc LIKE TABLE OF ls_tstc.
        " 输入事务码时
        IF s_tcode[] IS NOT INITIAL.
          SELECT
            a~tcode
            b~name
            b~subc
            b~rstat
            b~cnam
            b~cdat
            b~unam
            b~udat
            c~ttext
            INTO CORRESPONDING FIELDS OF TABLE gt_data
            FROM tstc AS a
            INNER JOIN trdir AS b ON a~pgmna = b~name
            INNER JOIN tstct AS c ON a~tcode = c~tcode
            WHERE a~tcode IN s_tcode
            AND   b~name  IN s_name   " 程序名
            AND   b~cnam  IN s_cnam   " 创建者
            AND   b~unam  IN s_unam   " 最后修改人
          AND   b~subc  IN s_subc   " 程序类型
          AND   b~rstat IN s_rstat. " 状态
        ELSE.
          " 没有输入事务码时
          SELECT
            a~name
            a~subc
            a~rstat
            a~cnam
            a~cdat
            a~unam
            a~udat
            b~tcode
            INTO CORRESPONDING FIELDS OF TABLE gt_data
            FROM trdir AS a
            LEFT JOIN tstc AS b ON a~name  = b~pgmna
            WHERE a~name  IN s_name   " 程序名
            AND   a~cnam  IN s_cnam   " 创建者
            AND   a~unam  IN s_unam   " 最后修改人
          AND   a~subc  IN s_subc   " 程序类型
          AND   a~rstat IN s_rstat. " 状态
    
          IF gt_data[] IS NOT INITIAL.
            " 查询事务码描述文本
            SELECT
              tcode
              ttext
              INTO CORRESPONDING FIELDS OF TABLE lt_tstc
              FROM tstct
            FOR ALL ENTRIES IN gt_data
            WHERE tcode = gt_data-tcode.
            SORT lt_tstc BY tcode." 先排序
            LOOP AT gt_data INTO gs_data.
              READ TABLE lt_tstc INTO ls_tstc WITH KEY tcode = gs_data-tcode BINARY SEARCH.
              IF sy-subrc EQ 0.
                gs_data-ttext = ls_tstc-ttext.
                MODIFY gt_data FROM gs_data TRANSPORTING ttext.
              ENDIF.
            ENDLOOP.
          ENDIF.
        ENDIF.
        " 统计內表行数
        DESCRIBE TABLE gt_data LINES line.
        " 排序
        SORT gt_data BY cnam cdat.
      ENDFORM.                    "get_data
    *&---------------------------------------------------------------------*
    *&      Form  alv_data
    *&---------------------------------------------------------------------*
    *       text 显示ALV数据
    *----------------------------------------------------------------------*
      FORM alv_data.
        DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
              layout   TYPE slis_layout_alv.
        PERFORM get_layout CHANGING layout.   " alv布局
        PERFORM get_fieldcat TABLES fieldcat. " 控制报表显示哪些栏位
        CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
          EXPORTING
            i_callback_program       = sy-repid             " 程序名
            is_layout                = layout               " 布局
    *        i_callback_pf_status_set = 'STATUS_ALV'      " STATUS
    *        i_callback_user_command  = 'USER_COMMAND_FORM'  " 定义按钮的功能
            it_fieldcat              = fieldcat[]           " alv栏目(显示字段)内表
          TABLES
            t_outtab                 = gt_data              " 将内表数据赋给ALV
          EXCEPTIONS
            program_error            = 1
            OTHERS                   = 2.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
      ENDFORM.                    "alv_data
    *&---------------------------------------------------------------------*
    *&      Form  get_layout
    *&---------------------------------------------------------------------*
    *       text  ALV布局设置
    *----------------------------------------------------------------------*
    *      -->C_LAYOUT   text
    *----------------------------------------------------------------------*
      FORM get_layout CHANGING c_layout TYPE slis_layout_alv.
        CLEAR: c_layout.
        c_layout-colwidth_optimize = 'X'." 宽度自动调节
        c_layout-box_fieldname = 'SEL'.  " 选择多行
        c_layout-zebra = 'X'.            " 颜色交替显示
      ENDFORM.                    "get_layout
    *&---------------------------------------------------------------------*
    *&      Form  USER_COMMAND_FORM
    *&---------------------------------------------------------------------*
    *       text  自定义按钮功能
    *----------------------------------------------------------------------*
    *      -->R_UCOMM      text
    *      -->RS_SELFIELD  text
    *----------------------------------------------------------------------*
      FORM user_command_form USING r_ucomm     LIKE sy-ucomm
                                   rs_selfield TYPE slis_selfield.
        READ TABLE gt_data INTO gs_data INDEX rs_selfield-tabindex.
        IF sy-subrc EQ 0 AND gs_data-tcode IS NOT INITIAL.
          CASE r_ucomm.
            WHEN '&IC1'. " 双击事件
              CALL TRANSACTION gs_data-tcode. " 调用事务码,运行程序
            WHEN OTHERS.
          ENDCASE.
        ENDIF.
      ENDFORM.                    "USER_COMMAND_FORM
    *&---------------------------------------------------------------------*
    *&      Form  get_fieldcat
    *&---------------------------------------------------------------------*
    *       text 显示字段
    *----------------------------------------------------------------------*
    *      -->CT_TAB     text
    *----------------------------------------------------------------------*
      FORM get_fieldcat TABLES ct_tab TYPE slis_t_fieldcat_alv.
        DATA: fcat TYPE slis_fieldcat_alv.
        DEFINE add_fcat.
          CLEAR fcat.
          fcat-fieldname       = &1. " 字段名
          fcat-seltext_l       = &2. " 显示字段文本
          fcat-seltext_m       = &2.
          fcat-seltext_s       = &2.
          fcat-key             = &3. " 主键
          fcat-hotspot         = &4. " 链接
          fcat-checkbox        = &5. " 复选框
          fcat-edit            = &6. " 是否可修改
          fcat-ref_tabname     = &7. " 参考表
          fcat-ref_fieldname   = &8. " 参考表字段
          APPEND fcat TO ct_tab.
        END-OF-DEFINITION.
        add_fcat 'NAME'  '程序名'      ''  ''  ''  ''  ''  ''.
        add_fcat 'SUBC'  '程序类型'    ''  ''  ''  ''  'TRDIR'  'SUBC'.
        add_fcat 'RSTAT' '状态'        ''  ''  ''  ''  'TRDIR'  'RSTAT'.
        add_fcat 'TCODE' '事务码'      ''  ''  ''  ''  ''  ''.
        add_fcat 'TTEXT' '事务码描述'  ''  ''  ''  ''  ''  ''.
        add_fcat 'CNAM'  '创建者'  ''  ''  ''  ''  ''  ''.
        add_fcat 'CDAT'  '创建日期'    ''  ''  ''  ''  ''  ''.
        add_fcat 'UNAM'  '最后修改人'  ''  ''  ''  ''  ''  ''.
        add_fcat 'UDAT'  '修改日期'    ''  ''  ''  ''  ''  ''.
      ENDFORM.                    "get_fieldcat
    *&---------------------------------------------------------------------*
    *&      Form  pfstatus_form
    *&---------------------------------------------------------------------*
    *       text  STATUS
    *----------------------------------------------------------------------*
    *      -->RT_EXTAB   text
    *----------------------------------------------------------------------*
      FORM status_alv USING rt_extab TYPE slis_t_extab.
    *  DATA: l_rc(5).
    *  PERFORM copy_status_diff_progs_new IN PROGRAM saplsmpe IF FOUND
    * USING 'X' 'SAPLKKBL' sy-repid 'STANDARD_FULLSCREEN' 'STATUS_ALV'
    * CHANGING l_rc.
    *    SET PF-STATUS 'STATUS_ALV'.         " 工具条
      ENDFORM.                    "pfstatus_form </span>
    View Code

    2、展开BOM

    2.1 单层/多层展开

        IF gt_car_result[] IS NOT INITIAL.
          SELECT
           mast~matnr,
           mast~werks,
           mast~stlnr, "物料清单
           stpo~idnrk,
    
           stpo~menge,
           stko~bmeng,
           stpo~meins
           INTO TABLE @DATA(gt_stpo)
           FROM mast
           INNER JOIN stpo ON stpo~stlnr = mast~stlnr AND stpo~stlty = 'M'
           INNER JOIN stko ON mast~stlnr = stko~stlnr
           FOR ALL ENTRIES IN @gt_car_result
           WHERE  matnr = @gt_car_result-matnr
           AND   mast~werks = @lm_werks AND mast~stlan = '1'.
        ENDIF.
    *&---------------------------------------------------------------------*
    *& Report ZPP_R001
    *&---------------------------------------------------------------------*
    *&
    *&---------------------------------------------------------------------*
    REPORT zsearch MESSAGE-ID zpp.
    
    **********************************************************************
    *引用                                                                *
    **********************************************************************
    TABLES:mast,stko.
    TYPE-POOLS:slis.
    
    **********************************************************************
    *TYPES
    **********************************************************************
    TYPES:BEGIN OF ts_data,
            box        TYPE c LENGTH 1,  "
            stufe      TYPE c LENGTH 5,  "层级
            werks      TYPE mast-werks,  "工厂
            matnr      TYPE mast-matnr,  "产品编码
            char20(20) TYPE c,
            maktx      TYPE makt-maktx,  "产品描述
            stlan      TYPE mast-stlan,  "BOM 用途
            stlal      TYPE mast-stlal,  "可选的 BOM
            stlnr      TYPE mast-stlnr,  "BOM 物料单
            aennr      TYPE stko-aennr,  "更改编码
            datuv      TYPE stko-datuv,  "有效起始日期
            datu1      TYPE stko-datuv,  "有效起始日期
            stktx      TYPE stko-stktx,  "BOM版本
            bmeng      TYPE stko-bmeng,  "基本数量
            bmein      TYPE stko-bmein,  "产品单位
            posnr      TYPE stpo-posnr,  "项目
            idnrk      TYPE stpo-idnrk,  "子件编码
            ojtxp      TYPE char40,      "子件描述
            menge      TYPE stpo-menge,  "子件数量
            meins      TYPE stpo-meins,  "单位
            lgort      TYPE stpo-lgort,
            rekrs      TYPE stpo-rekrs,
            alpgr      TYPE stpo-alpgr,
            alprf      TYPE stpo-alprf,
            alpst      TYPE stpo-alpst,
            ewahr      TYPE stpo-ewahr,
            potx1      TYPE stpo-potx1,
            potx2      TYPE stpo-potx2,
            ausch      TYPE stpo-ausch,
            zzsl       TYPE stpo-menge,
          END OF ts_data.
    
    
    **********************************************************************
    *ALV 定义 和 DATA
    **********************************************************************
    DATA:gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE, "定义列标题(属性信息)
         gs_layout   TYPE slis_layout_alv,
         wa_repid    LIKE sy-repid. "当前程序
    
    DATA:lt_data TYPE STANDARD TABLE OF ts_data WITH HEADER LINE.
    DATA:gt_data TYPE STANDARD TABLE OF ts_data WITH HEADER LINE.
    DATA:lt_mast TYPE STANDARD TABLE OF mast WITH HEADER LINE.
    DATA:lt_stko TYPE STANDARD TABLE OF stko WITH HEADER LINE.
    DATA:lt_stpox LIKE stpox OCCURS 100 WITH HEADER LINE.
    DATA:lt_matcat LIKE cscmat OCCURS 100 WITH HEADER LINE.
    DATA:ls_topmat TYPE cstmat.
    
    ************************************************************************
    * SELECTION-SCREEN
    ************************************************************************
    SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-001.  "选择条件
    SELECT-OPTIONS: s_matnr FOR mast-matnr,                           "产品编码
                    s_werks FOR mast-werks DEFAULT '2000',            "工厂
                    s_stlan FOR mast-stlan,                           "BOM用途
                    s_datuv FOR stko-datuv.                           "有效起始日期
    PARAMETERS:p_dqbb AS CHECKBOX DEFAULT 'X'.                        "当前版本
    
    SELECTION-SCREEN END OF BLOCK bk1.
    
    SELECTION-SCREEN BEGIN OF BLOCK bk2 WITH FRAME TITLE TEXT-004."单层多层
    SELECTION-SCREEN BEGIN OF LINE .
    SELECTION-SCREEN COMMENT 1(4) TEXT-002.
    PARAMETERS:p_danc RADIOBUTTON GROUP cx DEFAULT 'X' .            "单层
    SELECTION-SCREEN COMMENT 10(4) TEXT-003.
    PARAMETERS:p_duoc RADIOBUTTON GROUP cx.                         "多层
    SELECTION-SCREEN END OF LINE.
    
    SELECTION-SCREEN END OF BLOCK bk2.
    
    ***====================================================================*
    *初始化
    ***====================================================================*
    INITIALIZATION.
    
      %C002009_1000 = '单层'.
      %C003011_1000 = '多层'.
      %_p_danc_%_app_%-text = '单层'.
      %_p_dqbb_%_app_%-text = '当前版本'.
      %_p_duoc_%_app_%-text = '多层'.
      %_s_datuv_%_app_%-text = '有效起始日期'.
      %_s_matnr_%_app_%-text = '产品编码'.
      %_s_stlan_%_app_%-text = 'BOM用途'.
      %_s_werks_%_app_%-text = '工厂'.
    ***====================================================================*
    *获取数据
    ***====================================================================*
    START-OF-SELECTION.
      IF p_dqbb IS INITIAL .  "当前版本为空时,以输入日期为条件获取数据,每一条物料的最大日期数据将日期修改为当前日期
        SELECT mast~matnr mast~werks mast~stlan mast~stlnr mast~stlal
             stko~aennr stko~datuv stko~stktx stko~bmeng stko~bmein
          FROM mast
          INNER JOIN stko
          ON mast~stlnr = stko~stlnr
          AND mast~stlal = stko~stlal
          INTO CORRESPONDING FIELDS OF TABLE lt_data
          WHERE mast~matnr IN s_matnr AND mast~werks IN s_werks AND mast~stlan IN s_stlan
            AND stko~datuv IN s_datuv.
        SORT lt_data BY matnr werks datuv DESCENDING.
        LOOP AT lt_data.
          lt_data-datu1 = lt_data-datuv.
          CONCATENATE lt_data-werks lt_data-matnr INTO lt_data-char20.
          MODIFY lt_data TRANSPORTING datu1 char20.
        ENDLOOP.
        SORT lt_data BY char20 datuv DESCENDING.
        LOOP AT lt_data.
          AT NEW char20.
            lt_data-datu1 = sy-datum.
            MODIFY lt_data TRANSPORTING datu1.
          ENDAT.
        ENDLOOP.
      ELSE.                    "当前版本不为空时,以当前日期为条件获取数据
        SELECT mast~matnr mast~werks mast~stlan mast~stlnr mast~stlal
             stko~aennr stko~datuv stko~stktx stko~bmeng stko~bmein
          FROM mast
          INNER JOIN stko
          ON mast~stlnr = stko~stlnr
          AND mast~stlal = stko~stlal
          INTO CORRESPONDING FIELDS OF TABLE lt_data
          WHERE mast~matnr IN s_matnr AND mast~werks IN s_werks AND mast~stlan IN s_stlan
            AND stko~datuv IN s_datuv.
        SORT lt_data BY matnr werks datuv DESCENDING.
        DELETE ADJACENT DUPLICATES FROM lt_data COMPARING matnr werks stlal.
        LOOP AT lt_data.
          lt_data-datu1 = sy-datum.
          MODIFY lt_data TRANSPORTING datu1.
        ENDLOOP.
      ENDIF.
    
      CLEAR:gt_data.
      LOOP AT lt_data.
        IF p_danc = 'X'.  "单层展开
          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
            EXPORTING
              capid                 = 'PP01'           "BOM应用
              datuv                 = lt_data-datu1    "BOM有效期
              mktls                 = 'X'
              mehrs                 = ''               "x表示多层展开﹐space表示只展开第一层
              mtnrv                 = lt_data-matnr    "产品编码/要展开BOM的物料
              svwvo                 = 'X'
              werks                 = lt_data-werks    "物料所在工厂
              vrsvo                 = 'X'
              stlal                 = lt_data-stlal     "物料用途
            IMPORTING
              topmat                = ls_topmat
    *         matcat                = matcat       "下面含有元件的物料存放在该内表
            TABLES
              stb                   = lt_stpox
              matcat                = lt_matcat
            EXCEPTIONS
              alt_not_found         = 1
              material_not_found    = 3
              missing_authorization = 4
              no_bom_found          = 5
              OTHERS                = 9.
    
          IF sy-subrc <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          ENDIF.
          .
          IF sy-subrc <> 0.
    * Implement suitable error handling here
          ENDIF.
        ELSEIF p_duoc = 'X'.     "多层展开
          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
            EXPORTING
              capid                 = 'PP01'           "BOM应用
              datuv                 = lt_data-datu1    "有效起始日
              mktls                 = 'X'
              mehrs                 = 'X'              "多层展开
              mtnrv                 = lt_data-matnr    "产品编码
              svwvo                 = 'X'
              werks                 = lt_data-werks    "物料所在工厂
              vrsvo                 = 'X'
              stlal                 = lt_data-stlal
            IMPORTING
              topmat                = ls_topmat
            TABLES
              stb                   = lt_stpox
              matcat                = lt_matcat
            EXCEPTIONS
              alt_not_found         = 1
              material_not_found    = 3
              missing_authorization = 4
              no_bom_found          = 5
              OTHERS                = 9.
    
          IF sy-subrc <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          ENDIF.
          .
          IF sy-subrc <> 0.
    * Implement suitable error handling here
          ENDIF.
        ENDIF.
    ******************************最后展示数据整理******************8
        LOOP AT lt_stpox.
          gt_data-stufe = lt_stpox-stufe.     "层级
          gt_data-werks = lt_data-werks.      "工厂
          LOOP AT lt_matcat WHERE index = lt_stpox-ttidx.
            gt_data-matnr = lt_matcat-matnr.  "产品编码
            gt_data-stktx = lt_matcat-stktx.    "BOM版本
          ENDLOOP.
          gt_data-maktx = lt_stpox-ojtxb.     "产品描述
          gt_data-stlan = lt_data-stlan.      "BOM用途
          gt_data-stlal = lt_data-stlal.      "可选BOM
          gt_data-aennr = lt_data-aennr.      "更改编码
          gt_data-datuv = lt_data-datuv.      "有效起始日期
    *       gt_data-stktx = ls_topmat-stktx.    "BOM版本
          gt_data-bmeng = ls_topmat-bmeng.    "基本数量
          gt_data-bmein = ls_topmat-bmein.    "产品单位
          gt_data-posnr = lt_stpox-posnr.     "项目
          gt_data-idnrk = lt_stpox-idnrk.     "子件编码
          gt_data-ojtxp = lt_stpox-ojtxp.     "子件描述
          gt_data-menge = lt_stpox-menge.     "子件数量
          gt_data-meins = lt_stpox-meins.     "单位
          gt_data-lgort = lt_stpox-lgort.
          gt_data-rekrs = lt_stpox-rekrs.
          gt_data-alpgr = lt_stpox-alpgr.
          gt_data-alprf = lt_stpox-alprf.
          gt_data-alpst = lt_stpox-alpst.
          gt_data-ewahr = lt_stpox-ewahr.
          gt_data-potx1 = lt_stpox-potx1.
          gt_data-potx2 = lt_stpox-potx2.
          gt_data-ausch = lt_stpox-ausch.
          gt_data-zzsl  = lt_stpox-menge * ( 1 + gt_data-ausch / 100 ).
          APPEND gt_data.
          CLEAR gt_data.
        ENDLOOP.
    
      ENDLOOP.
    
      DESCRIBE TABLE gt_data LINES DATA(lines).
      IF lines < 1.
        MESSAGE s000(zpp) WITH '没有相关单据信息!' DISPLAY LIKE 'W'.
        RETURN.
      ELSE.
        MESSAGE s000(zpp) WITH '共查询到记录' lines '条.' DISPLAY LIKE 'S'.
      ENDIF.
    
    **************************ALV输出布局********************************
      gs_layout-zebra = 'X'.
      gs_layout-colwidth_optimize = 'X'.
      gs_layout-box_fieldname = 'BOX'.
      wa_repid    = sy-repid.
    
    **************************ALV输出字段设置****************************
    *  DATA LV_POS TYPE I .
      REFRESH gt_fieldcat.
      CLEAR gt_fieldcat.
    *  CLEAR lv_pos.
    
      DEFINE %%append_fieldcat.
    *    lv_pos = lv_pos + 1.
    *    gs_fieldcat-col_pos = lv_pos.
        gt_fieldcat-fieldname = &1."字段名
        gt_fieldcat-seltext_l = &2."文本
        IF gt_fieldcat-fieldname = 'BOX'.
          gt_fieldcat-checkbox = 'X'.
        ENDIF.
        IF gt_fieldcat-fieldname = 'MATNR'.
          gt_fieldcat-ref_tabname = 'MARA'.
          gt_fieldcat-ref_fieldname = 'MATNR'.
          gt_fieldcat-no_zero = 'X'.
        ENDIF.
        IF gt_fieldcat-fieldname = 'IDNRK'.
          gt_fieldcat-ref_tabname = 'MARA'.
          gt_fieldcat-ref_fieldname = 'MATNR'.
          gt_fieldcat-no_zero = 'X'.
        ENDIF.
        IF gt_fieldcat-fieldname = 'EWAHR'.
          gt_fieldcat-no_zero = 'X'.
        ENDIF.
        IF gt_fieldcat-fieldname = 'BMEIN'.
          gt_fieldcat-ref_tabname = 'STKO'.
          gt_fieldcat-ref_fieldname = 'BMEIN'.
        ENDIF.
        IF gt_fieldcat-fieldname = 'MEINS'.
          gt_fieldcat-ref_tabname = 'STPO'.
          gt_fieldcat-ref_fieldname = 'MEINS'.
        ENDIF.
        APPEND gt_fieldcat.
        CLEAR gt_fieldcat.
      END-OF-DEFINITION.
    
      %%append_fieldcat:
    *    'BOX'  'SELECT',
        'STUFE' '层级',
        'WERKS' '工厂',
        'MATNR' '产品编码',
        'MAKTX' '产品描述',
        'STLAN' 'BOM用途',
        'STLAL' '可选BOM',
        'AENNR' '更改编码',
        'DATUV' '有效起始日期',
        'STKTX' 'BOM版本',
        'BMENG' '基本数量',
        'BMEIN' '产品单位',
        'POSNR' '项目',
        'IDNRK' '子件编码',
        'OJTXP' '子件描述',
        'MENGE' '子件数量',
        'MEINS' '单位',
        'LGORT' '生产库存地点',
        'REKRS' '递归允许',
        'ALPGR' '替代项目组',
        'ALPRF' '优先级',
        'ALPST' '策略',
        'EWAHR' '使用可能性%',
        'POTX1' '净含量',
        'POTX2' '出品率',
        'AUSCH' '物料损耗%',
        'ZZSL' '子件总数量'.
    
    
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          i_callback_program       = wa_repid
          i_callback_pf_status_set = 'FRM_USER_STATUS' "USER_COMMAND
          i_callback_user_command  = 'FRM_USER_COMMAND'
          is_layout                = gs_layout
          i_save                   = 'X'
          it_fieldcat              = gt_fieldcat[]
        TABLES
          t_outtab                 = gt_data[]
        EXCEPTIONS
          program_error            = 1
          OTHERS                   = 2.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2.
        EXIT.
      ENDIF.
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_user_status
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->EXTAB      text
    *----------------------------------------------------------------------*
    FORM frm_user_status USING extab TYPE slis_t_extab.
      SET PF-STATUS '1000_STATUS'.
    ENDFORM.                    "frm_user_status
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_user_command
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->R_UCOMM      text
    *      -->RS_SELFIELD  text
    *----------------------------------------------------------------------*
    FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                                 rs_selfield TYPE slis_selfield.
    
      CASE r_ucomm.
        WHEN 'BCAK' OR 'CANCEL' OR 'EXIT' OR 'ESC'.
          LEAVE TO SCREEN 0.
      ENDCASE.
    
    ENDFORM.                    "frm_user_command
    View Code

    2.2 按版本和用途展开

    *&---------------------------------------------------------------------*
    *& Report  ZRCO0034_SUB
    *&
    *&---------------------------------------------------------------------*
    *&产品工艺BOM报表
    *&
    *&---------------------------------------------------------------------*
    
    REPORT  zrco0034_sub.
    
    
    
    TABLES: mkal,stko.
    
    
    
    DATA: BEGIN OF wa_bom OCCURS 0,
      matnr    LIKE mkal-matnr,
      werks    LIKE mkal-werks,
      verid    LIKE mkal-verid,
      maktx    LIKE makt-maktx,
    END OF wa_bom.
    DATA: BEGIN OF gt_bom OCCURS 0,
      matnr    LIKE mara-matnr,
      werks    LIKE mseg-werks,
      stlal    LIKE mkal-stlal,  "  BOM用途
      stlan    LIKE mkal-stlan,  "  可选Bom
    END OF gt_bom.
    DATA: BEGIN OF wa_out OCCURS 0,
      stlan    LIKE stpox-stlan,      "  BOM类别
      stlal    LIKE stpox-stlal,
      verid    LIKE mkal-verid,
      matnr    LIKE mkal-matnr,       "  成品物料号
      maktx    LIKE makt-maktx,       "  物料描述
      menge    LIKE stpox-mngko,      "  基本数量
      stufe    LIKE stpox-stufe,      "  展开层
      posnr    LIKE stpox-posnr,      "  项目
      idnrk    LIKE stpox-idnrk,      "  组建物料
      ojtxp    LIKE stpox-ojtxp,      "  组建描述
      meins    LIKE stpox-meins,      "  单位
      mngko    LIKE stpox-mngko,      "  组建数量
      mnglg    LIKE stpox-mnglg,      "  组建数量
    *** 增加 recipe 和 合并项目文本 TRY 20190305 begin ***
      recipe   LIKE stpox-mnglg,      "  recipe用量
    *  potx     TYPE char80,           "  合并项目文本   "add by LIUJIE 2020/08/24 注释
      potx     TYPE string,           "  合并项目文本   "add by LIUJIE 2020/08/24 增加
      potx_a     TYPE string,           "  合并项目文本   "add by LIUJIE 2020/08/24 增加
    *** 增加 recipe 和 合并项目文本 TRY 20190305 end ***
      potx1    LIKE stpox-potx1,                                "  项目文本1
      potx2    LIKE stpox-potx2,                                "  项目文本2
      kausf    LIKE stpox-kausf,      "  组建报废
      ausch    LIKE stpox-ausch,      "  组件报废(项目)
      avoau    LIKE stpox-avoau,      "  工序废品
      bausf    LIKE stpox-bausf,      "  装配报废
      sanka    LIKE stpox-sanka,      "  成本关联
      alpgr    LIKE stpox-alpgr,      "  替代组
    *  ewahr    LIKE stpox-ewahr,      "  使用概率
      mtart    LIKE stpox-mtart,      "  物料类型
      werks    LIKE stpox-werks,      "  工厂
      datuv    LIKE stpox-datuv,      "  有效自
      aennr    LIKE stpox-aennr,      "  更改编号
      andat    LIKE stpox-andat,      "  创建日期
      annam    LIKE stpox-annam,      "  创建者
      aedat    LIKE stpox-aedat,      "  更改日期
      aenam    LIKE stpox-aenam,      "  更改者
      stlnr    LIKE mast-stlnr,       "  物料单
      alpos    LIKE stpox-alpos,      "  替代项目
      ewahr    LIKE stpox-ewahr,      "  使用的可能性
      box      TYPE c,
    END OF wa_out.
    DATA: gt_out LIKE wa_out OCCURS 0 WITH HEADER LINE.
    DATA: lt_stb LIKE stpox OCCURS 0 WITH HEADER LINE.
    
    DATA:l_stkoz LIKE stko-stkoz.
    
    SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE text-t01.
    SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(7) func1 FOR FIELD p_func1.
    PARAMETERS: p_func1 RADIOBUTTON GROUP f1 DEFAULT 'X'
    USER-COMMAND z05.
    SELECTION-SCREEN COMMENT 30(7) func2 FOR FIELD p_func2.
    PARAMETERS: p_func2 RADIOBUTTON GROUP f1.
    SELECTION-SCREEN END OF LINE.
    SELECTION-SCREEN: END OF BLOCK blk1.
    
    
    SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
    PARAMETERS:    p_werks LIKE mkal-werks OBLIGATORY DEFAULT '1000'
    MODIF ID fu1.
    SELECT-OPTIONS: s_matnr FOR  mkal-matnr MODIF ID fu1,
    s_verid FOR  mkal-verid MODIF ID fu1.
    PARAMETERS:     p_datuv LIKE stko-datuv OBLIGATORY DEFAULT sy-datum
    MODIF ID fu1.
    SELECTION-SCREEN: END OF BLOCK b1.
    
    
    SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE t2.
    PARAMETERS:   p_werks1 LIKE mkal-werks OBLIGATORY DEFAULT '1000'
    MODIF ID fu2.
    SELECT-OPTIONS: s_matnr1 FOR  mkal-matnr MODIF ID fu2,
    s_stlal1 FOR mkal-stlal MODIF ID fu2,
    s_stlan1 FOR mkal-stlan MODIF ID fu2.
    PARAMETERS:     p_datuv1 LIKE stko-datuv OBLIGATORY DEFAULT sy-datum
    MODIF ID fu2.
    SELECTION-SCREEN: END OF BLOCK b2.
    
    INITIALIZATION.
      func1 = '按生产版本查找'.
      func2 = '按BOM用途查找'.
    
    
      %_p_datuv_%_app_%-text = '有效起始日期'.
      %_p_datuv1_%_app_%-text = '有效起始日期'.
      %_p_werks_%_app_%-text = '工厂'.
      %_p_werks1_%_app_%-text = '工厂'.
      %_s_matnr_%_app_%-text = '物料'.
      %_s_matnr1_%_app_%-text = '物料'.
      %_s_stlal1_%_app_%-text = '可选的BOM'.
      %_s_stlan1_%_app_%-text = 'BOM用途'.
      %_s_verid_%_app_%-text = '生产版本'.
    
    AT SELECTION-SCREEN OUTPUT.
      LOOP AT SCREEN.
        IF (  p_func1 EQ 'X' AND screen-group1 EQ 'FU2' )
        OR ( p_func2 EQ 'X' AND screen-group1 EQ 'FU1' ).
          screen-active = '0'.
          MODIFY SCREEN.
        ENDIF.
      ENDLOOP.
    
    START-OF-SELECTION.
    ***********add by linxq 20150324  增加权限
      PERFORM frm_auth_check.
    *******
    
      IF p_func1 = 'X'.
        PERFORM get_bom_data. " 按工艺路线展Bom
      ELSE.
        PERFORM get_bom_data_usage." 按用途展Bom
      ENDIF.
      PERFORM frm_prapare_output.
      PERFORM frm_fill_layout USING ''.
      PERFORM frm_init_field_len
      USING: 'T1' 'STLAN'  'BOM类别'                '2',
            'T1' 'STLAL'  '可选BOM'                '2',
            'T1' 'VERID'  '生产版本'               '4',
            'T1' 'MATNR'  '物料'                   '18',
            'T1' 'MAKTX'  '物料描述'               '30',
            'T1' 'MENGE'  '基本数量'               '10',
            'T1' 'STUFE'  '展开层'                 '2',
            'T1' 'POSNR'  '项目'                   '4',
    *             'T1' 'ALPOS'  '替代项目',
    *             'T1' 'EWAHR'  '使用的可能性',
            'T1' 'IDNRK'  '组件'                   '18',
            'T1' 'OJTXP'  '组件描述'                '30',
            'T1' 'MEINS'  '单位'                    '4',
            'T1' 'MNGLG'  '组件数量'                '10',
    *** 增加recipe和合并项目文本字段 TRY 20190305 BEGIN ***
            'T1' 'RECIPE'  'RECIPE数量'             '10',
            'T1' 'POTX'    '合并项目文本'            '80',
    *** 增加recipe和合并项目文本字段 TRY 20190305 END ***
            'T1' 'POTX1'  '项目文本1'                '30',
            'T1' 'POTX2'  '项目文本2'                 '30',
            'T1' 'KAUSF'  '组件报废'                 '4',
            'T1' 'AUSCH'  '组件报废(项目)'          '4',
            'T1' 'AVOAU'  '工序废品'                 '4',
            'T1' 'BAUSF'  '装配报废'                 '4',
            'T1' 'SANKA'  '成本关联'                 '4',
            'T1' 'ALPGR'  ''                       '4',
            'T1' 'EWAHR'  '使用频率'                 '4',
            'T1' 'MTART'  '物料类型'                 '10',
            'T1' 'WERKS'  '工厂'                     '4',
            'T1' 'DATUV'  '有效自'                   '10',
            'T1' 'AENNR'  '更改编号'                 '10',
            'T1' 'ANDAT'  '创建日期'                 '8',
            'T1' 'ANNAM'  '创建者'                  '10',
            'T1' 'AEDAT'  '更改日期'                 '8',
            'T1' 'AENAM'  '更改者'                   '10'.
    
      PERFORM frm_print_alv TABLES wa_out USING '' ''.
    *&---------------------------------------------------------------------*
    *&      Form  get_bom_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM get_bom_data.  "  按工艺路线展Bom
    *********"ADD BY LIUJIE 2020/08/24  增加 BEGIN
      DATA:l_txt01 TYPE string,"
            l_txt02 TYPE string,"
            l_potx TYPE string.   "
    
      DATA: t_tline TYPE TABLE OF tline WITH HEADER LINE.
      DATA: lv_tline TYPE string.
    *********"ADD BY LIUJIE 2020/08/24  增加 END
    
      SELECT * INTO CORRESPONDING FIELDS OF TABLE wa_bom
      FROM mkal WHERE matnr IN s_matnr AND werks = p_werks
      AND verid IN s_verid.
    
      LOOP AT wa_bom.
        SELECT SINGLE maktx INTO wa_bom-maktx FROM makt
        WHERE matnr = wa_bom-matnr AND spras = '1'.
        MODIFY wa_bom.
      ENDLOOP.
    
      LOOP AT wa_bom.
        REFRESH lt_stb. CLEAR lt_stb.
        CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
        EXPORTING
          capid                 = 'PP01'
          datuv                 = p_datuv
    *      auskz                 = 'X'
          mehrs                 = 'X'
          ehndl                 = '1'
    *      emeng                 = 1000
          mtnrv                 = wa_bom-matnr
          verid                 = wa_bom-verid
          werks                 = p_werks
        TABLES
          stb                   = lt_stb
        EXCEPTIONS
          alt_not_found         = 1
          call_invalid          = 2
          material_not_found    = 3
          missing_authorization = 4
          no_bom_found          = 5
          no_plant_data         = 6
          no_suitable_bom_found = 7
          conversion_error      = 8
          OTHERS                = 9.
    
        CLEAR lt_stb.
        LOOP AT lt_stb WHERE stlan = '1' OR stlan = '2' OR stlan = '8'  OR stlan = '7' .
          MOVE-CORRESPONDING lt_stb TO wa_out.
          wa_out-matnr = wa_bom-matnr.
          wa_out-maktx = wa_bom-maktx.
          wa_out-verid = wa_bom-verid.
    ******* ADD BY LIUJIE  2020/08/24 BEGIN
          FREE:t_tline,lv_tline.
          CALL FUNCTION 'ZRFC_CO_GET_BOM_TXT'
            EXPORTING
              i_stlnr = lt_stb-stlnr
              i_stlkn = lt_stb-stlkn
              i_stpoz = lt_stb-stpoz
              i_stlty = lt_stb-stlty
            TABLES
              t_tline = t_tline.
          IF t_tline[] IS NOT INITIAL.
            LOOP AT t_tline.
              CONCATENATE t_tline-tdline  lv_tline INTO lv_tline.
            ENDLOOP.
            CONDENSE lv_tline NO-GAPS.
            CONCATENATE l_potx lv_tline INTO l_potx.
            CONDENSE l_potx NO-GAPS.
            wa_out-potx_a  = l_potx.
          ENDIF.
    ********ADD BY LIUJIE  2020/08/24 END
    
    
          APPEND wa_out.CLEAR wa_out.
        ENDLOOP.
    
    *    SORT wa_out BY matnr.
    
      ENDLOOP.
    
      LOOP AT wa_out.
    ***************add by fayne 2019-03-28
        wa_out-recipe = wa_out-menge.
    *************end
        SELECT SINGLE stlnr INTO wa_out-stlnr
        FROM mast WHERE matnr = wa_out-matnr.
        CLEAR:wa_out-menge.
        SELECT bmeng INTO wa_out-menge
        FROM stko WHERE stlnr = wa_out-stlnr.
        ENDSELECT.
    *    IF wa_out-alpos IS NOT INITIAL.
    *      wa_out-mnglg = wa_out-mnglg * wa_out-ewahr / 100.
    *    ENDIF.
    *** 增加recipe和合并项目文本字段 TRY 20190305 BEGIN ***
    *    wa_out-recipe = wa_out-mnglg * wa_out-ewahr / 100."MARK BY fayne 2019-03-28
        CONCATENATE wa_out-potx1 wa_out-potx2 INTO wa_out-potx.
    ******** ADD BY LIUJIE  2020/08/24 BEGIN
        IF wa_out-potx_a IS  NOT INITIAL.
          CONCATENATE wa_out-potx wa_out-potx_a INTO wa_out-potx.
        ENDIF.
    ******** ADD BY LIUJIE  2020/08/24 end
    *** 增加recipe和合并项目文本字段 TRY 20190305 END ***
        MODIFY wa_out.
      ENDLOOP.
    *  SORT gt_out.
    *  DELETE ADJACENT DUPLICATES FROM gt_out COMPARING ALL FIELDS.
    
    ENDFORM.                    "get_bom_data
    
    *&---------------------------------------------------------------------*
    *&      Form  get_bom_data_usage
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM get_bom_data_usage.  " 按Bom用途展BOM
      SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_bom
      FROM mast WHERE matnr IN s_matnr1 AND stlan IN s_stlan1
      AND stlal IN s_stlal1 AND werks = p_werks1.
      SORT gt_bom.
      DELETE ADJACENT DUPLICATES FROM gt_bom COMPARING ALL FIELDS.
      LOOP AT gt_bom.
        REFRESH lt_stb.CLEAR lt_stb.
        CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
          EXPORTING
            capid                 = 'PP01'
            datuv                 = p_datuv1
            mehrs                 = 'X'
            ehndl                 = '1'
            mtnrv                 = gt_bom-matnr
            werks                 = p_werks1
            stlal                 = gt_bom-stlal
            stlan                 = gt_bom-stlan
          TABLES
            stb                   = lt_stb
          EXCEPTIONS
            alt_not_found         = 1
            call_invalid          = 2
            material_not_found    = 3
            missing_authorization = 4
            no_bom_found          = 5
            no_plant_data         = 6
            no_suitable_bom_found = 7
            conversion_error      = 8
            OTHERS                = 9.
    
        CLEAR lt_stb.
        LOOP AT lt_stb WHERE stlan = '1' OR stlan = '2' OR stlan = '8' OR stlan = '7'.
          MOVE-CORRESPONDING lt_stb TO wa_out.
          wa_out-matnr = gt_bom-matnr.
          APPEND wa_out.CLEAR wa_out.
        ENDLOOP.
    
      ENDLOOP.
      LOOP AT wa_out.
    ***************add by fayne 2019-03-28
        wa_out-recipe = wa_out-menge.
    *************end
    
        SELECT SINGLE stlnr INTO wa_out-stlnr FROM mast
        WHERE matnr = wa_out-matnr.
        SELECT SINGLE maktx INTO wa_out-maktx FROM makt
        WHERE matnr = wa_out-matnr AND spras = '1'.
    *    SELECT SINGLE bmeng INTO wa_out-menge FROM stko
    *      WHERE stlnr = wa_out-stlnr.
        CLEAR wa_out-menge.
        SELECT bmeng INTO wa_out-menge FROM stko
        WHERE stlnr = wa_out-stlnr.
        ENDSELECT.
    *     IF wa_out-alpos IS NOT INITIAL.
    *       wa_out-mnglg = wa_out-mnglg * wa_out-ewahr / 100.
    *     ENDIF.
    *** 增加recipe和合并项目文本字段 TRY 20190305 BEGIN ***
    *    wa_out-recipe = wa_out-mnglg * wa_out-ewahr / 100. "MARK BY fayne 2019-03-28
        CONCATENATE wa_out-potx1 wa_out-potx2 INTO wa_out-potx.
    *** 增加recipe和合并项目文本字段 TRY 20190305 END ***
        MODIFY wa_out.
      ENDLOOP.
    ENDFORM.                    "get_bom_data_usage
    *&---------------------------------------------------------------------*
    *&      Form  FRM_AUTH_CHECK
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM frm_auth_check .
      AUTHORITY-CHECK OBJECT 'C_AFKO_AWA'
      ID 'WERKS' FIELD p_werks.
      IF sy-subrc NE 0.
        MESSAGE '账号没有此工厂的权限!' TYPE 'E'.
      ENDIF.
    
      DATA: mes TYPE string.
    
      AUTHORITY-CHECK OBJECT 'Z_ZTH_WRK'
      ID '' FIELD ''.
      IF sy-subrc = 0.
        AUTHORITY-CHECK OBJECT 'Z_ZTH_WRK'
        ID 'WERKS' FIELD p_werks.
        IF sy-subrc <> 0.
          CONCATENATE '无工厂权限' p_werks INTO mes.
          MESSAGE mes TYPE 'E' DISPLAY LIKE 'E'.
        ENDIF.
      ENDIF.
    
    
    ENDFORM.                    " FRM_AUTH_CHECK
    
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_prapare_output
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM frm_prapare_output.
      LOOP AT wa_out.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            input  = wa_out-idnrk
          IMPORTING
            output = wa_out-idnrk.
        MODIFY wa_out.
    
      ENDLOOP.
    
    ENDFORM.                    "frm_prapare_output
    
    
    *&-ALV输出-子程序
    *&---------------------------------------------------------------------*
    *& TABLES:
    *&---------------------------------------------------------------------*
    TYPE-POOLS: slis.
    DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
          gs_fieldcat LIKE LINE OF gt_fieldcat,
          gs_layout   TYPE slis_layout_alv,
          gt_events   TYPE slis_t_event,
          gs_events   LIKE LINE OF gt_events.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_INIT_FIELD
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_0071   text
    *      -->P_0072   text
    *      -->P_0073   text
    *----------------------------------------------------------------------*
    FORM frm_init_field USING pr_tabname
          pr_field
          pr_fieldlabel.
    *                           pr_fieldoutputlen.
      CLEAR gs_fieldcat.
      gs_fieldcat-tabname = pr_tabname.
      gs_fieldcat-fieldname = pr_field.
      gs_fieldcat-seltext_m = pr_fieldlabel.
      gs_fieldcat-just      = 'L'.
    
      IF pr_field = 'BOX'.
        gs_fieldcat-edit = 'X'.
        gs_fieldcat-checkbox = 'X'.
      ENDIF.
    
    *  gs_fieldcat-outputlen = pr_fieldoutputlen.
      APPEND gs_fieldcat TO gt_fieldcat.
    ENDFORM.                    " FRM_INIT_FIELD
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_INIT_FIELD
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PR_TABNAME     text
    *      -->PR_FIELD       text
    *      -->PR_FIELDLABEL  text
    *----------------------------------------------------------------------*
    FORM frm_init_field_matnr USING pr_tabname
          pr_field
          pr_fieldlabel.
    *                           pr_fieldoutputlen.
      CLEAR gs_fieldcat.
      gs_fieldcat-tabname = pr_tabname.
      gs_fieldcat-fieldname = pr_field.
      gs_fieldcat-seltext_m = pr_fieldlabel.
    
      gs_fieldcat-just = 'L'.
      IF pr_field = 'MATNR'.
        gs_fieldcat-intlen = '18'.
        gs_fieldcat-outputlen = '18'.
      ENDIF.
    *  gs_fieldcat-outputlen = pr_fieldoutputlen.
      APPEND gs_fieldcat TO gt_fieldcat.
    ENDFORM.                    "FRM_INIT_FIELD
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_init_field_len
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PR_TABNAME         text
    *      -->PR_FIELD           text
    *      -->PR_FIELDLABEL      text
    *      -->PR_FIELDOUTPUTLEN  text
    *----------------------------------------------------------------------*
    FORM frm_init_field_len USING pr_tabname
          pr_field
          pr_fieldlabel
          pr_fieldoutputlen.
      CLEAR gs_fieldcat.
      gs_fieldcat-tabname = pr_tabname.
      gs_fieldcat-fieldname = pr_field.
      gs_fieldcat-seltext_m = pr_fieldlabel.
      gs_fieldcat-just      = 'L'.
      gs_fieldcat-outputlen = pr_fieldoutputlen.
      APPEND gs_fieldcat TO gt_fieldcat.
    ENDFORM.                    " FRM_INIT_FIELD
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_init_field_edit
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PR_TABNAME     text
    *      -->PR_FIELD       text
    *      -->PR_FIELDLABEL  text
    *      -->PR_EDIT        text
    *----------------------------------------------------------------------*
    FORM frm_init_field_edit USING pr_tabname
          pr_field
          pr_fieldlabel
          pr_edit.
    *                           pr_fieldoutputlen.
      CLEAR gs_fieldcat.
      gs_fieldcat-tabname = pr_tabname.
      gs_fieldcat-fieldname = pr_field.
      gs_fieldcat-seltext_l = pr_fieldlabel.
      gs_fieldcat-edit = pr_edit.
    
      gs_fieldcat-just = 'L'.
    *  gs_fieldcat-outputlen = pr_fieldoutputlen.
      APPEND gs_fieldcat TO gt_fieldcat.
    ENDFORM.                    " FRM_INIT_FIELD
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_init_field_edit_all
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PR_TABNAME         text
    *      -->PR_FIELD           text
    *      -->PR_FIELDLABEL      text
    *      -->PR_EDIT            text
    *      -->PR_FIELDOUTPUTLEN  text
    *----------------------------------------------------------------------*
    FORM frm_init_field_edit_all USING pr_tabname
          pr_field
          pr_fieldlabel
          pr_edit
          pr_fieldoutputlen.
      CLEAR gs_fieldcat.
      gs_fieldcat-tabname = pr_tabname.
      gs_fieldcat-fieldname = pr_field.
      gs_fieldcat-seltext_l = pr_fieldlabel.
      gs_fieldcat-edit = pr_edit.
    
      gs_fieldcat-just = 'L'.
      gs_fieldcat-outputlen = pr_fieldoutputlen.
      APPEND gs_fieldcat TO gt_fieldcat.
    ENDFORM.                    " FRM_INIT_FIELD
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_FILL_LAYOUT
    *&---------------------------------------------------------------------*
    *       ALV参数定义
    *----------------------------------------------------------------------*
    *      -->PR_BOX    Checkbox
    *----------------------------------------------------------------------*
    FORM frm_fill_layout USING pr_box.
      CLEAR:gt_events[],gs_events,gs_layout.
    
      gs_layout-colwidth_optimize = 'X'.    " 自动收缩
      IF pr_box IS NOT INITIAL.
        gs_layout-box_fieldname = pr_box.
      ENDIF.
    ENDFORM.                    " FRM_FILL_LAYOUT
    *&---------------------------------------------------------------------*
    *&      Form  FRM_PRINT_ALV
    *&---------------------------------------------------------------------*
    *       ALV参数定义
    *----------------------------------------------------------------------*
    *      -->PT_ALV      输出表结构
    *      -->PR_SET      Status
    *      -->PR_command  User command
    *----------------------------------------------------------------------*
    FORM frm_print_alv TABLES gt_alv
    USING pr_set
          pr_command.
      DATA: l_set TYPE slis_formname,
            l_command TYPE slis_formname.
    
      l_set = pr_set.
      l_command = pr_command.
    
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    *  call function 'REUSE_ALV_LIST_DISPLAY'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = l_set
        i_callback_user_command  = l_command
        is_layout                = gs_layout
        it_fieldcat              = gt_fieldcat
        "      it_events                = gt_events
        i_save                   = 'A'
    *      i_grid_title             = l_title
      TABLES
        t_outtab                 = gt_alv
      EXCEPTIONS
        program_error            = 1
        OTHERS                   = 2.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDFORM.                    " FRM_FILL_PRINT_ALV
    
    
    
    
    *FUNCTION ZRFC_CO_GET_BOM_TXT.
    **"----------------------------------------------------------------------
    **"*"Local interface:
    **"  IMPORTING
    **"     VALUE(I_STLNR) TYPE  STNUM OPTIONAL
    **"     VALUE(I_STLKN) TYPE  STLKN OPTIONAL
    **"     VALUE(I_STPOZ) TYPE  CIM_COUNT OPTIONAL
    **"     VALUE(I_STLTY) TYPE  STLTY OPTIONAL
    **"  TABLES
    **"      T_TLINE STRUCTURE  TLINE
    **"----------------------------------------------------------------------
    *
    *
    *  DATA:LWA_LINE TYPE CSLTX_LINE.
    *  DATA:LIT_TLINE      TYPE STANDARD TABLE OF TLINE WITH HEADER LINE,
    *        LWA_TLINE      TYPE TLINE,
    *        LWA_TEXTHEADER TYPE THEAD.
    *  DATA: BEGIN OF LWA_HTEXT,
    *    TDOBJECT LIKE THEAD-TDOBJECT,
    *    TDNAME   LIKE THEAD-TDNAME,
    *    TDID     LIKE THEAD-TDID,
    *    TDSPRAS  LIKE THEAD-TDSPRAS.
    *  DATA: END OF LWA_HTEXT.
    *  DATA:LV_DD TYPE I.
    ** Fill textheader
    *  CLEAR LWA_HTEXT.
    *  LWA_HTEXT-TDID         = 'MPO'.
    *  LWA_HTEXT-TDSPRAS      = SY-LANGU.
    *  LWA_HTEXT-TDOBJECT     = 'BOM'.
    *  LWA_HTEXT-TDNAME(3)    = SY-MANDT.
    *  LWA_HTEXT-TDNAME+3(1)  = I_STLTY. "BOM category
    *  LWA_HTEXT-TDNAME+4(8)  = I_STLNR. "Bill of material
    *  LWA_HTEXT-TDNAME+12(8) = I_STLKN. "BOM item node number
    *  LWA_HTEXT-TDNAME+20(8) = I_STPOZ. "Internal counter
    *
    ** read longtext into table textlines
    *  CALL FUNCTION 'READ_TEXT'
    *  EXPORTING
    *    ID       = LWA_HTEXT-TDID
    *    LANGUAGE = LWA_HTEXT-TDSPRAS
    *    NAME     = LWA_HTEXT-TDNAME
    *    OBJECT   = LWA_HTEXT-TDOBJECT
    *  IMPORTING
    *    HEADER   = LWA_TEXTHEADER
    *  TABLES
    *    LINES    = LIT_TLINE
    *  EXCEPTIONS
    *    OTHERS   = 1.
    *  LOOP AT LIT_TLINE.
    *    LV_DD = LV_DD + 1.
    *    IF LV_DD < 3.
    *      DELETE LIT_TLINE.
    *    ENDIF.
    *  ENDLOOP.
    *  APPEND LINES OF LIT_TLINE TO T_TLINE.
    *
    *
    *
    *ENDFUNCTION.
    View Code

    3、业务伙伴/供应商/工厂创建 批导

    ADRC
    ADR2
    ADR6
    LFA1
    LFB1
    LFC1
    LFM1
    LFBK
    T001

    https://www.cnblogs.com/sapSB/articles/10033270.html

    ** 根据伙伴GUID取出下一个能用的 编码
    ***********************************************************************

    修改的时候报错,与这个有关  创建时候 是新的guid,修改的时候 要找出原来的guid addresses-data_key-guid
      SELECT
      SINGLE address_guid
      INTO  @DATA(lv_addrguid)
      FROM  but020
      WHERE  partner = @lv_kunnr.

    BP的bapi用这个函数RFC_CVI_EI_INBOUND_MAIN会比CVI_EI_INBOUND_MAIN好理解

       1 *&---------------------------------------------------------------------*
       2 *& Report ZSDB_002
       3 *&---------------------------------------------------------------------*
       4 *&
       5 *&---------------------------------------------------------------------*
       6 REPORT zsdb_002.
       7 
       8 TABLES:sscrfields.
       9 INCLUDE <icon>.
      10 DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE.
      11 *       messages of call transaction
      12 DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
      13 TABLES: t100.
      14 DATA: g_line TYPE i .
      15 DATA : v_line  TYPE i.            "Record number
      16 PARAMETERS: p_typ TYPE ctu_mode  AS LISTBOX OBLIGATORY DEFAULT 'N' VISIBLE LENGTH 20,
      17             p_upd TYPE ctu_update  AS LISTBOX OBLIGATORY DEFAULT 'S' VISIBLE LENGTH 20.
      18 *DATA:p_typ TYPE ctu_mode VALUE 'N',
      19 *     p_upd TYPE ctu_update  VALUE 'S'..
      20 DATA: gv_error(1),error_flag(1).
      21 TYPES:BEGIN OF ty_structure ,
      22 
      23         werks(10), "门店代码
      24         name1(040),"门店名称码
      25         financial(020),"财务部门
      26         pstlz(020),"邮编地区
      27         sort1(020),"(检索项)
      28         zone1(020),"门店地址
      29         regio(020),"所在省份
      30         cityc(020),"所在城市
      31         office_district(020),"行政区
      32         pp(020),"品牌
      33         mdsx(020),"门店属性
      34         tax_number(020),"税号
      35         bukrs(020),"贸易伙伴
      36         telephone(020),"电话
      37         bankl(020),"银行编号
      38         bankn(020),"银行帐户号码
      39         zhz(020),"账户组
      40         bahne(020),"配送中心编码
      41         bahns(020)," 门店自采供应商
      42         sales_region(020),"销售区域
      43         receipt(010),"发票方
      44         payer(010),"付款方
      45         limit_rule(020),"风险类
      46         check_rule(020),"检查规则
      47         credit_sgmnt(020),"信用段
      48         credit_limit(020),"信用额度(限制)
      49 
      50         katr2(020),"门店属性
      51         checkbox             TYPE c,
      52         light                TYPE icon_d,
      53         znum                 TYPE i,
      54         msgtp(1),
      55         msg(250) ,
      56       END OF ty_structure,
      57       ty_data TYPE  ty_structure.
      58 
      59 DATA gt_data TYPE TABLE OF ty_data.
      60 DATA gs_data TYPE ty_data.
      61 DATA gt_excel TYPE TABLE OF ty_structure.
      62 DATA gs_excel TYPE   ty_structure.
      63 DATA gt_zsd_b_md LIKE TABLE OF zsd_b_md WITH HEADER LINE.
      64 
      65 DATA :gt_t005u LIKE TABLE OF t005u WITH HEADER LINE.
      66 DATA :gt_t005s LIKE TABLE OF t005s WITH HEADER LINE.
      67 DATA bapi_ret TYPE bapiret2 OCCURS 10 WITH HEADER LINE.
      68 "ALV
      69 DATA:gt_fieldcat TYPE lvc_t_fcat, "定义列标题(属性信息)
      70      gs_layout   TYPE lvc_s_layo,
      71      gs_fieldcat TYPE lvc_s_fcat, "定义对象
      72 
      73      wa_repid    LIKE sy-repid, "当前程序
      74      gs_title    TYPE lvc_title.
      75 
      76 SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-s01.
      77 PARAMETERS p_file TYPE rlgrap-filename MODIF ID imp.
      78 *PARAMETERS p_wl RADIOBUTTON GROUP gp1.
      79 *PARAMETERS p_khwl RADIOBUTTON GROUP gp1.
      80 *PARAMETERS p_dqwl RADIOBUTTON GROUP gp1.
      81 SELECTION-SCREEN END OF BLOCK blk1.
      82 SELECTION-SCREEN: FUNCTION KEY 1."WISE-WANGM 20190816
      83 
      84 INITIALIZATION.
      85   sscrfields-functxt_01 = '下载模板'.
      86   %_p_typ_%_app_%-text = '处理模式'.
      87   %_p_upd_%_app_%-text = '更新模式'.
      88 
      89 AT SELECTION-SCREEN OUTPUT.
      90 *  LOOP AT SCREEN.
      91 *    IF screen-group1 = 'MD1'.
      92 *      screen-active = '0'.
      93 *      MODIFY SCREEN.
      94 *    ENDIF.
      95 *  ENDLOOP.
      96 
      97 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
      98   CALL METHOD zcl_bc_excel=>f4_file_excel
      99 *    EXPORTING
     100 *    iv_file_filter = 'Excel(*.xlsm)'
     101     CHANGING
     102       cv_file_name = p_file.
     103 
     104 AT SELECTION-SCREEN.
     105   CASE sscrfields-ucomm.
     106     WHEN 'FC01'.
     107       PERFORM frm_down_template.
     108   ENDCASE.
     109 
     110 START-OF-SELECTION.
     111   IF p_file IS INITIAL.
     112     MESSAGE s000(zmm) WITH '请填入文件路径' DISPLAY LIKE 'E'.
     113     RETURN.
     114   ENDIF.
     115   PERFORM start_of_selection.
     116 
     117 
     118 END-OF-SELECTION.
     119   PERFORM check_data.
     120   PERFORM alv_display.
     121 
     122 *&---------------------------------------------------------------------*
     123 *& Form START_OF_SELECTION
     124 *&---------------------------------------------------------------------*
     125 *& text
     126 *&---------------------------------------------------------------------*
     127 *& -->  p1        text
     128 *& <--  p2        text
     129 *&---------------------------------------------------------------------*
     130 FORM start_of_selection .
     131   PERFORM upload_excel.
     132 ENDFORM.
     133 *&---------------------------------------------------------------------*
     134 *& Form FRM_DOWN_TEMPLATE
     135 *&---------------------------------------------------------------------*
     136 *& text
     137 *&---------------------------------------------------------------------*
     138 *& -->  p1        text
     139 *& <--  p2        text
     140 *&---------------------------------------------------------------------*
     141 FORM frm_down_template .
     142 
     143   DATA: lv_objid TYPE wwwdatatab-objid VALUE 'ZSD002'.
     144   DATA: lv_default_file_name TYPE string.
     145   DATA: lv_rc TYPE sy-subrc.
     146   DATA: lv_filepath TYPE string.
     147 
     148 *  CONCATENATE '门店主数据批导模板-' sy-datum+0(8) sy-timlo+0(4)
     149   CONCATENATE '门店主数据批导模板-' sy-datum+0(8)
     150         INTO lv_default_file_name.
     151 
     152   CALL METHOD zcl_bc_excel=>download_web_object
     153     EXPORTING
     154       iv_relid             = 'MI'
     155       iv_objid             = lv_objid
     156       iv_default_file_name = lv_default_file_name
     157     IMPORTING
     158       ev_rc                = lv_rc
     159       ev_filepath          = lv_filepath.
     160   IF lv_rc <> 0.
     161     MESSAGE i398(00) WITH '模板文件' lv_objid '下载失败或被取消'.
     162     RETURN.
     163   ENDIF.
     164 
     165 ENDFORM.
     166 *&---------------------------------------------------------------------*
     167 *& Form UPLOAD_EXCEL
     168 *&---------------------------------------------------------------------*
     169 *& text
     170 *&---------------------------------------------------------------------*
     171 *& -->  p1        text
     172 *& <--  p2        text
     173 *&---------------------------------------------------------------------*
     174 FORM upload_excel .
     175   DATA lv_filename TYPE string.
     176   DATA :l_sheetname TYPE string.
     177   lv_filename = p_file.
     178   l_sheetname = '门店基本信息'.
     179   CALL FUNCTION 'ZBC_UPLOAD_EXCEL_OLE'
     180     EXPORTING
     181       pi_filename    = lv_filename
     182       pi_sheetname   = l_sheetname
     183       pi_startline   = '3'
     184       pi_startcolumn = '2'
     185     TABLES
     186       pt_tab         = gt_excel
     187     EXCEPTIONS
     188       open_file_err  = 1
     189       OTHERS         = 2.
     190   IF sy-subrc <> 0.
     191     MESSAGE e003(zbc) WITH sy-msgv1 sy-msgv2.
     192   ELSE.
     193     SORT gt_excel.
     194   ENDIF.
     195 ENDFORM.
     196 *&---------------------------------------------------------------------*
     197 *& Form ALV_DISPLAY
     198 *&---------------------------------------------------------------------*
     199 *& text
     200 *&---------------------------------------------------------------------*
     201 *& -->  p1        text
     202 *& <--  p2        text
     203 *&---------------------------------------------------------------------*
     204 FORM alv_display .
     205 *&---------------------------------------------------------------------*
     206   gs_layout-zebra = 'X'. "ALV表格按斑马线条纹显示
     207   gs_layout-cwidth_opt = 'X'. "
     208   gs_layout-no_merging = 'X'.
     209   wa_repid    = sy-repid.
     210 
     211   PERFORM frm_fcat_build.
     212 
     213   SORT gt_data BY msgtp ASCENDING werks ASCENDING.
     214   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
     215     EXPORTING
     216       i_callback_program       = wa_repid
     217       i_callback_pf_status_set = 'PF_STATUS_SET' "USER_COMMAND
     218       i_callback_user_command  = 'FRM_USER_COMMAND'
     219       i_grid_title             = gs_title
     220 *     I_GRID_SETTINGS          =
     221       is_layout_lvc            = gs_layout
     222       it_fieldcat_lvc          = gt_fieldcat[]
     223       i_save                   = 'U'
     224     TABLES
     225       t_outtab                 = gt_data[]
     226     EXCEPTIONS
     227       program_error            = 1
     228       OTHERS                   = 2.
     229   IF sy-subrc <> 0.
     230     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     231     WITH sy-msgv1 sy-msgv2.
     232     EXIT.
     233   ENDIF.
     234 ENDFORM.
     235 *&---------------------------------------------------------------------*
     236 *&      Form  PF_STATUS_SET
     237 *&---------------------------------------------------------------------*
     238 *      用户命令
     239 *----------------------------------------------------------------------*
     240 *  -->  p1        text
     241 *  <--  p2        text
     242 *----------------------------------------------------------------------*
     243 FORM pf_status_set USING pi_rt_extab TYPE slis_t_extab.
     244   SET PF-STATUS 'STANDARD'.
     245 ENDFORM.
     246 *&---------------------------------------------------------------------*
     247 *&      Form  USER_COMMAND
     248 *&---------------------------------------------------------------------*
     249 *       为ALV定制事件
     250 *----------------------------------------------------------------------*
     251 *  -->  r_ucomm
     252 *  <--  rs_selfield
     253 *----------------------------------------------------------------------*
     254 FORM frm_user_command USING r_ucomm LIKE sy-ucomm
     255                   rs_selfield TYPE slis_selfield.
     256   DATA: l_guid TYPE REF TO cl_gui_alv_grid.
     257   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     258     IMPORTING
     259       e_grid = l_guid.
     260 
     261   CALL METHOD l_guid->check_changed_data.
     262   IF sy-subrc <> 0.
     263     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     264                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
     265   ENDIF.
     266 
     267   CASE r_ucomm.
     268     WHEN '&ALL0'.
     269       LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_res>) WHERE checkbox = ''.
     270         <fs_res>-checkbox = 'X'.
     271       ENDLOOP.
     272       UNASSIGN <fs_res>.
     273     WHEN '&SAL0'.
     274       LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE checkbox = 'X'.
     275         <fs_data>-checkbox = ''.
     276       ENDLOOP.
     277       UNASSIGN <fs_data>.
     278     WHEN 'BACK'.
     279       LEAVE TO SCREEN 0.
     280     WHEN 'EXIT'.
     281       LEAVE PROGRAM.
     282     WHEN 'BATCH'."
     283       DATA:lv_fmname    TYPE rs38l_fnam.
     284       CLEAR v_line.
     285       DESCRIBE TABLE gt_data LINES v_line.
     286       IF v_line = 0.
     287         MESSAGE '没有上传数据,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
     288         EXIT.
     289       ENDIF.
     290       DATA(lv_lines) = lines( gt_data ).
     291       DATA lv_cs TYPE i.
     292 
     293       PERFORM import_belnr.
     294 
     295   ENDCASE.
     296 
     297   rs_selfield-refresh = 'X'.
     298   rs_selfield-row_stable = 'X'.
     299   rs_selfield-col_stable = 'X'.
     300 ENDFORM.
     301 *&---------------------------------------------------------------------*
     302 *& Form FRM_FCAT_BUILD
     303 *&---------------------------------------------------------------------*
     304 *& text
     305 *&---------------------------------------------------------------------*
     306 *& -->  p1        text
     307 *& <--  p2        text
     308 *&---------------------------------------------------------------------*
     309 FORM frm_fcat_build .
     310   DATA lv_pos TYPE i .
     311   REFRESH gt_fieldcat.
     312   CLEAR gs_fieldcat.
     313   CLEAR lv_pos.
     314   DEFINE %%append_fieldcat.
     315     lv_pos = lv_pos + 1.
     316     gs_fieldcat-col_pos = lv_pos.
     317     gs_fieldcat-fieldname = &1."字段名
     318     gs_fieldcat-coltext = &2."文本
     319     gs_fieldcat-no_zero = &3."去掉前导零
     320     gs_fieldcat-just = &4."
     321 *    gs_fieldcat-ref_field = &4."
     322 *    gs_fieldcat-ref_table = &5."
     323    CASE gs_fieldcat-fieldname.
     324       WHEN 'WERKS'.
     325       gs_fieldcat-key = 'X'.
     326       WHEN 'CHECKBOX'.
     327       gs_fieldcat-checkbox = 'X'.
     328       gs_fieldcat-edit = 'X'.
     329       gs_fieldcat-key = 'X'.
     330     ENDCASE.
     331 
     332     APPEND gs_fieldcat TO gt_fieldcat.
     333     CLEAR gs_fieldcat.
     334   END-OF-DEFINITION.
     335   %%append_fieldcat:
     336     'CHECKBOX ' '选择框' '' 'L' ,
     337 *    'LIGHT ' '指示灯' '' 'L' ,
     338     'MSGTP ' '消息类型' '' 'L' ,
     339     'MSG'   '消息' '' 'L',
     340     'WERKS' '门店代码' '' 'L'  ,
     341      'NAME1' '门店名称码' '' 'L',
     342      'FINANCIAL' '财务部门' '' 'L',
     343      'SORT1'   '检索项' '' '',
     344      'ZONE1'   '门店地址' '' '',
     345      'REGIO'   '所在省份' '' '',
     346      'CITYC'   '所在城市' '' '',
     347      'OFFICE_DISTRICT'   '行政区' '' '',
     348      'PP'   '品牌' '' '',
     349      'MDSX'   '门店属性' '' '',
     350      'TAX_NUMBER'   '税号' '' '',
     351       'BUKRS'   '贸易伙伴' '' '',
     352       'TELEPHONE'   '电话' '' '',
     353       'BANKL'   '银行编号' '' '',
     354       'BANKN'   '银行帐户号码' '' '',
     355       'ZHZ'   '账户组' '' '',
     356       'BAHNE'   '配送中心编码' '' '',
     357       'BAHNS'   '门店自采供应商' '' '',
     358       'SALES_REGION'   '销售区域' '' '',
     359       'RECEIPT'   '发票方' '' '',
     360       'CREDIT_SGMNT'   '信用段' '' '',
     361       'LIMIT_RULE'   '风险类' '' '',
     362       'CHECK_RULE'   '检查规则' '' '',
     363       'CREDIT_LIMIT'   '信用额度(限制)' '' ''.
     364 
     365 ENDFORM.
     366 
     367 FORM bdc_transaction USING tcode CHANGING p_fs TYPE ty_structure.
     368   DATA: l_mstring(480).
     369   DATA: l_subrc LIKE sy-subrc.
     370 *  gs_data = CORRESPONDING #( p_fs ).
     371 * call transaction using
     372   REFRESH messtab.
     373   CALL TRANSACTION tcode USING bdcdata
     374                    MODE   p_typ
     375                    UPDATE p_upd
     376                    MESSAGES INTO messtab.
     377   l_subrc = sy-subrc.
     378   READ TABLE messtab WITH KEY msgtyp = 'E'.
     379   IF sy-subrc EQ 0.
     380     p_fs-werks = p_fs-werks .
     381     p_fs-msgtp = 'E' .
     382     p_fs-light = '@0A@'.
     383 
     384     SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra
     385                               AND   arbgb = messtab-msgid
     386                               AND   msgnr = messtab-msgnr.
     387     IF sy-subrc = 0.
     388       l_mstring = t100-text.
     389       IF l_mstring CS '&1'.
     390         REPLACE '&1' WITH messtab-msgv1 INTO l_mstring.
     391         REPLACE '&2' WITH messtab-msgv2 INTO l_mstring.
     392         REPLACE '&3' WITH messtab-msgv3 INTO l_mstring.
     393         REPLACE '&4' WITH messtab-msgv4 INTO l_mstring.
     394       ELSE.
     395         REPLACE '&' WITH messtab-msgv1 INTO l_mstring.
     396         REPLACE '&' WITH messtab-msgv2 INTO l_mstring.
     397         REPLACE '&' WITH messtab-msgv3 INTO l_mstring.
     398         REPLACE '&' WITH messtab-msgv4 INTO l_mstring.
     399       ENDIF.
     400       CONDENSE l_mstring.
     401       p_fs-msg = l_mstring .
     402     ELSE.
     403       p_fs-msg = '记录创建失败,请检查数据'.
     404     ENDIF.
     405 
     406   ELSE .
     407     p_fs-werks = p_fs-werks .
     408     p_fs-msgtp = 'S' .
     409     p_fs-light = '@08@'.
     410     p_fs-msg = '记录已创建'.
     411   ENDIF.
     412 
     413   REFRESH bdcdata.
     414 
     415 ENDFORM.                    "BDC_TRANSACTION
     416 *&---------------------------------------------------------------------*
     417 *&      Form  progress_indicator
     418 *&---------------------------------------------------------------------*
     419 *       text
     420 *----------------------------------------------------------------------*
     421 *      -->P_SY_TABIX text
     422 *----------------------------------------------------------------------*
     423 FORM progress_indicator  USING    p_sy_tabix.
     424 
     425   DATA: s_string TYPE string,
     426         pernt(6) TYPE p DECIMALS 2,
     427         percc(6) TYPE c,
     428         l_idx(6) TYPE c.
     429   v_line = v_line + 1.
     430   pernt = p_sy_tabix / v_line  * 100.
     431   percc+0(5) = pernt.
     432   percc+5(1) = '%'.
     433   l_idx = p_sy_tabix.
     434   CONCATENATE '正在读取第' l_idx '笔数据.......' INTO s_string SEPARATED BY space.
     435   CONDENSE s_string.
     436 
     437   CONDENSE s_string.
     438   CALL FUNCTION 'PROGRESS_INDICATOR'
     439     EXPORTING
     440       i_text               = '&1 &3 &4  &2 '
     441       i_msgv1              = percc
     442       i_msgv2              = s_string
     443 *     i_msgv3              = record-massg_006
     444 *     i_msgv4              = record-plans_008
     445       i_processed          = v_line
     446       i_total              = p_sy_tabix
     447       i_output_immediately = 'X'.
     448 ENDFORM.                    " progress_indicator
     449 *&---------------------------------------------------------------------*
     450 *& Form CHECK_DATA
     451 *&---------------------------------------------------------------------*
     452 *& text
     453 *&---------------------------------------------------------------------*
     454 *& -->  p1        text
     455 *& <--  p2        text
     456 *&---------------------------------------------------------------------*
     457 FORM check_data .
     458 
     459   LOOP AT gt_excel INTO gs_excel.
     460     gs_data = CORRESPONDING #( gs_excel ).
     461     CONDENSE gs_excel-regio.
     462     gs_data-receipt = |{ gs_data-receipt ALPHA = IN }|.
     463     gs_data-payer = |{ gs_data-payer ALPHA = IN }|.
     464     SELECT SINGLE bland INTO gs_data-regio FROM t005u WHERE spras = '1' AND land1 = 'CN' AND bezei = '广东'.
     465 *    gs_data-msgtp = 'S'.
     466     APPEND gs_data TO gt_data.
     467     CLEAR:gs_data,gs_excel.
     468   ENDLOOP.
     469 
     470 ENDFORM.
     471 *&---------------------------------------------------------------------*
     472 *& Form IMPORT_BELNR
     473 *&---------------------------------------------------------------------*
     474 *& text
     475 *&---------------------------------------------------------------------*
     476 *& -->  p1        text
     477 *& <--  p2        text
     478 *&---------------------------------------------------------------------*
     479 FORM import_belnr .
     480   DATA:s_n   TYPE c LENGTH 20,
     481        s_i   TYPE c LENGTH 20,
     482        t_msg TYPE char80.
     483   s_n = lines( gt_excel ).
     484   CONDENSE s_n.
     485   IF line_exists( gt_data[ checkbox = 'X' ] ).
     486   ELSE.
     487     MESSAGE '请至少选择一条单据操作' TYPE 'S' DISPLAY LIKE 'E'.
     488     RETURN.
     489   ENDIF.
     490 
     491   LOOP AT gt_data INTO gs_data WHERE checkbox IS NOT INITIAL.
     492     s_i = sy-tabix.
     493     CONDENSE s_i.
     494     CONCATENATE '正在导入数据........' s_i '/' s_n INTO t_msg .
     495 
     496     PERFORM show_process USING 70 t_msg.
     497 
     498     PERFORM bapi_create.
     499 
     500 
     501 
     502     IF gs_data-msgtp NE 'E'AND gs_data-mdsx = '2A'..
     503       PERFORM zbdc_wb01."创建工厂
     504     ENDIF.
     505 
     506 
     507     IF gs_data-msgtp NE 'E' AND gs_data-mdsx NE '2A'.
     508       PERFORM zbdc_credit_management."信贷管理
     509     ENDIF.
     510 
     511     gt_zsd_b_md = CORRESPONDING #( gs_data ).
     512     APPEND gt_zsd_b_md.CLEAR gt_zsd_b_md.
     513     MODIFY gt_data FROM gs_data.
     514     CLEAR gs_data.
     515   ENDLOOP.
     516 
     517   MODIFY zsd_b_md FROM TABLE gt_zsd_b_md.
     518 
     519 ENDFORM.
     520 *&---------------------------------------------------------------------*
     521 *& Form SHOW_PROCESS
     522 *&---------------------------------------------------------------------*
     523 *& text
     524 *&---------------------------------------------------------------------*
     525 *&      --> P_70
     526 *&      --> T_MSG
     527 *&---------------------------------------------------------------------*
     528 FORM show_process USING upct TYPE i
     529                         text TYPE char80.
     530 
     531   cl_progress_indicator=>progress_indicate(
     532           EXPORTING
     533              i_text               = | { upct }% { text }  |
     534              i_processed          = upct
     535              i_total              = 100
     536              i_output_immediately = abap_true  ).
     537 
     538 ENDFORM.
     539 *&---------------------------------------------------------------------*
     540 *& Form BAPI_CREATE
     541 *&---------------------------------------------------------------------*
     542 *& text
     543 *&---------------------------------------------------------------------*
     544 *& -->  p1        text
     545 *& <--  p2        text
     546 *&---------------------------------------------------------------------*
     547 FORM bapi_create .
     548   DATA lt_t005h TYPE t005h OCCURS 0 WITH HEADER LINE.
     549   DATA l_bezei TYPE t005h-bezei.
     550 
     551 *-----创建/修改供应商(BP)通用数据BAPI定义
     552   DATA lv_bptyp TYPE bapibus1006_head.
     553 
     554   DATA:lv_bpartner TYPE bapibus1006_head-bpartner.            "业务伙伴编号
     555   DATA:lv_partn_cat TYPE bapibus1006_head-partn_cat.          "业务伙伴类别
     556   DATA:lv_partn_grp TYPE bapibus1006_head-partn_grp.             "业务伙伴分组
     557   DATA:ls_central TYPE bapibus1006_central.                     "中心数据
     558   DATA:ls_central_organ TYPE bapibus1006_central_organ.   "中心数据(组织)
     559   DATA:ls_address TYPE bapibus1006_address.                     "地址数据
     560 *  DATA:lv_bpartner TYPE bapibus1006_head-bpartner.           "生成的BP业务伙伴编号
     561   DATA:ls_telefondata LIKE bapiadtel,
     562        lt_telefondata LIKE TABLE OF bapiadtel.     "电话数据
     563   DATA lv_guid TYPE but020-guid.
     564   "角色
     565   DATA lv_role LIKE bapibus1006_head-partnerrole.
     566   "返回结构
     567   DATA ps_return TYPE zlifnr_return_s.
     568 *  data ls_return TYPE bapiret2.
     569   "供应商
     570   DATA:lv_lifnr TYPE lifnr.      "创建或修改的供应商
     571   "银行代号
     572   DATA:lv_bankl TYPE bnka-bankl. "银行代号 https://blog.csdn.net/qq_25689069/article/details/72329269
     573   "地区
     574   DATA lv_bland TYPE t005u-bland.
     575 
     576 *取城市代码对应文本
     577   CLEAR l_bezei.
     578   SELECT SINGLE bezei
     579          INTO l_bezei
     580          FROM t005h
     581     WHERE spras = '1'
     582       AND cityc = gs_data-cityc.
     583 
     584 * BP Type
     585   CLEAR lv_bptyp.
     586   lv_bptyp-partn_cat = '2'. ""Organizatio
     587   lv_bptyp-partn_grp = 'Z000'. ""Grouping  账户组
     588   lv_bptyp-bpartner = gs_data-werks. ""业务伙伴编号
     589 
     590 * Central Data
     591   CLEAR ls_central.
     592   ls_central-searchterm1 = gs_data-sort1."检索项
     593   ls_central-title_key = '3000'."标题
     594   ls_central-partnerexternal = gs_data-financial."财务门店编码
     595 * bapi_data-partnerexternal = itab-bpext. ""External ID
     596 
     597 * Organization Data
     598   CLEAR ls_central_organ.
     599   ls_central_organ-name1 = gs_data-name1."门店名称码
     600 
     601 * Address Data
     602   CLEAR ls_address.
     603   ls_address-city = gs_data-cityc.""城市
     604   ls_address-postl_cod1 = gs_data-pstlz."邮编
     605   ls_address-country = 'CN'."国家
     606   ls_address-region = gs_data-regio."地区(省/自治区/直辖市、市、县) 广东
     607 *  ls_address-region = gs_data-region."
     608   ls_address-street = gs_data-zone1."街道/门牌号 (门店地址)
     609 *    ls_address-region = gs_data-office_district."所在省份
     610   ls_address-langu = '1'."语言
     611 
     612 * Telephone Data
     613   CLEAR ls_telefondata. REFRESH lt_telefondata.
     614   ls_telefondata-telephone = gs_data-telephone.
     615   APPEND  ls_telefondata TO lt_telefondata.
     616   CLEAR ls_telefondata.
     617 * Save central data
     618   CLEAR bapi_ret. REFRESH bapi_ret.
     619   CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA'
     620     EXPORTING
     621       businesspartnerextern   = lv_bptyp-bpartner
     622       partnercategory         = lv_bptyp-partn_cat "业务伙伴类型
     623       partnergroup            = lv_bptyp-partn_grp "业务伙伴分组
     624       centraldata             = ls_central
     625       centraldataorganization = ls_central_organ
     626       addressdata             = ls_address
     627     IMPORTING
     628       businesspartner         = lv_bpartner
     629     TABLES
     630       telefondata             = lt_telefondata
     631 *     faxdata                 = bapi_adfax
     632 *     e_maildata              = bapi_adsmtp
     633       return                  = bapi_ret.
     634 * Verify return
     635   CLEAR gv_error.
     636 
     637   LOOP AT bapi_ret.
     638     IF bapi_ret-type = 'E' OR bapi_ret-type =  'A'.
     639       gv_error = 'X'.
     640       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
     641       CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'.
     642       CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'.
     643       CLEAR lv_bpartner.
     644       gs_data-msgtp = bapi_ret-type.
     645       IF gs_data-msg IS INITIAL.
     646         gs_data-msg = bapi_ret-message.
     647         CONCATENATE gs_data-msg bapi_ret-message_v1 INTO gs_data-msg SEPARATED BY '/'.
     648       ELSE.
     649         CONCATENATE gs_data-msg bapi_ret-message INTO gs_data-msg SEPARATED BY '/'.
     650       ENDIF.
     651     ENDIF.
     652   ENDLOOP.
     653 
     654 * Error goto next record
     655   IF NOT gv_error IS INITIAL.
     656     EXIT.
     657   ENDIF.
     658 
     659 * Gets GUID for business partner
     660   CLEAR bapi_ret.
     661   REFRESH bapi_ret.
     662 *  lv_bpartner =  gs_data-bukrs.
     663 
     664   CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS'
     665     EXPORTING
     666       businesspartner        = lv_bpartner
     667     IMPORTING
     668       businesspartnerguidout = lv_guid
     669     TABLES
     670       return                 = bapi_ret.
     671 * Verify return
     672   CLEAR gv_error.
     673   LOOP AT bapi_ret.
     674     IF bapi_ret-type = 'E' OR bapi_ret-type =  'A'.
     675       gv_error = 'X'.
     676       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
     677       CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'.
     678       CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'.
     679       CLEAR: lv_bpartner.
     680       gs_data-msgtp = bapi_ret-type.
     681       IF gs_data-msg IS INITIAL.
     682         gs_data-msg = bapi_ret-message.
     683       ELSE.
     684         CONCATENATE gs_data-msg bapi_ret-message INTO gs_data-msg SEPARATED BY '/'.
     685       ENDIF.
     686     ENDIF.
     687   ENDLOOP.
     688 
     689 * Error goto next record
     690   IF NOT gv_error IS INITIAL.
     691     EXIT.
     692   ENDIF.
     693 *&---------------------------------------------------------------------*
     694 *  添加角色 公司代码 TB003A
     695   CLEAR lv_role.
     696   MOVE 'FLCU00' TO lv_role.
     697   PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data.
     698 
     699   MOVE 'FLVN01' TO lv_role.
     700   PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data.
     701 
     702   MOVE 'FLVN00' TO lv_role.
     703   PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data.
     704 
     705   MOVE 'FLCU01' TO lv_role.
     706   PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data.
     707 
     708 *----------------------
     709 *  MOVE 'BPSITE' TO lv_role.
     710 *  PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data.
     711 *----------------------
     712 * Error goto next record
     713   IF NOT gv_error IS INITIAL.
     714     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
     715     CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'.
     716     CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'.
     717     EXIT.
     718   ENDIF.
     719 
     720 * Execute external Commit
     721   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
     722     EXPORTING
     723       wait = 'X'.
     724   CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'.
     725   CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'.
     726 
     727 
     728   gs_data-msgtp = 'S'.
     729   IF gs_data-msg IS INITIAL.
     730     gs_data-msg =  '门店通用数据创建成功!'.
     731   ENDIF.
     732 
     733   "提交
     734   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
     735     EXPORTING
     736       wait = 'X'.
     737 *-----------------------修改创建特定数据----------------------*
     738 *  CHECK ps_data-bukrs IS NOT INITIAL.
     739   "扩充(创建/修改)公司代码数据(表)
     740   "扩充(创建/修改)采购数据(表)
     741   DATA:ls_master_data TYPE cmds_ei_main.
     742   DATA:ls_master_data_correct TYPE cmds_ei_main.
     743   DATA:ls_message_correct TYPE cvis_message.
     744   DATA:ls_master_data_defective TYPE cmds_ei_main.
     745   DATA:ls_message_defective TYPE cvis_message.
     746 
     747   DATA:ls_vendors TYPE cmds_ei_extern.             "外部复杂接口 客户的复合外部接口
     748 
     749   DATA:ls_header TYPE cmds_ei_header.              "外部复杂接口 客户抬头结构
     750   DATA:ls_central_data TYPE cmds_ei_central_data.  "外部复杂接口 客户中心数据
     751   DATA:ls_company_data TYPE cmds_ei_cmd_company.   "外部复杂接口 客户公司代码数据
     752   DATA:ls_purchasing_data TYPE vmds_ei_vmd_purchasing. "外部复杂接口 供应商采购数据
     753   DATA:ls_cmd_sales_data TYPE cmds_ei_cmd_sales. "外部复杂接口 销售数据
     754 
     755   DATA:ls_company TYPE cmds_ei_company.        "公司代码数据
     756   DATA:ls_sales TYPE cmds_ei_sales.        "销售数据
     757   DATA:ls_purchasing TYPE vmds_ei_purchasing.  "采购数据
     758 
     759   DATA: it_functions TYPE cmds_ei_functions_t,
     760         is_functions TYPE cmds_ei_functions,          "外部接口:合作伙伴角色
     761         is_bank      TYPE cvis_ei_cvi_bankdetail.           " 银行数据
     762 
     763 *  DATA: it_functions TYPE vmds_ei_functions_t,
     764 *        is_functions TYPE vmds_ei_functions.           "外部接口:合作伙伴角色
     765 
     766   DATA:ls_messages_vmd TYPE bapiret2,
     767        lt_messages_vmd TYPE TABLE OF bapiret2.  "返回消息
     768 
     769   DATA:lv_company_task TYPE vmd_ei_object_task.   "更改标识(I创建,U更改,M创建/更改,C,当前状态)
     770   DATA:lv_purchasing_task TYPE vmd_ei_object_task.   "更改标识(I创建,U更改,M创建/更改,C,当前状态)
     771   DATA:lv_task TYPE vmd_ei_object_task.   "更改标识(I创建,U更改,M创建/更改,C,当前状态)
     772 *  DATA:lv_lifnr TYPE lifnr.      "创建或修改的供应商
     773   DATA ls_tax TYPE cmds_ei_tax_ind.
     774   DATA ls_bank TYPE cvis_ei_cvi_bankdetail.
     775   DATA ls_bahne TYPE cmds_ei_cmd_central.
     776   DATA ls_central_ktokd TYPE cmds_ei_cmd_central. ":中心客户数据
     777 *  DATA:ps_return TYPE zlifnr_return_s.
     778   DATA l_kunnr TYPE kunnr.
     779   DATA lt_cbukrs TYPE TABLE OF cmds_ei_company_key.
     780   DATA ls_bukrs TYPE   cmds_ei_company_key.
     781   DATA ls_cbukrs TYPE   cmds_ei_company_key.
     782 
     783   DATA l_partner(10) TYPE c.
     784   DATA l_cbukrs(10) TYPE c.
     785 *&---------------------------------------------------------------------*
     786 *  通用数据-----> 维护供应商分组
     787   "数据检查
     788 *  ps_data-lifnr = lv_bpartner. "供应商和合作伙伴得号码一致
     789   lv_task = 'M'.     "M创建/更改
     790   "抬头数据
     791   CLEAR l_cbukrs.
     792 
     793   CLEAR l_kunnr.
     794   CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'   "前缀补零
     795     EXPORTING
     796       input  = gs_data-werks
     797     IMPORTING
     798       output = l_kunnr.
     799   CLEAR l_partner.
     800 *  CONCATENATE '000009' l_cbukrs INTO l_partner.
     801   l_partner = gs_data-werks."ck
     802 
     803 *--------ck
     804   SELECT  * INTO CORRESPONDING FIELDS OF TABLE lt_cbukrs  FROM t001
     805      WHERE bukrs = '5100'  or bukrs =  '5200'..
     806 
     807   l_cbukrs = '2000'.
     808 *--------
     809 *  IF l_cbukrs = '2000'.
     810   ls_header-object_instance-kunnr = l_kunnr.  "客户编号
     811   ls_header-object_task = 'M'.                "更改标识
     812   ls_vendors-header = ls_header.
     813 
     814   "中心数据
     815   ls_central_data-tax_ind-current_state = 'X'.  "组代码
     816 *----销项税
     817   ls_tax-task = 'M'.
     818   ls_tax-task = 'X'.
     819 
     820   ls_tax-data_key-aland = 'CN'.
     821   ls_tax-data_key-tatyp = 'MWST'.
     822   ls_tax-data-taxkd = '1'.
     823   ls_tax-datax-taxkd = 'X'.
     824 *  APPEND ls_tax TO ls_central_data-tax_ind-tax_ind.
     825   ls_vendors-central_data-tax_ind-current_state  = 'X'.
     826   APPEND ls_tax TO ls_vendors-central_data-tax_ind-tax_ind  .
     827 
     828 *----银行数据
     829   CLEAR:ls_tax,ls_central_data,ls_bank.
     830   ls_central_data-bankdetail-current_state = 'X'.  "组代码
     831 
     832   ls_vendors-central_data-bankdetail-current_state = 'X'.
     833 
     834 
     835   DATA: ls_bankdetail TYPE bapibus1006_bankdetail.
     836   DATA: ls_bankdetail_x TYPE bapibus1006_bankdetail_x.
     837   CLEAR:ls_bankdetail,ls_bankdetail_x.
     838 
     839   ls_bankdetail-bank_ctry = 'CN'.
     840   ls_bankdetail-bank_key  = gs_data-bankl.
     841   ls_bankdetail-bank_acct = gs_data-bankn.
     842 *  ls_bankdetail-ctrl_key  = <fs_data>-bkont."银行控制代码
     843 *  ls_bankdetail-bank_ref  = <fs_data>-bkref.
     844 *  ls_bankdetail-accountholder = <fs_data>-koinh.
     845   CLEAR bapi_ret.
     846   REFRESH bapi_ret.
     847   CALL FUNCTION 'BAPI_BUPA_BANKDETAIL_ADD'
     848     EXPORTING
     849       businesspartner = gs_data-werks
     850       bankdetaildata  = ls_bankdetail
     851     TABLES
     852       return          = bapi_ret.
     853   LOOP AT bapi_ret WHERE type CA 'AE'.
     854   ENDLOOP.
     855   IF sy-subrc <> 0.
     856     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
     857       EXPORTING
     858         wait = abap_true.
     859   ENDIF.
     860 *----税分类标识
     861   ls_central_data-central-data-ktokd = 'Z000'.
     862   ls_central_data-central-datax-ktokd = 'X'.
     863 *  ls_central_data-TAX_IND-TAX_IND-DATA-TAXKD = '1'.  "税分类标识.
     864 *-----配送中心编码  门店自采供应商 CENTRAL
     865   ls_vendors-central_data-central-data-bahne = gs_data-bahne.
     866   ls_vendors-central_data-central-data-bahns = gs_data-bahns.
     867   ls_vendors-central_data-central-datax-bahne =  'X'.
     868   ls_vendors-central_data-central-datax-bahns = 'X'.
     869 *  APPEND ls_bank TO ls_vendors-central_data-bankdetail-bankdetails.
     870 *-----所属品牌 门店属性
     871   ls_vendors-central_data-central-data-katr1 = gs_data-pp. "所属品牌
     872   ls_vendors-central_data-central-data-katr2 = gs_data-mdsx. "门店属性
     873   ls_vendors-central_data-central-datax-katr1 =  'X'.
     874   ls_vendors-central_data-central-datax-katr2 = 'X'.
     875   "公司代码数据
     876 *--------------------
     877   LOOP AT lt_cbukrs INTO ls_bukrs.
     878     ls_vendors-company_data-current_state = 'X'.
     879 
     880     ls_company-task = 'M'.     "更改标识
     881     ls_company-data_key-bukrs = ls_bukrs-bukrs.       "公司代码
     882     ls_company-data-akont = '1122010000'.           "总帐统御科目
     883     ls_company-data-zterm = 'HD02'.           "付款条款
     884 *    ls_company-data-zwels = 'T'.           "付款方式
     885 *    ls_company-data-fdgrv = ls_data-fdgrv.           "计划组
     886     ls_company-data-zuawa = '000'."排序码
     887 *    ls_company-data-reprf = 'X'.
     888 
     889     ls_company-datax-akont = 'X'.    "更新标识
     890     ls_company-datax-zterm = 'X'.    "更新标识
     891 *    ls_company-datax-zwels = 'X'.    "更新标识
     892 *    ls_company-datax-fdgrv = 'X'.
     893     ls_company-datax-zuawa = 'X'.
     894 *    ls_company-datax-reprf = 'X'.
     895     APPEND ls_company TO ls_vendors-company_data-company.
     896 *    exit.
     897   ENDLOOP.
     898 *  ENDLOOP.
     899   "删除重复项
     900   SORT ls_vendors-company_data-company[] BY data_key-bukrs.
     901   DELETE ADJACENT DUPLICATES FROM ls_vendors-company_data-company[] COMPARING data_key-bukrs.
     902 *----------------------------------------------------------------------*
     903 *销售数据
     904 *  LOOP AT lt_cbukrs INTO ls_bukrs WHERE bukrs = '5100' OR bukrs = '5200'..
     905   LOOP AT lt_cbukrs INTO ls_bukrs  ..
     906 *    ls_central_data-tax_ind-current_state = 'X'.  "组代码
     907 *
     908 *    ls_tax-task = 'X'.
     909 *
     910 *    ls_tax-data_key-aland = 'CN'.
     911 *    ls_tax-data_key-tatyp = 'MWST'.
     912 *    ls_tax-data-taxkd = '1'.
     913 *    ls_tax-datax-taxkd = 'X'.
     914 *    APPEND ls_tax TO ls_central_data-tax_ind-tax_ind.
     915 
     916     ls_vendors-sales_data-current_state = 'X'.
     917 *    ls_company-task = lv_task.     "更改标识
     918     ls_sales-task = 'M'.     "更改标识
     919     ls_sales-data_key-vkorg =  ls_bukrs-bukrs.       "公司代码.
     920     ls_sales-data_key-vtweg = '00'.       "分销渠道
     921     ls_sales-data_key-spart = '10'.       "产品组
     922 
     923     ls_sales-data-bzirk = gs_data-sales_region.           "销售区域
     924 **  ls_sales-data-vkbur = gs_data-vkbur.           "销售部门
     925     ls_sales-data-vsbed = '01'."装运条件
     926     ls_sales-data-kztlf = 'C'."项目水平上的部分交货
     927 *    ls_sales-datax-bzirk = 'X'.    "更新标识
     928 *    ls_sales-datax-vkbur = 'X'.    "更新标识
     929     ls_sales-datax-vsbed = 'X'.    "更新标识
     930     ls_sales-datax-kztlf = 'X'.    "更新标识
     931 
     932     CLEAR it_functions[].
     933     CLEAR is_functions.
     934     CLEAR ls_sales-functions-functions[].
     935     CLEAR l_partner.
     936 *    CONCATENATE '000009' l_cbukrs INTO l_partner.
     937     ls_sales-functions-current_state = 'X'.
     938     is_functions-data_key-parvw = 'RE'."BP
     939     is_functions-data-partner = gs_data-receipt ."'0000092000'.收票方
     940     IF is_functions-data-partner IS INITIAL.
     941       is_functions-data-partner = l_kunnr.
     942     ENDIF.
     943     is_functions-datax-partner          = 'X'.
     944     APPEND is_functions TO ls_sales-functions-functions.
     945 
     946     CLEAR it_functions.
     947     ls_sales-functions-current_state = 'X'.
     948     is_functions-data_key-parvw = 'RG'."PY  "付款方
     949     is_functions-data-partner = gs_data-payer. "'0000092000'.付款方
     950     IF is_functions-data-partner IS INITIAL.
     951       is_functions-data-partner = l_kunnr.
     952     ENDIF.
     953     is_functions-datax-partner          = 'X'.
     954     APPEND is_functions TO ls_sales-functions-functions.
     955 
     956     CLEAR it_functions.
     957     ls_sales-functions-current_state = 'X'.
     958     is_functions-data_key-parvw = 'AG'."SP
     959     is_functions-data-partner = l_kunnr.
     960     is_functions-datax-partner          = 'X'.
     961     APPEND is_functions TO ls_sales-functions-functions.
     962 
     963     CLEAR it_functions.
     964     ls_sales-functions-current_state = 'X'.
     965     is_functions-data_key-parvw = 'WE'."SH
     966     is_functions-data-partner = l_kunnr.
     967     is_functions-datax-partner          = 'X'.
     968     APPEND is_functions TO ls_sales-functions-functions.
     969 
     970     ls_sales-data-ktgrd =  '30'.           "客户科目分配组
     971     ls_sales-data-zterm =  'HD02'.           "客户科目分配组
     972     ls_sales-datax-ktgrd = 'X'.    "更新标识
     973     ls_sales-datax-zterm = 'X'.    "更新标识
     974 
     975     ls_sales-data-kalks =  '1'.           "用于定价过程确定的客户分类
     976     ls_sales-data-waers =  'CNY'.           "币种
     977     ls_sales-datax-kalks = 'X'.    "更新标识
     978     ls_sales-datax-waers = 'X'.    "更新标识
     979 
     980     APPEND ls_sales TO ls_vendors-sales_data-sales.
     981   ENDLOOP.
     982 *----------------------------------------------------------------------*
     983 *采购
     984 *    ls_purchasing-task = 'M'.".               "更改标识
     985 *    ls_purchasing-task = lv_task.".               "更改标识
     986 *   ls_SALES-data_key-ekorg = '1000'.      "采购组织
     987 
     988   "添加外部复杂接口 供应商结构 到供应商表中
     989   APPEND ls_vendors TO ls_master_data-customers.
     990 
     991   cmd_ei_api=>initialize( ).
     992 
     993 
     994   CALL METHOD cmd_ei_api=>maintain_bapi
     995     EXPORTING
     996       iv_test_run              = space
     997       iv_collect_messages      = 'X'
     998       is_master_data           = ls_master_data
     999     IMPORTING
    1000       es_master_data_correct   = ls_master_data_correct
    1001       es_message_correct       = ls_message_correct
    1002       es_master_data_defective = ls_master_data_defective
    1003       es_message_defective     = ls_message_defective.
    1004 
    1005   CLEAR gv_error.
    1006 
    1007   IF ls_message_defective-is_error IS INITIAL.
    1008     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    1009       EXPORTING
    1010         wait = 'X'.
    1011     gs_data-msgtp = 'S'.
    1012     IF gs_data-msg IS INITIAL.
    1013       gs_data-msg = '维护客户成功'.
    1014     ELSE.
    1015       CONCATENATE gs_data-msg '/维护客户成功' INTO gs_data-msg.
    1016     ENDIF.
    1017   ELSE.
    1018     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    1019     LOOP AT ls_message_defective-messages INTO ls_messages_vmd WHERE type = 'E' OR type = 'A'.
    1020 *      gs_data-msgtp = ls_messages_vmd-type.
    1021       gs_data-msgtp =  'E'.
    1022       IF gs_data-msg IS INITIAL.
    1023         gs_data-msg = ls_messages_vmd-message.
    1024       ELSE.
    1025         CONCATENATE gs_data-msg '维护客户失败:' ls_messages_vmd-message INTO gs_data-msg SEPARATED BY '/'.
    1026         EXIT.
    1027       ENDIF.
    1028 *      EXIT.
    1029     ENDLOOP.
    1030     EXIT.
    1031   ENDIF .
    1032   IF  gs_data-msgtp =  'E'..
    1033     RETURN.
    1034   ENDIF.
    1035 *----------------------------------------------------------------------*
    1036 *维护供应商
    1037   DATA:lv_master_data TYPE vmds_ei_main.
    1038   DATA:lv_master_data_correct TYPE vmds_ei_main.
    1039   DATA:lv_message_correct TYPE cvis_message.
    1040   DATA:lv_master_data_defective TYPE vmds_ei_main.
    1041   DATA:lv_message_defective TYPE cvis_message.
    1042 
    1043   DATA:lv_vendors TYPE vmds_ei_extern.             "外部复杂接口 供应商结构
    1044 
    1045   DATA:lv_header TYPE vmds_ei_header.              "外部复杂接口 供应商抬头结构
    1046   DATA:lv_central_data TYPE vmds_ei_central_data.  "外部复杂接口 供应商中心数据
    1047   DATA:lv_company_data TYPE vmds_ei_vmd_company.   "外部复杂接口 供应商公司代码数据
    1048   DATA:lv_purchasing_data TYPE vmds_ei_vmd_purchasing. "外部复杂接口 供应商采购数据
    1049 
    1050   DATA:lv_company TYPE vmds_ei_company.        "公司代码数据
    1051   DATA:lv_purchasing TYPE vmds_ei_purchasing.  "采购数据
    1052 
    1053   DATA: vit_functions TYPE vmds_ei_functions_t,
    1054         vis_functions TYPE vmds_ei_functions.           "外部接口:合作伙伴角色
    1055 
    1056   DATA:lv_messages_vmd  TYPE bapiret2,
    1057        vlt_messages_vmd TYPE TABLE OF bapiret2.  "返回消息
    1058 
    1059 *  DATA:lv_company_task TYPE vmd_ei_object_task.   "更改标识(I创建,U更改,M创建/更改,C,当前状态)
    1060 *  DATA:lv_purchasing_task TYPE vmd_ei_object_task.   "更改标识(I创建,U更改,M创建/更改,C,当前状态)
    1061 *  DATA:lv_task TYPE vmd_ei_object_task.   "更改标识(I创建,U更改,M创建/更改,C,当前状态)
    1062 *  DATA:lv_lifnr TYPE lifnr.      "创建或修改的供应商
    1063 
    1064   "数据检查
    1065 *  ps_data-lifnr = lv_bpartner. "供应商和合作伙伴得号码一致
    1066   lv_task = 'M'.     "M创建/更改
    1067   "抬头数据
    1068 
    1069   CLEAR l_cbukrs.
    1070   IF gs_data-werks+0(1) = '2'.
    1071     l_cbukrs = '2000'.
    1072   ELSEIF gs_data-werks+0(1) = '5'.
    1073     l_cbukrs = '5000'.
    1074   ELSEIF gs_data-werks+0(1) = '6'.
    1075     l_cbukrs = '6000'.
    1076   ELSEIF gs_data-werks+0(1) = '8'.
    1077     l_cbukrs = '8000'.
    1078   ELSEIF gs_data-werks+0(1) = '9'.
    1079     l_cbukrs = '9000'.
    1080   ENDIF.
    1081   lv_header-object_instance-lifnr = l_kunnr.  "供应商编号
    1082   lv_header-object_task = 'M'.                "更改标识
    1083   lv_vendors-header = ls_header.
    1084 
    1085   "中心数据
    1086 *  ls_central_data-central-data-werks = ps_data-werks.  "工厂
    1087 *  ls_central_data-central-data-konzs = is_vendor-konzs.  "组代码
    1088 
    1089 *---------------外部接口:税收分组
    1090 *外部接口:EU 税号 这是增值税
    1091 *  DATA:vit_tax TYPE cvis_ei_vat_t,
    1092 *       vis_tax TYPE cvis_ei_vat.
    1093 *
    1094 *  CLEAR vis_tax.
    1095 *  lv_central_data-vat_number-current_state = 'X'.
    1096 *  vis_tax-task                    =  'M'.
    1097 **  vis_tax-data_key-land1         =  'CN0'.  "
    1098 *  vis_tax-data_key-land1         =  'CN'.  "
    1099 *  vis_tax-data-stceg =  gs_data-tax_number.  "税号
    1100 *  vis_tax-datax-stceg =  'X'.  "税号
    1101 *  APPEND vis_tax TO lv_central_data-vat_number-vat_numbers.
    1102 
    1103 *外部接口:税收分组
    1104 *  DATA:vit_tax_group TYPE vmds_ei_tax_t,
    1105 *       vis_tax_group TYPE vmds_ei_tax.
    1106 *
    1107 *  CLEAR vis_tax_group.
    1108 *  lv_central_data-tax_grouping-current_state = 'X'.
    1109 *  vis_tax_group-task                    =  'M'.
    1110 **  vis_tax-data_key-land1         =  'CN0'.  "
    1111 *  vis_tax_group-data_key-taxgr         =  'CN0'.  "税码的分类标志
    1112 *  vis_tax_group-data-agtdf = sy-datum.  " 代收授权的开始日期
    1113 *  vis_tax_group-data-aftdt = sy-datum.  " 代收授权的截止日
    1114 *  vis_tax_group-datax-agtdf =  'X'.  "税号
    1115 *  vis_tax_group-datax-aftdt =  'X'.  "税号
    1116 *  APPEND vis_tax_group TO lv_central_data-tax_grouping-tax.
    1117 *
    1118 **
    1119 *  lv_central_data-central-data-STCD1 = '1234'."
    1120 *  lv_central_data-central-data-STCD2 = '1234'."
    1121 *  lv_central_data-central-data-STCEG = '4321'."
    1122 *  lv_central_data-central-data-STCD3 = '1234'."
    1123 *  lv_central_data-central-data-STCD4 = '1234'."
    1124 *  lv_central_data-central-data-STCD5 = '1234'."
    1125 
    1126 *---------------外部接口:税收分组
    1127 *  lV_central_data-central-data-vbund = '002000'.  "贸易伙伴默认2000
    1128   lv_central_data-central-data-ktokk = 'Z000'."供应商账户组
    1129 
    1130   lv_central_data-central-datax-ktokk = 'X'.  "更新标识
    1131 *  lV_central_data-central-datax-stenr = 'X'.  "更新标识
    1132   lv_central_data-central-datax-vbund = 'X'.  "更新标识
    1133   lv_vendors-header-object_task = 'M'.
    1134   lv_vendors-central_data = lv_central_data.
    1135 
    1136   "公司代码数据
    1137   lv_vendors-company_data-current_state = 'X'.
    1138 
    1139   IF l_cbukrs = '2000'.
    1140   ELSE.
    1141   ENDIF.
    1142 *  ------------------------------陈凯
    1143   LOOP AT lt_cbukrs INTO ls_bukrs.
    1144 
    1145 *    ls_company-task = lv_task.     "更改标识
    1146     lv_company-task = 'M'.     "更改标识
    1147     lv_company-data_key-bukrs = ls_bukrs-bukrs.       "公司代码
    1148 
    1149     lv_company-data-akont = '2202010000'.           "统御科目
    1150     lv_company-data-zterm = 'HD02'.           "付款条款
    1151 *    ls_company-data-zwels = 'T'.           "付款方式
    1152 *    ls_company-data-LNRZE = ls_data-fdgrv.           "计划组
    1153     lv_company-data-zuawa = '000'."排序码
    1154     lv_company-data-reprf = 'X'.
    1155 
    1156     lv_company-datax-akont = 'X'.    "更新标识
    1157     lv_company-datax-zterm = 'X'.    "更新标识
    1158 *    lV_company-datax-zwels = 'X'.    "更新标识
    1159 *    lV_company-datax-fdgrv = 'X'.
    1160     lv_company-datax-zuawa = 'X'.
    1161     lv_company-datax-reprf = 'X'.
    1162     APPEND lv_company TO lv_vendors-company_data-company.
    1163 
    1164   ENDLOOP.
    1165 *  ------------------------------
    1166   "删除重复项
    1167   SORT lv_vendors-company_data-company[] BY data_key-bukrs.
    1168   DELETE ADJACENT DUPLICATES FROM lv_vendors-company_data-company[] COMPARING data_key-bukrs.
    1169 
    1170 *----------------------------------------------------------------------*
    1171 *  "采购数据
    1172   lv_vendors-purchasing_data-current_state = 'X'."KTOKK
    1173 
    1174 
    1175   lv_purchasing-task = 'M'.".               "更改标识
    1176 *    ls_purchasing-task = lv_task.".               "更改标识
    1177   lv_purchasing-data_key-ekorg = '1000'.      "采购组织
    1178 
    1179   lv_purchasing-data-waers = 'CNY'.      "采购订单货币
    1180   lv_purchasing-data-zterm = 'HD02'.      "付款条款
    1181   lv_purchasing-data-webre = 'X'.      "标识:基于收货的发票验证
    1182 
    1183 
    1184   lv_purchasing-datax-waers = 'X'.      "更新标识
    1185   lv_purchasing-datax-zterm = 'X'.      "更新标识
    1186   lv_purchasing-datax-webre = 'X'.      "更新标识
    1187 
    1188   CLEAR vit_functions[].
    1189   CLEAR vis_functions.
    1190   CLEAR lv_purchasing-functions-functions[].
    1191   lv_purchasing-functions-current_state = 'X'.
    1192   vis_functions-task                   = 'M'.
    1193   vis_functions-data_key-parvw         = 'BA'."OA
    1194   vis_functions-data-partner           = l_kunnr.
    1195   vis_functions-datax-partner          = 'X'.
    1196   APPEND vis_functions TO lv_purchasing-functions-functions.
    1197 
    1198   CLEAR vis_functions.
    1199   lv_purchasing-functions-current_state = 'X'.
    1200   vis_functions-task                    =  'M'.
    1201   vis_functions-data_key-parvw         = 'LF'."VN
    1202   vis_functions-data-partner           = l_kunnr.
    1203   vis_functions-data-defpa = 'X'.
    1204   vis_functions-datax-partner          = 'X'.
    1205   vis_functions-datax-defpa          = 'X'.
    1206   APPEND vis_functions TO lv_purchasing-functions-functions.
    1207 
    1208   CLEAR vis_functions.
    1209   lv_purchasing-functions-current_state = 'X'.
    1210   vis_functions-task                     = 'M'.
    1211   vis_functions-data_key-parvw         = 'RS'."PI
    1212   vis_functions-data-partner           = l_kunnr.
    1213   vis_functions-datax-partner          = 'X'.
    1214   APPEND vis_functions TO lv_purchasing-functions-functions.
    1215 
    1216 
    1217   APPEND lv_purchasing TO lv_vendors-purchasing_data-purchasing.
    1218 
    1219   SORT lv_vendors-purchasing_data-purchasing[] BY data_key-ekorg.
    1220   DELETE ADJACENT DUPLICATES FROM lv_vendors-purchasing_data-purchasing[] COMPARING data_key-ekorg.
    1221 
    1222   "添加外部复杂接口 供应商结构 到供应商表中
    1223   APPEND lv_vendors TO lv_master_data-vendors.
    1224   vmd_ei_api=>initialize( ).
    1225 
    1226   CALL METHOD vmd_ei_api=>maintain_bapi
    1227     EXPORTING
    1228       iv_test_run              = space
    1229       iv_collect_messages      = 'X'
    1230       is_master_data           = lv_master_data
    1231     IMPORTING
    1232       es_master_data_correct   = lv_master_data_correct
    1233       es_message_correct       = lv_message_correct
    1234       es_master_data_defective = lv_master_data_defective
    1235       es_message_defective     = lv_message_defective.
    1236 
    1237   CLEAR gv_error.
    1238 
    1239   IF lv_message_defective-is_error IS INITIAL.
    1240     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    1241       EXPORTING
    1242         wait = 'X'.
    1243     gs_data-msgtp = 'S'.
    1244     IF gs_data-msg IS INITIAL.
    1245       gs_data-msg = '维护供应商成功'.
    1246     ELSE.
    1247       CONCATENATE gs_data-msg '维护供应商成功' INTO gs_data-msg SEPARATED BY '/'.
    1248     ENDIF.
    1249   ELSE.
    1250     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    1251     LOOP AT lv_message_defective-messages INTO lv_messages_vmd WHERE type = 'E' OR type = 'A'.
    1252       gs_data-msgtp = lv_messages_vmd-type.
    1253       IF gs_data-msg IS INITIAL.
    1254         gs_data-msg = lv_messages_vmd-message.
    1255       ELSE.
    1256         CONCATENATE gs_data-msg lv_messages_vmd-message INTO gs_data-msg SEPARATED BY '/'.
    1257       ENDIF.
    1258 *      EXIT.
    1259     ENDLOOP.
    1260   ENDIF .
    1261 
    1262   IF gs_data-msgtp = 'E'..
    1263 *    EXIT.
    1264   ELSE.
    1265     CLEAR bapi_ret.
    1266     REFRESH bapi_ret.
    1267     CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
    1268       EXPORTING
    1269         businesspartner = gs_data-werks
    1270         taxtype         = 'CN0'
    1271         taxnumber       = gs_data-tax_number
    1272       TABLES
    1273         return          = bapi_ret.
    1274 
    1275     LOOP AT bapi_ret   WHERE type CA 'AE'.
    1276       gs_data-msgtp = 'E'.
    1277       CONCATENATE gs_data-msg '税号写入失败' bapi_ret-message INTO gs_data-msg SEPARATED BY '/'.
    1278     ENDLOOP.
    1279     IF  sy-subrc <> 0.
    1280       gs_data-msgtp = 'S'.
    1281       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    1282         EXPORTING
    1283           wait = abap_true.
    1284     ENDIF.
    1285   ENDIF.
    1286 ENDFORM.
    1287 *&---------------------------------------------------------------------*
    1288 *& Form CREATE_ROLE
    1289 *&---------------------------------------------------------------------*
    1290 *& text
    1291 *&---------------------------------------------------------------------*
    1292 *&      --> LV_BPARTNER
    1293 *&      --> LV_ROLE
    1294 *&      <-- GS_DATA
    1295 *&---------------------------------------------------------------------*
    1296 FORM create_role   USING    uf_bpartnerout TYPE bapibus1006_head-bpartner
    1297                             uf_role TYPE  bapibus1006_head-partnerrole
    1298                    CHANGING ls_out LIKE LINE OF gt_data.
    1299 
    1300   DATA ps_return TYPE zlifnr_return_s.
    1301 
    1302 * Create Role
    1303   CLEAR bapi_ret.
    1304   REFRESH bapi_ret.
    1305   CALL FUNCTION 'BAPI_BUPA_ROLE_ADD_2'
    1306     EXPORTING
    1307       businesspartner     = uf_bpartnerout
    1308       businesspartnerrole = uf_role
    1309     TABLES
    1310       return              = bapi_ret.
    1311 
    1312 * Verify return
    1313   CLEAR gv_error.
    1314   LOOP AT bapi_ret WHERE type = 'E' OR type =  'A'.
    1315     gv_error = 'X'.
    1316     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    1317     CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'.
    1318     CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'.
    1319     ls_out-msgtp = bapi_ret-type.
    1320     IF ls_out-msgtp IS INITIAL.
    1321       ls_out-msgtp = bapi_ret-message.
    1322     ELSE.
    1323       CONCATENATE ls_out-msgtp bapi_ret-message INTO ls_out-msgtp SEPARATED BY '/'.
    1324     ENDIF.
    1325   ENDLOOP.
    1326 
    1327 ENDFORM.
    1328 *&---------------------------------------------------------------------*
    1329 *& Form ZBDC_WB01
    1330 *&---------------------------------------------------------------------*
    1331 *& text
    1332 *&---------------------------------------------------------------------*
    1333 *& -->  p1        text
    1334 *& <--  p2        text
    1335 *&---------------------------------------------------------------------*
    1336 FORM zbdc_wb01 .
    1337   DATA:lt_bdcmsgcoll TYPE TABLE OF bdcmsgcoll WITH HEADER LINE.
    1338   DATA:lt_bapireturn TYPE TABLE OF bapiret2 WITH HEADER LINE.
    1339   "初始屏幕
    1340   PERFORM bdc_dynpro        USING 'SAPMWBE3' '0101'.
    1341   PERFORM bdc_field         USING 'BDC_OKCODE' '=ENTR'.
    1342   PERFORM bdc_field         USING 'WR02D-LOCNR' gs_data-werks.
    1343   PERFORM bdc_field         USING 'WR02D-BETRP' 'Z002'.
    1344   PERFORM bdc_field         USING 'WR02D-REF_WKFIL' 'DS00'.
    1345 
    1346   "进入后点保存
    1347   PERFORM bdc_dynpro        USING 'SAPMWBE3' '0401'.
    1348   PERFORM bdc_field         USING 'BDC_OKCODE' '=UPDA'.
    1349   PERFORM bdc_field         USING 'WR02D-SITE_BP' gs_data-werks.
    1350   PERFORM bdc_field         USING 'BDC_SUBSCR' 'SAPMWBE3                                5100SUB1'.
    1351   PERFORM bdc_field         USING 'BDC_SUBSCR' 'SAPMWBE3                                2100ORGA'.
    1352   PERFORM bdc_field         USING 'T001K-BUKRS' gs_data-bukrs.
    1353   PERFORM bdc_field         USING 'T001W-EKORG' '1000'.
    1354   PERFORM bdc_field         USING 'T001W-VKORG' gs_data-bukrs.
    1355   PERFORM bdc_field         USING 'T001W-VTWEG' '20'.
    1356   PERFORM bdc_field         USING 'T001W-SPART' '10'.
    1357 
    1358   "弹窗点否
    1359   PERFORM bdc_dynpro        USING 'SAPLSPO1' '0100'.
    1360   PERFORM bdc_field         USING 'BDC_OKCODE' '=NO'.
    1361 
    1362   PERFORM bdc_dynpro        USING 'SAPLPLANT_DISPLAY_CUSTOMIZING' '1000'.
    1363   PERFORM bdc_field         USING 'BDC_OKCODE' '=BSTV'.
    1364 
    1365   PERFORM bdc_dynpro        USING 'SAPLSPO2' '0301'.
    1366   PERFORM bdc_field         USING 'BDC_OKCODE' '=OPT1'.
    1367   DATA: l_opt TYPE ctu_params.
    1368   CLEAR :l_opt.
    1369   l_opt-racommit = 'X'.
    1370   l_opt-dismode = p_typ.
    1371   l_opt-updmode = p_upd.
    1372   CALL TRANSACTION 'WB01' USING bdcdata[]                  "传入的BDC数据
    1373 *                           MODE   p_typ
    1374 *                           UPDATE p_upd
    1375                            OPTIONS FROM l_opt
    1376 *                              MODE  'N'
    1377 *                              UPDATE 'S'
    1378                               MESSAGES INTO lt_bdcmsgcoll[].      "将结果放在LT_BDCMSGCOLL[]输出
    1379 
    1380   CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
    1381     TABLES
    1382       imt_bdcmsgcoll = lt_bdcmsgcoll
    1383       ext_return     = lt_bapireturn.
    1384 
    1385   READ TABLE lt_bapireturn WITH KEY type = 'E'.
    1386   IF sy-subrc NE 0.
    1387     gs_data-msgtp = 'S'.
    1388     IF gs_data-msg IS INITIAL.
    1389       gs_data-msg = '工厂创建成功'.
    1390     ELSE .
    1391       CONCATENATE gs_data-msg '工厂创建成功' INTO gs_data-msg.
    1392     ENDIF.
    1393 
    1394   ELSE.
    1395 
    1396     LOOP AT lt_bapireturn WHERE type  = 'E'.
    1397       gs_data-msgtp = 'E'.
    1398       CONCATENATE gs_data-msg  lt_bapireturn-message INTO gs_data-msg SEPARATED BY '/'.
    1399     ENDLOOP.
    1400 
    1401   ENDIF.
    1402   REFRESH bdcdata[].CLEAR bdcdata.
    1403 ENDFORM.
    1404 FORM bdc_dynpro  USING program dynpro.
    1405   CLEAR bdcdata.
    1406   bdcdata-program  = program.
    1407   bdcdata-dynpro   = dynpro.
    1408   bdcdata-dynbegin = 'X'.
    1409   APPEND bdcdata.
    1410 ENDFORM.                    "BDC_DYNPRO
    1411 
    1412 FORM bdc_field USING fnam fval.
    1413   CLEAR bdcdata.
    1414   bdcdata-fnam = fnam.
    1415   bdcdata-fval = fval.
    1416   APPEND bdcdata.
    1417 ENDFORM.                    "BDC_FIELD
    1418 *&---------------------------------------------------------------------*
    1419 *& Form ZBDC_CREDIT_MANAGEMENT
    1420 *&---------------------------------------------------------------------*
    1421 *& text
    1422 *&---------------------------------------------------------------------*
    1423 *& -->  p1        text
    1424 *& <--  p2        text
    1425 *&---------------------------------------------------------------------*
    1426 FORM zbdc_credit_management .
    1427 
    1428   DATA: io_facade        TYPE REF TO cl_ukm_facade,
    1429         io_bupa_factory  TYPE REF TO cl_ukm_bupa_factory,
    1430         io_partner       TYPE REF TO cl_ukm_business_partner,
    1431         io_account       TYPE REF TO cl_ukm_account,
    1432         lw_bp_credit_sgm TYPE ukm_s_bp_cms_sgm.
    1433 
    1434   DATA: lwa_ukm_s_bp_cms TYPE ukm_s_bp_cms.
    1435   DATA: lv_partner      TYPE bu_partner,
    1436         lv_credit_sgmnt TYPE ukm_credit_sgmnt.
    1437   DATA c_return TYPE TABLE OF  ukm_s_monitor_return.
    1438   DATA cs_return TYPE    ukm_s_monitor_return.
    1439 *  创建'MAINTAIN'对象
    1440   io_facade  = cl_ukm_facade=>create( i_activity = cl_ukm_cnst_eventing=>bp_maintenance ).
    1441   io_bupa_factory = io_facade->get_bupa_factory( ).
    1442 
    1443 
    1444 *------SAP 信用段数据” 维护字段:“信用段”“定义的限额”
    1445   lv_partner      = gs_data-werks. "客户代码
    1446   lv_credit_sgmnt =  gs_data-credit_sgmnt."信用段
    1447 
    1448   io_partner = io_bupa_factory->get_business_partner( lv_partner ).
    1449   io_partner->get_bp_cms( IMPORTING es_bp_cms =  lwa_ukm_s_bp_cms ).
    1450 
    1451 *------SAP 通用数据” ,维护字段:“风险类”“检查规则”。
    1452 *  lwa_ukm_s_bp_cms-limit_rule = 'B2B-NEW'. "风险类
    1453 *  lwa_ukm_s_bp_cms-check_rule = '01'. "检查规则
    1454 
    1455   lwa_ukm_s_bp_cms-limit_rule =  'B2B-EXIST' . "规则
    1456   lwa_ukm_s_bp_cms-check_rule = '03'. "检查规则
    1457   lwa_ukm_s_bp_cms-risk_class = '100'. "风险类
    1458 
    1459   io_partner->set_bp_cms( lwa_ukm_s_bp_cms ).
    1460 
    1461   CALL METHOD io_bupa_factory->get_credit_account
    1462     EXPORTING
    1463       i_partner         = lv_partner
    1464       i_credit_sgmnt    = lv_credit_sgmnt
    1465     RECEIVING
    1466       ro_credit_account = io_account.
    1467 
    1468   io_account->get_bp_cms_sgm( IMPORTING es_bp_cms_sgm = lw_bp_credit_sgm ).
    1469 
    1470   lw_bp_credit_sgm-cust_group = '1'."信用组
    1471 *  lw_bp_credit_sgm-credit_limit = '66'."信用额度(限制)
    1472   lw_bp_credit_sgm-credit_limit = gs_data-credit_limit."信用额度(限制)
    1473   io_account->set_bp_cms_sgm( EXPORTING is_bp_cms_sgm = lw_bp_credit_sgm ).
    1474   io_bupa_factory->save_all( EXPORTING i_upd_task = abap_false
    1475   RECEIVING et_return = c_return   ).
    1476   LOOP AT c_return INTO cs_return WHERE msgty CA 'AE'.
    1477     gs_data-msgtp = 'E'.
    1478     CONCATENATE gs_data-msg '维护信贷管理失败' cs_return-message INTO gs_data-msg SEPARATED BY '/'.
    1479   ENDLOOP.
    1480   IF  sy-subrc <> 0.
    1481     gs_data-msgtp = 'S'.
    1482     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    1483       EXPORTING
    1484         wait = 'X'.
    1485     CONCATENATE gs_data-msg '维护信贷管理成功' cs_return-message INTO gs_data-msg SEPARATED BY '/'.
    1486   ENDIF.
    1487 ENDFORM.
    View Code

    4、批量创建采购凭证

       1 *&---------------------------------------------------------------------*
       2 *& Report ZMMB016
       3 *&---------------------------------------------------------------------*
       4 *&
       5 *&---------------------------------------------------------------------*
       6 REPORT ZMMB016.
       7 *--------------------------------------------------------------------*
       8 *   DEFINE TYPE POOL
       9 *--------------------------------------------------------------------*
      10 TYPE-POOLS: slis.
      11 
      12 *--------------------------------------------------------------------*
      13 *   DEFINE TABLES
      14 *--------------------------------------------------------------------*
      15 TABLES: sscrfields,ekko,ekpo,lfa1.
      16 INCLUDE <icon>.
      17 *--------------------------------------------------------------------*
      18 *   DEFINE TYPES
      19 *--------------------------------------------------------------------*
      20 TYPES: BEGIN OF ty_data,
      21          cbox       TYPE aq_markbg,
      22          light      TYPE icon_d,         "指示灯
      23          znumber(4) ,           "序号
      24          bsart      TYPE ekko-bsart, "凭证类型
      25          bukrs      TYPE ekko-bukrs, "公司代码
      26          bedat      TYPE ekko-bedat,    "凭证日期
      27          ekorg      TYPE ekko-ekorg,     "采购组织
      28          ekgrp      TYPE ekko-ekgrp,     "采购组
      29          lifnr      TYPE ekko-lifnr,     "供应商
      30          name1      TYPE lfa1-name1,     "供应商名称
      31          matnr      TYPE ekpo-matnr,     "物料编码
      32          txz01      TYPE ekpo-txz01,     "物料描述
      33          menge      TYPE ekpo-menge,     "订单数量
      34          meins      TYPE ekpo-meins,     "订单单位
      35          kbetr      TYPE konv-kbetr,     "价格
      36          kpein      TYPE konv-kpein,     "
      37          kmein      TYPE konv-kmein,     "价格单位
      38          mwskz      TYPE ekpo-mwskz,     "税号
      39          eindt      TYPE eket-eindt,     "计划交货日期
      40          werks      TYPE ekpo-werks,     "工厂
      41          lgort      TYPE ekpo-lgort,     "库存地点
      42          reslo      TYPE ekpo-reslo,     "发货存储地点
      43          retpo      TYPE ekpo-retpo,     "是否退货
      44          ebeln      TYPE ekko-ebeln,     "采购订单号
      45          id         TYPE i, "行号
      46          zmsg(250),                      "消息
      47        END OF ty_data.
      48 
      49 TYPES: BEGIN OF ty_excel_data, "用来接收EXCEL数据
      50          znumber(4) ,            "序号
      51          bsart      TYPE ekko-bsart, "凭证类
      52          bukrs      TYPE ekko-bukrs, "公司代码
      53          bedat      TYPE ekko-bedat,    "凭证日期
      54          ekorg      TYPE ekko-ekorg,     "采购组织
      55          ekgrp      TYPE ekko-ekgrp,     "采购组
      56          lifnr      TYPE ekko-lifnr,     "供应商
      57          name1      TYPE lfa1-name1,     "供应商名称
      58          matnr      TYPE ekpo-matnr,     "物料编码
      59          txz01      TYPE ekpo-txz01,     "物料描述
      60          menge      TYPE ekpo-menge,     "订单数量
      61          meins      TYPE ekpo-meins,     "订单单位
      62          kbetr      TYPE konv-kbetr,     "价格
      63          kpein      TYPE konv-kpein,     "
      64          kmein      TYPE konv-kmein,     "价格单位
      65          mwskz      TYPE ekpo-mwskz,     "税号
      66          eindt      TYPE eket-eindt,     "计划交货日期
      67          werks      TYPE ekpo-werks,     "工厂
      68          lgort      TYPE ekpo-lgort,     "库存地点
      69          reslo      TYPE ekpo-reslo,     "发货存储地点
      70          retpo      TYPE ekpo-retpo,     "是否退货
      71        END OF ty_excel_data.
      72 
      73 *--------------------------------------------------------------------*
      74 *   DEFINE INTERNAL TABLES & VARIANTS
      75 *--------------------------------------------------------------------*
      76 DATA: gs_data         TYPE ty_data,
      77       gt_data         TYPE TABLE OF  ty_data,
      78       gv_account_flag TYPE i,
      79       gv_no_check     TYPE c LENGTH 1,
      80       gs_excel_data   TYPE ty_excel_data,
      81       gt_excel_data   TYPE TABLE OF  ty_excel_data.
      82 
      83 DATA:gt_fieldcat TYPE lvc_t_fcat, "定义列标题(属性信息)
      84      gs_layout   TYPE lvc_s_layo,
      85      gs_fieldcat TYPE lvc_s_fcat, "定义对象
      86 
      87      wa_repid    LIKE sy-repid, "当前程序
      88      gs_title    TYPE lvc_title.
      89 *--------------------------------------------------------------------*
      90 * SELECTION-SCREEN
      91 *--------------------------------------------------------------------*
      92 SELECTION-SCREEN BEGIN OF BLOCK blk_010 WITH FRAME TITLE TEXT-t10.
      93 *PARAMETERS p_bukrs TYPE t001-bukrs DEFAULT '2000'.
      94 *PARAMETERS p_bsart TYPE ekko-bsart DEFAULT 'NB'.
      95 PARAMETERS p_file TYPE rlgrap-filename MODIF ID imp.
      96 SELECTION-SCREEN END OF BLOCK blk_010.
      97 SELECTION-SCREEN: FUNCTION KEY 1.
      98 *--------------------------------------------------------------------*
      99 * LOAD-OF-PROGRAM
     100 *--------------------------------------------------------------------*
     101 LOAD-OF-PROGRAM.
     102 
     103 *--------------------------------------------------------------------*
     104 * INITIALIZATION
     105 *--------------------------------------------------------------------*
     106 INITIALIZATION.
     107   PERFORM initialization.
     108 
     109 *&---------------------------------------------------------------------*
     110 *&      Form  INITIALIZATION
     111 *&---------------------------------------------------------------------*
     112 *       text
     113 *----------------------------------------------------------------------*
     114 *  -->  p1        text
     115 *  <--  p2        text
     116 *----------------------------------------------------------------------*
     117 FORM initialization .
     118   sscrfields-functxt_01 = '下载模板'.
     119   CLEAR gv_account_flag.
     120 ENDFORM.
     121 
     122 *--------------------------------------------------------------------*
     123 * AT SELECTION-SCREEN
     124 *--------------------------------------------------------------------*
     125 AT SELECTION-SCREEN.
     126 
     127   PERFORM selection_screen.
     128 
     129 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
     130   CALL METHOD zcl_bc_excel=>f4_file_excel
     131 *    EXPORTING
     132 *    iv_file_filter = 'Excel(*.xlsm)'
     133     CHANGING
     134       cv_file_name = p_file.
     135 *--------------------------------------------------------------------*
     136 * START-OF-SELECTION
     137 *--------------------------------------------------------------------*
     138 START-OF-SELECTION.
     139   "权限检查
     140   "1 公司
     141 *  AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
     142 *                  ID 'BUKRS' FIELD p_bukrs.
     143 *  IF sy-subrc NE 0.
     144 *    MESSAGE '当前用户没有该公司代码的权限' TYPE 'S' DISPLAY LIKE 'W'.
     145 *    RETURN.
     146 *  ENDIF.
     147 *
     148 *  AUTHORITY-CHECK OBJECT 'M_BEST_BSA'
     149 *                  ID 'BSART' FIELD p_bsart.
     150 *  IF sy-subrc NE 0.
     151 *    MESSAGE '当前用户没有该订单类型的权限' TYPE 'W' DISPLAY LIKE 'W'.
     152 *    RETURN.
     153 *  ENDIF.
     154 
     155   IF p_file IS INITIAL.
     156     MESSAGE s000(zmm) WITH '请输入文件路径' DISPLAY LIKE 'E'.
     157     RETURN.
     158   ENDIF.
     159   PERFORM start_of_selection.
     160 
     161   IF gt_data[] IS INITIAL.
     162     MESSAGE s018(zmm) DISPLAY LIKE 'E'.
     163     RETURN.
     164   ENDIF.
     165 *--------------------------------------------------------------------*
     166 * END-OF-SELECTION
     167 *--------------------------------------------------------------------*
     168 END-OF-SELECTION.
     169   PERFORM end_of_selection.
     170 *&---------------------------------------------------------------------*
     171 *&      Form  SELECTION_SCREEN
     172 *&---------------------------------------------------------------------*
     173 *       text
     174 *----------------------------------------------------------------------*
     175 *  -->  p1        text
     176 *  <--  p2        text
     177 *----------------------------------------------------------------------*
     178 FORM selection_screen .
     179   CASE sscrfields-ucomm.
     180     WHEN 'FC01'.
     181       "Dowload Template
     182       PERFORM download_template.
     183   ENDCASE.
     184 ENDFORM.
     185 
     186 *&---------------------------------------------------------------------*
     187 *&      Form  DOWNLOAD_TEMPLATE
     188 *&---------------------------------------------------------------------*
     189 *       text
     190 *----------------------------------------------------------------------*
     191 *  -->  p1        text
     192 *  <--  p2        text
     193 *----------------------------------------------------------------------*
     194 FORM download_template .
     195   DATA: lv_objid TYPE wwwdatatab-objid VALUE 'ZMMB016'.
     196   DATA: lv_default_file_name TYPE string.
     197   DATA: lv_rc TYPE sy-subrc.
     198   DATA: lv_filepath TYPE string.
     199 
     200   CONCATENATE '采购订单批导模板-' sy-datum+0(8) sy-timlo+0(4)
     201         INTO lv_default_file_name.
     202 
     203   CALL METHOD zcl_bc_excel=>download_web_object
     204     EXPORTING
     205       iv_relid             = 'MI'
     206       iv_objid             = lv_objid
     207       iv_default_file_name = lv_default_file_name
     208     IMPORTING
     209       ev_rc                = lv_rc
     210       ev_filepath          = lv_filepath.
     211   IF lv_rc <> 0.
     212     MESSAGE i398(00) WITH '模板文件' lv_objid '下载失败或被取消'.
     213     RETURN.
     214   ENDIF.
     215 ENDFORM.
     216 *&---------------------------------------------------------------------*
     217 *&      Form  START_OF_SELECTION
     218 *&---------------------------------------------------------------------*
     219 *       text
     220 *----------------------------------------------------------------------*
     221 *  -->  p1        text
     222 *  <--  p2        text
     223 *----------------------------------------------------------------------*
     224 FORM start_of_selection .
     225   CLEAR gv_account_flag.
     226 
     227   PERFORM upload_excel.
     228 
     229   PERFORM account_simulate_check USING abap_true.
     230 ENDFORM.
     231 *&---------------------------------------------------------------------*
     232 *&      Form  UPLOAD_EXCEL
     233 *&---------------------------------------------------------------------*
     234 *       text
     235 *----------------------------------------------------------------------*
     236 *  -->  p1        text
     237 *  <--  p2        text
     238 *----------------------------------------------------------------------*
     239 FORM upload_excel .
     240   DATA lv_filename TYPE string.
     241 
     242   lv_filename = p_file.
     243   CALL FUNCTION 'ZBC_UPLOAD_EXCEL_OLE'
     244     EXPORTING
     245       pi_filename    = lv_filename
     246       pi_startline   = '2'
     247       pi_startcolumn = '1'
     248     TABLES
     249       pt_tab         = gt_excel_data
     250     EXCEPTIONS
     251       open_file_err  = 1
     252       OTHERS         = 2.
     253   IF sy-subrc <> 0.
     254     MESSAGE e003(zbc) WITH sy-msgv1 sy-msgv2.
     255   ELSE.
     256     SORT gt_excel_data.
     257   ENDIF.
     258 
     259 ENDFORM.
     260 *&---------------------------------------------------------------------*
     261 *&      Form  END_OF_SELECTION
     262 *&---------------------------------------------------------------------*
     263 *       text
     264 *----------------------------------------------------------------------*
     265 *  -->  p1        text
     266 *  <--  p2        text
     267 *----------------------------------------------------------------------*
     268 FORM end_of_selection .
     269 
     270   PERFORM display_log.
     271 ENDFORM.
     272 *&---------------------------------------------------------------------*
     273 *&      Form  ACCOUNT_SIMULATE_CHECK
     274 *&---------------------------------------------------------------------*
     275 *       text
     276 *----------------------------------------------------------------------*
     277 *      -->P_ABAP_TRUE  text
     278 *----------------------------------------------------------------------*
     279 FORM account_simulate_check  USING  p_sim TYPE flag.
     280 
     281   DATA: lv_err_flg    TYPE char1,
     282         lv_int        TYPE i,
     283         ls_line_count TYPE i,
     284         lv_index      TYPE n LENGTH 2,
     285         lv_index1     TYPE n LENGTH 2.
     286 
     287 *  DATA: ls_mara TYPE mara,
     288 *        ls_marc TYPE marc,
     289 *        ls_lfb1 TYPE lfb1,
     290 *        ls_lfm1 TYPE lfm1,
     291 *        lt_mara TYPE TABLE OF mara,
     292 *        lt_marc TYPE TABLE OF marc,
     293 *        lt_lfb1 TYPE TABLE OF lfb1,
     294 *        lt_lfm1 TYPE TABLE OF lfm1.
     295 
     296   FIELD-SYMBOLS <fs_data> LIKE LINE OF gt_excel_data.
     297 
     298   DATA:
     299 *    pt_hd   LIKE /abtl/sfi_hd OCCURS 0 WITH HEADER LINE,
     300 *    pt_it   LIKE /abtl/sfi_it OCCURS 0 WITH HEADER LINE,
     301 *    lw_acc  LIKE /abtl/fidoc_hd,
     302     lv_mode LIKE rfpdo-allgazmd VALUE 'N',
     303     lv_sim  TYPE flag,
     304     lv_msg  TYPE bapi_msg.
     305 *  REFRESH GT_EXCEL_DATA.
     306 
     307   IF gt_excel_data[] IS INITIAL.
     308     MESSAGE e000(zmm) WITH '未导入任何数据!'.
     309   ELSE.
     310 *    LOOP AT gt_excel_data WHERE light = '1'.
     311 *      IF p_sim = abap_false.
     312 *        MESSAGE e000(zbc) WITH '存在模拟失败的记录!'.
     313 *      ENDIF.
     314 *    ENDLOOP.
     315     SORT gt_excel_data BY znumber.
     316   ENDIF.
     317 
     318 *  DATA: ls_bat_no_length TYPE i,
     319 *        ls_wo_no_length  TYPE i,
     320 *        ls_stl_no_length TYPE i.
     321   DATA:lv_bedat TYPE ekko-bedat,
     322        lv_ekorg TYPE ekko-ekorg,
     323        lv_ekgrp TYPE ekko-ekgrp,
     324        lv_lifnr TYPE ekko-lifnr,
     325        lv_vlfkz TYPE t001w-vlfkz,
     326        lv_bsart TYPE ekko-bsart,
     327        lv_bukrs TYPE ekko-bukrs.
     328   DATA:lv_no TYPE i.
     329 
     330   CLEAR lv_no.
     331 
     332   LOOP AT gt_excel_data ASSIGNING <fs_data> .
     333 
     334     TRANSLATE:<fs_data>-bsart TO UPPER CASE,
     335               <fs_data>-meins TO UPPER CASE,
     336               <fs_data>-kmein TO UPPER CASE,
     337               <fs_data>-mwskz TO UPPER CASE.
     338 
     339     "检查当同个序号时,凭证日期,采购组织,采购组,供应商必须一致
     340     MOVE-CORRESPONDING <fs_data> TO gs_data.
     341     CLEAR: gs_data-meins,gs_data-kmein.
     342 
     343 
     344                                                             "20181011增加
     345     CLEAR lv_vlfkz.
     346     IF <fs_data>-bsart IS INITIAL.
     347 *      SELECT SINGLE vlfkz INTO lv_vlfkz FROM t001w WHERE werks = <fs_data>-werks.
     348 *      CASE lv_vlfkz.
     349 *        WHEN 'A'.
     350 *          CASE <fs_data>-bukrs.
     351 *            WHEN '2000'.
     352 *              <fs_data>-bsart = 'ZC04'.
     353 *              gs_data-bsart = 'ZC04'.
     354 *            WHEN OTHERS.
     355 *              <fs_data>-bsart = 'ZC03'.
     356 *              gs_data-bsart = 'ZC03'.
     357 *          ENDCASE.
     358 *        WHEN 'B'.
     359 *          gs_data-zmsg = '订单类型不允许为空'.
     360 *          gs_data-light = icon_red_light.    "错误,红灯
     361 *          APPEND gs_data TO gt_data.
     362 *          CLEAR gs_data.
     363 *          CONTINUE.
     364 *        WHEN OTHERS.
     365 *      ENDCASE.
     366     ENDIF.
     367 
     368     AT NEW znumber.
     369       lv_bsart = <fs_data>-bsart.
     370       lv_bedat = <fs_data>-bedat.
     371       lv_ekorg = <fs_data>-ekorg.
     372       lv_ekgrp = <fs_data>-ekgrp.
     373       lv_lifnr = <fs_data>-lifnr.
     374       lv_bukrs = <fs_data>-bukrs.
     375     ENDAT.
     376 
     377     IF <fs_data>-bedat = lv_bedat
     378    AND <fs_data>-ekorg = lv_ekorg
     379    AND <fs_data>-ekgrp = lv_ekgrp
     380    AND <fs_data>-lifnr = lv_lifnr
     381    AND <fs_data>-bsart = lv_bsart
     382    AND <fs_data>-bukrs = lv_bukrs.
     383 
     384     ELSE."抬头数据不同
     385       gs_data-zmsg = '同一编号的订单类型/日期/采购组织/采购组/供应商存在不同'.
     386       gs_data-light = icon_red_light.    "错误,红灯
     387       APPEND gs_data TO gt_data.
     388       CONTINUE.
     389     ENDIF.
     390 
     391 **************检查供应商、采购组织和采购组、物料、数量、工厂、库存地点,公司代码不能为空
     392 
     393     IF <fs_data>-bukrs IS INITIAL.
     394       gs_data-zmsg = '公司代码不能为空!'.
     395       gs_data-light = icon_red_light.    "错误,红灯
     396       APPEND gs_data TO gt_data.
     397 *      MESSAGE '供应商不能为空!' TYPE 'E'.
     398       CLEAR gs_data.
     399       CONTINUE.
     400     ENDIF.
     401 
     402     IF <fs_data>-lifnr IS INITIAL.
     403       gs_data-zmsg = '供应商不能为空!'.
     404       gs_data-light = icon_red_light.    "错误,红灯
     405       APPEND gs_data TO gt_data.
     406 *      MESSAGE '供应商不能为空!' TYPE 'E'.
     407       CLEAR gs_data.
     408       CONTINUE.
     409     ENDIF.
     410 
     411     IF <fs_data>-ekorg IS INITIAL.
     412       gs_data-zmsg = '采购组织不能为空!'.
     413       gs_data-light = icon_red_light.    "错误,红灯
     414       APPEND gs_data TO gt_data.
     415 *      MESSAGE '采购组织不能为空!' TYPE 'E'.
     416       CLEAR gs_data.
     417       CONTINUE.
     418     ENDIF.
     419 
     420     IF <fs_data>-ekgrp IS INITIAL.
     421       gs_data-zmsg = '采购组不能为空!'.
     422       gs_data-light = icon_red_light.    "错误,红灯
     423       APPEND gs_data TO gt_data.
     424 *      MESSAGE '采购组不能为空!' TYPE 'E'.
     425       CLEAR gs_data.
     426       CONTINUE.
     427     ENDIF.
     428 
     429     IF <fs_data>-matnr IS INITIAL.
     430       gs_data-zmsg = '物料不能为空!'.
     431       gs_data-light = icon_red_light.    "错误,红灯
     432       APPEND gs_data TO gt_data.
     433 *      MESSAGE '物料不能为空!' TYPE 'E'.
     434       CLEAR gs_data.
     435       CONTINUE.
     436     ENDIF.
     437 
     438     IF <fs_data>-menge IS INITIAL.
     439       gs_data-zmsg = '订单数量不能为空!'.
     440       gs_data-light = icon_red_light.    "错误,红灯
     441       APPEND gs_data TO gt_data.
     442 *      MESSAGE '订单数量不能为空!' TYPE 'E'.
     443       CLEAR gs_data.
     444       CONTINUE.
     445     ENDIF.
     446 
     447     IF <fs_data>-werks IS INITIAL.
     448       gs_data-zmsg = '工厂不能为空!'.
     449       gs_data-light = icon_red_light.    "错误,红灯
     450       APPEND gs_data TO gt_data.
     451 *      MESSAGE '工厂不能为空!' TYPE 'E'.
     452       CLEAR gs_data.
     453       CONTINUE.
     454     ENDIF.
     455 
     456 
     457     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'     "供应商加前导零
     458       EXPORTING
     459         input  = <fs_data>-lifnr
     460       IMPORTING
     461         output = gs_data-lifnr.
     462 
     463     "获取供应商名字
     464     "chengqi  20190918    begin   供应商、物料描述手动导入
     465 *    SELECT SINGLE name1 INTO gs_data-name1 FROM lfa1 WHERE lifnr = gs_data-lifnr.
     466 
     467 
     468     CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'    "物料加前导零
     469       EXPORTING
     470         input  = <fs_data>-matnr
     471       IMPORTING
     472         output = gs_data-matnr.
     473 
     474     "检验物料是否存在mara
     475     SELECT SINGLE COUNT(*)
     476        FROM mara WHERE matnr = gs_data-matnr.
     477     "检验物料是否存在、是否存在工厂
     478     IF  sy-subrc <> 0.
     479       gs_data-zmsg = '物料编码' && <fs_data>-matnr && '不存在' .
     480       gs_data-light = icon_red_light.    "错误,红灯
     481       APPEND gs_data TO gt_data.
     482       CLEAR gs_data.
     483       CONTINUE.
     484     ENDIF.
     485 
     486     "获取物料描述
     487     "chengqi  20190918    begin   供应商、物料描述手动导入
     488 *    SELECT SINGLE maktx INTO gs_data-txz01 FROM makt WHERE matnr = gs_data-matnr AND spras = 1.
     489 
     490 
     491     SELECT SINGLE COUNT(*) FROM marc WHERE matnr = gs_data-matnr AND werks = gs_data-werks.
     492     IF  sy-subrc <> 0 .
     493       gs_data-zmsg = '物料' && <fs_data>-matnr && '不存在于工厂' && <fs_data>-werks .
     494       gs_data-light = icon_red_light.    "错误,红灯
     495       APPEND gs_data TO gt_data.
     496       CLEAR gs_data.
     497       CONTINUE.
     498     ENDIF.
     499 
     500     "20181115 若库存地点为空,则取marc-lgfsb
     501     IF <fs_data>-lgort IS INITIAL.
     502       SELECT SINGLE lgfsb INTO gs_data-lgort FROM marc WHERE matnr = gs_data-matnr AND werks = gs_data-werks.
     503       IF sy-subrc NE 0.
     504         gs_data-zmsg = '库存地点不能为空!'.
     505         gs_data-light = icon_red_light.    "错误,红灯
     506         APPEND gs_data TO gt_data.
     507         CLEAR gs_data.
     508         CONTINUE.
     509       ENDIF.
     510     ENDIF.
     511 
     512 
     513 
     514     "检验数量不允许为负或零
     515     IF <fs_data>-menge <= 0.
     516       gs_data-zmsg = <fs_data>-menge  && '采购数量必须大于零'.
     517       gs_data-light = icon_red_light.    "错误,红灯
     518       APPEND gs_data TO gt_data.
     519       CLEAR gs_data.
     520       CONTINUE.
     521     ENDIF.
     522 
     523     "检查供应商是否存在公司、采购组织中存在。
     524 *  READ TABLE lt_lfb1 INTO ls_lfb1 WITH KEY lifnr = <fs_data>-lifnr  bukrs = p_bukrs.
     525 *    SELECT SINGLE COUNT(*) FROM lfb1 WHERE lifnr = gs_data-lifnr AND bukrs = <fs_data>-bukrs.
     526 *    IF  sy-subrc <> 0.
     527 *      gs_data-zmsg = '供应商' && <fs_data>-lifnr && '不在公司代码' && <fs_data>-bukrs && '中存在'.
     528 *      gs_data-light = icon_red_light.    "错误,红灯
     529 *      APPEND gs_data TO gt_data.
     530 *      CLEAR gs_data.
     531 *      CONTINUE.
     532 *    ENDIF.
     533 
     534 *  READ TABLE lt_lfm1 INTO ls_lfm1 WITH KEY lifnr = <fs_data>-lifnr  ekorg = <fs_data>-ekorg.
     535     SELECT SINGLE COUNT(*) FROM lfm1 WHERE lifnr = gs_data-lifnr AND ekorg = gs_data-ekorg.
     536     IF  sy-subrc <> 0.
     537       gs_data-zmsg = '供应商' && <fs_data>-lifnr && '不在采购组织' && <fs_data>-ekorg && '中存在'.
     538       gs_data-light = icon_red_light.    "错误,红灯
     539       APPEND gs_data TO gt_data.
     540       CLEAR gs_data.
     541       CONTINUE.
     542     ENDIF.
     543 
     544     "转化单位
     545     CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
     546       EXPORTING
     547         input    = <fs_data>-meins
     548         language = sy-langu
     549       IMPORTING
     550         output   = <fs_data>-meins "采购订单的计量单位
     551 *     EXCEPTIONS
     552 *       UNIT_NOT_FOUND       = 1
     553 *       OTHERS   = 2
     554       .
     555     IF sy-subrc <> 0.
     556       gs_data-zmsg = <fs_data>-meins  && '单位内部格式不存在'.
     557       gs_data-light = icon_red_light.    "错误,红灯
     558       APPEND gs_data TO gt_data.
     559       CLEAR gs_data.
     560       CONTINUE.
     561     ELSE.
     562       gs_data-meins = <fs_data>-meins.
     563     ENDIF.
     564 
     565 
     566     CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
     567       EXPORTING
     568         input    = <fs_data>-kmein
     569         language = sy-langu
     570       IMPORTING
     571         output   = <fs_data>-kmein "采购订单的计量单位
     572 *     EXCEPTIONS
     573 *       UNIT_NOT_FOUND       = 1
     574 *       OTHERS   = 2
     575       .
     576     IF sy-subrc <> 0.
     577       gs_data-zmsg = <fs_data>-meins  && '单位内部格式不存在'.
     578       gs_data-light = icon_red_light.    "错误,红灯
     579       APPEND gs_data TO gt_data.
     580       CLEAR gs_data.
     581       CONTINUE.
     582     ELSE.
     583       gs_data-kmein = <fs_data>-kmein.
     584     ENDIF.
     585 
     586 *    gs_data-zmsg = '数据正确。'.
     587     gs_data-light = icon_wf_workitem_waiting.   "正确 wait
     588 
     589     "20181204增加序号,辅助报错信息反写
     590     lv_no = lv_no + 1.
     591     gs_data-id = lv_no.
     592 
     593     APPEND gs_data TO gt_data.
     594     CLEAR gs_data.
     595   ENDLOOP.
     596 
     597   SORT gt_data BY znumber.
     598 ENDFORM.
     599 *&---------------------------------------------------------------------*
     600 *&      Form  DISPLAY_LOG
     601 *&---------------------------------------------------------------------*
     602 *       text
     603 *----------------------------------------------------------------------*
     604 *  -->  p1        text
     605 *  <--  p2        text
     606 *----------------------------------------------------------------------*
     607 FORM display_log .
     608   FIELD-SYMBOLS <fs_data> TYPE ty_data.
     609 
     610   gs_layout-zebra = 'X'. "ALV表格按斑马线条纹显示
     611   "i_layout-NO_VLINE = 'X'. "ALV表格顯示時無堅向線
     612   gs_layout-cwidth_opt = 'X'. "将ALV字段宽度设置为最优化
     613   "i_layout-detail_initial_lines = 'X'.
     614   "i_layout-detail_titlebar = '详细内容'.
     615   gs_layout-box_fname  = 'CBOX'.
     616   gs_layout-no_merging = 'X'.
     617 **  gs_layout-excp_led = 'LIGHT'.
     618   wa_repid    = sy-repid.
     619   PERFORM build_fcat.
     620   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
     621     EXPORTING
     622 *     I_INTERFACE_CHECK        = ' '
     623 *     I_BYPASSING_BUFFER       =
     624 *     I_BUFFER_ACTIVE          =
     625       i_callback_program       = wa_repid
     626       i_callback_pf_status_set = 'PF_STATUS_SET' "USER_COMMAND
     627       i_callback_user_command  = 'USER_COMMAND'
     628 *     I_CALLBACK_TOP_OF_PAGE   = ' '
     629 *     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
     630 *     I_CALLBACK_HTML_END_OF_LIST       = ' '
     631 *     I_STRUCTURE_NAME         =
     632 *     I_BACKGROUND_ID          = ' '
     633       i_grid_title             = gs_title
     634 *     I_GRID_SETTINGS          =
     635       is_layout_lvc            = gs_layout
     636       it_fieldcat_lvc          = gt_fieldcat[]
     637 *     IT_EXCLUDING             =
     638 *     IT_SPECIAL_GROUPS_LVC    =
     639 *     IT_SORT_LVC              =
     640 *     IT_FILTER_LVC            =
     641 *     IT_HYPERLINK             =
     642 *     IS_SEL_HIDE              =
     643 *     I_DEFAULT                = 'X'
     644 *     I_SAVE                   = 'X'
     645 *     IS_VARIANT               =
     646 *     IT_EVENTS                =
     647 *     IT_EVENT_EXIT            =
     648 *   IMPORTING
     649 *     E_EXIT_CAUSED_BY_CALLER  =
     650 *     ES_EXIT_CAUSED_BY_USER   =
     651     TABLES
     652       t_outtab                 = gt_data[]
     653     EXCEPTIONS
     654       program_error            = 1
     655       OTHERS                   = 2.
     656   IF sy-subrc <> 0.
     657     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     658     WITH sy-msgv1 sy-msgv2.
     659     EXIT.
     660   ENDIF.
     661 
     662 ENDFORM.
     663 *&---------------------------------------------------------------------*
     664 *&      Form  PF_STATUS_SET
     665 *&---------------------------------------------------------------------*
     666 *      用户命令
     667 *----------------------------------------------------------------------*
     668 *  -->  p1        text
     669 *  <--  p2        text
     670 *----------------------------------------------------------------------*
     671 FORM pf_status_set USING pi_rt_extab TYPE slis_t_extab.
     672   SET PF-STATUS 'ZBC_UPDATE_STATUS'.
     673 ENDFORM.
     674 *&---------------------------------------------------------------------*
     675 *&      Form  USER_COMMAND
     676 *&---------------------------------------------------------------------*
     677 *      用户命令
     678 *----------------------------------------------------------------------*
     679 *  -->  PI_RF_UCOMM   ABAP 系统字段:引发输入后处理的功能代码
     680 *  -->  PI_RS_SELFIELD ALV布局用户命令操作 (刷新)
     681 *  <--  p2        text
     682 *----------------------------------------------------------------------*
     683 FORM user_command USING pi_rf_ucomm LIKE sy-ucomm pi_rs_selfield TYPE slis_selfield.
     684   DATA lv_lines TYPE i.
     685   DATA ls_data TYPE ty_data.
     686   CASE pi_rf_ucomm.
     687 *    WHEN '&CHECK'.
     688 *      PERFORM check_data.
     689 *    WHEN '&SAVE'.
     690 *      PERFORM save_data.
     691     WHEN 'CREATE8'.
     692       READ TABLE gt_data TRANSPORTING NO FIELDS WITH KEY light = icon_red_light.
     693       IF sy-subrc EQ 0.
     694         MESSAGE s004(zmm) DISPLAY LIKE 'W'.
     695         RETURN.
     696       ENDIF.
     697       PERFORM create_data.
     698     WHEN '&IC1'.
     699       CASE pi_rs_selfield-fieldname.
     700         WHEN 'EBELN'.
     701           READ TABLE gt_data INTO ls_data INDEX pi_rs_selfield-tabindex.
     702           IF sy-subrc EQ 0 AND ls_data-ebeln IS NOT INITIAL.
     703             SET PARAMETER ID 'BES' FIELD ls_data-ebeln.
     704             CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
     705           ENDIF.
     706           CLEAR ls_data.
     707       ENDCASE.
     708     WHEN OTHERS.
     709   ENDCASE.
     710 
     711   pi_rs_selfield-refresh = 'X'.
     712   pi_rs_selfield-row_stable = 'X'.
     713   pi_rs_selfield-col_stable = 'X'.
     714 ENDFORM.
     715 *&---------------------------------------------------------------------*
     716 *&      Form  BUILD_FCAT
     717 *&---------------------------------------------------------------------*
     718 *       text
     719 *----------------------------------------------------------------------*
     720 *  -->  p1        text
     721 *  <--  p2        text
     722 *----------------------------------------------------------------------*
     723 FORM build_fcat .
     724   DATA lv_pos TYPE i .
     725   REFRESH gt_fieldcat.
     726   CLEAR gs_fieldcat.
     727   CLEAR lv_pos.
     728   DEFINE %%append_fieldcat.
     729     lv_pos = lv_pos + 1.
     730     gs_fieldcat-col_pos = lv_pos.
     731     gs_fieldcat-fieldname = &1."字段名
     732     gs_fieldcat-coltext = &2."文本
     733     gs_fieldcat-no_zero = &3."去掉前导零
     734     IF gs_fieldcat-fieldname = 'MEINS'
     735       OR gs_fieldcat-fieldname = 'KMEIN'.
     736       gs_fieldcat-ref_field = 'MEINS'.
     737       gs_fieldcat-ref_table = 'EKPO'.
     738     ENDIF.
     739     IF gs_fieldcat-fieldname = 'EBELN'.
     740       gs_fieldcat-hotspot = 'X'.
     741     ENDIF.
     742     APPEND gs_fieldcat TO gt_fieldcat.
     743     CLEAR gs_fieldcat.
     744   END-OF-DEFINITION.
     745 
     746   %%append_fieldcat:
     747   'LIGHT ' '指示灯' '',
     748   'ZNUMBER' '序号' '',
     749   'BSART' '采购订单类型' '',
     750   'BUKRS' '公司代码' '',
     751   'BEDAT' '凭证日期' '',
     752   'EKORG' '采购组织' '',
     753   'EKGRP' '采购组' '',
     754   'LIFNR' '供应商' 'X',
     755   'NAME1' '供应商名称' '',
     756   'MATNR' '物料编码' 'X',
     757   'TXZ01' '物料描述' '',
     758   'MENGE' '订单数量' '',
     759   'MEINS' '订单单位' '',
     760   'KBETR' '价格' '',
     761   'KPEIN' '' '',
     762   'KMEIN' '价格单位' '',
     763   'MWSKZ' '税码' '',
     764   'EINDT' '计划交货日期' '',
     765   'WERKS' '工厂' '',
     766   'LGORT' '库存地点' '',
     767   'RESLO' '发货存储地点' '',
     768   'RETPO' '是否退货' '',
     769   'EBELN' '采购订单号' 'X',
     770   'ZMSG' '状态消息' ''.
     771 ENDFORM.
     772 *&---------------------------------------------------------------------*
     773 *&      Form  CHECK_DATA
     774 *&---------------------------------------------------------------------*
     775 *       text
     776 *----------------------------------------------------------------------*
     777 *  -->  p1        text
     778 *  <--  p2        text
     779 *----------------------------------------------------------------------*
     780 FORM check_data .
     781 
     782 ENDFORM.
     783 *&---------------------------------------------------------------------*
     784 *&      Form  SAVE_DATA
     785 *&---------------------------------------------------------------------*
     786 *       text
     787 *----------------------------------------------------------------------*
     788 *  -->  p1        text
     789 *  <--  p2        text
     790 *----------------------------------------------------------------------*
     791 FORM save_data .
     792 
     793 
     794 ENDFORM.
     795 *&---------------------------------------------------------------------*
     796 *& Form CREATE_DATA
     797 *&---------------------------------------------------------------------*
     798 *& text
     799 *&---------------------------------------------------------------------*
     800 *& -->  p1        text
     801 *& <--  p2        text
     802 *&---------------------------------------------------------------------*
     803 FORM create_data .
     804   DATA:gs_poheader           TYPE                   bapimepoheader, "抬头数据
     805        gs_poheaderx          TYPE                   bapimepoheaderx,
     806        gt_return             TYPE STANDARD TABLE OF bapiret2,
     807        gwa_return            TYPE                   bapiret2,
     808        gt_item               TYPE STANDARD TABLE OF bapimepoitem, "项目数据
     809        gwa_item              TYPE                   bapimepoitem,
     810        gt_itemx              TYPE STANDARD TABLE OF bapimepoitemx,
     811        gwa_itemx             TYPE                   bapimepoitemx,
     812        gt_poschedule         TYPE STANDARD TABLE OF bapimeposchedule, "计划行数据
     813        gwa_poschedule        TYPE                   bapimeposchedule,
     814        gt_poschedulex        TYPE STANDARD TABLE OF bapimeposchedulx,
     815        gwa_poschedulex       TYPE                   bapimeposchedulx,
     816        gt_pocond             TYPE STANDARD TABLE OF bapimepocond, "条件数据
     817        gwa_pocond            TYPE                   bapimepocond,
     818        gt_pocondx            TYPE STANDARD TABLE OF bapimepocondx,
     819        gwa_pocondx           TYPE                   bapimepocondx,
     820        gt_pocomponents       TYPE STANDARD TABLE OF bapimepocomponent, "组件数据
     821        gwa_pocomponents      TYPE                   bapimepocomponent,
     822        gwa_pocomponents_temp TYPE                   bapimepocomponent,
     823        gt_pocomponentsx      TYPE STANDARD TABLE OF bapimepocomponentx,
     824        gwa_pocomponentsx     TYPE                   bapimepocomponentx,
     825        gt_poaccount          TYPE STANDARD TABLE OF bapimepoaccount,
     826        gwa_poaccount         TYPE                   bapimepoaccount,
     827        gt_poaccountx         TYPE STANDARD TABLE OF bapimepoaccountx,
     828        gwa_poaccountx        TYPE                   bapimepoaccountx.
     829 
     830   DATA:lv_num TYPE bapimepoheader-po_number.
     831 
     832 
     833   DATA:lt_data TYPE TABLE OF ty_data,
     834        ls_data TYPE ty_data.
     835   DATA lv_msg(255) .
     836   DATA lv_light TYPE icon_d.
     837   DATA:lv_kmein TYPE konv-kmein.
     838 
     839   "用于日格式的转化
     840   DATA lv_eeind TYPE mepo1211-eeind.
     841 
     842   "20181204 明细行报错信息反馈
     843   DATA:BEGIN OF lt_id OCCURS 0,
     844          sub_id TYPE i, "bapi行号
     845          id     TYPE i, "行号
     846        END OF lt_id.
     847   DATA:lv_id TYPE i.
     848 
     849   LOOP AT gt_data INTO gs_data WHERE cbox = abap_on.
     850     MOVE gs_data TO ls_data.
     851     APPEND ls_data TO lt_data.
     852     CLEAR ls_data.
     853   ENDLOOP.
     854 
     855   IF lt_data[] IS INITIAL.
     856     MESSAGE w005(zmm) WITH '导入得订单'.
     857     RETURN.
     858   ENDIF.
     859 
     860   LOOP AT lt_data TRANSPORTING NO FIELDS WHERE ebeln IS NOT INITIAL.
     861     EXIT.
     862   ENDLOOP.
     863   IF sy-subrc EQ 0.
     864     MESSAGE w008(zmm).
     865     RETURN.
     866   ENDIF.
     867 
     868   SORT gt_data BY cbox znumber.
     869   SORT lt_data BY znumber.
     870   DATA: t_ebelp LIKE ekpo-ebelp.
     871   FIELD-SYMBOLS <fs1> TYPE ty_data.
     872 
     873   LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs>).
     874     "明细行报错准备行号
     875     lv_id = lv_id + 1.
     876     lt_id-id = <fs>-id.
     877     lt_id-sub_id = lv_id.
     878     APPEND lt_id.
     879     CLEAR lt_id.
     880     t_ebelp = t_ebelp + 00010.
     881     gwa_item-po_item = t_ebelp. "采购凭证的项目编号
     882     gwa_item-material = <fs>-matnr.
     883 *    gwa_item-item_cat = '0'.
     884     SELECT SINGLE maktx FROM makt INTO gwa_item-short_text WHERE matnr = <fs>-matnr AND spras = '1'.
     885 *    gwa_item-short_text = <fs>-txz01."短文本
     886     gwa_item-quantity = <fs>-menge."采购订单数量
     887     gwa_item-po_unit = <fs>-meins ."采购订单的计量单位
     888     gwa_item-plant = <fs>-werks. "工厂
     889     gwa_item-stge_loc = <fs>-lgort."库存地点
     890     gwa_item-suppl_stloc = <fs>-reslo."发货存储地点
     891     gwa_item-ret_item = <fs>-retpo."是否退货
     892     gwa_item-tax_code = <fs>-mwskz.
     893     gwa_item-OVER_DLV_TOL =  50.
     894 *    gwa_item-date_qty_fixed = 'X'.
     895 *    gwa_item-net_price = ls_data-netpr.
     896     APPEND gwa_item TO gt_item.
     897 
     898     gwa_itemx-po_item = t_ebelp. "采购凭证的项目编号
     899     gwa_itemx-material = 'X'.
     900     gwa_itemx-short_text = 'X'."短文本
     901     gwa_itemx-quantity = 'X'."采购订单数量
     902     gwa_itemx-po_unit = 'X' ."采购订单的计量单位
     903     gwa_itemx-plant = 'X'."工厂
     904     gwa_itemx-stge_loc = 'X'. "库存地点
     905     gwa_itemx-ret_item = 'X'. "是否退货
     906 *    gwa_itemx-item_cat = 'X'.
     907     gwa_itemx-suppl_stloc = 'X'.
     908     gwa_itemx-tax_code = 'X'.
     909     gwa_itemx-OVER_DLV_TOL = 'X'.
     910 *    gwa_itemx-date_qty_fixed = 'X'.
     911 *     gwa_item-net_price = 'X'.
     912     APPEND gwa_itemx TO gt_itemx.
     913 
     914     gwa_poschedule-po_item = t_ebelp. "采购凭证的项目编号
     915     gwa_poschedule-sched_line = 0001. "采购凭证的项目编号
     916     gwa_poschedule-del_datcat_ext = 'D'."交货日期的类别
     917     "日期格式转化
     918     CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
     919       EXPORTING
     920         date_internal = <fs>-eindt
     921       IMPORTING
     922         date_external = lv_eeind
     923 *     EXCEPTIONS
     924 *       DATE_INTERNAL_IS_INVALID       = 1
     925 *       OTHERS        = 2
     926       .
     927     gwa_poschedule-delivery_date = lv_eeind."交货日期
     928     CLEAR lv_eeind.
     929     gwa_poschedule-quantity = <fs>-menge."采购订单数量
     930     APPEND gwa_poschedule TO gt_poschedule.
     931 
     932     gwa_poschedulex-po_item = t_ebelp. "采购凭证的项目编号
     933     gwa_poschedulex-sched_line = 0001. "采购凭证的项目编号
     934     gwa_poschedulex-del_datcat_ext = 'X'."交货日期的类别
     935     gwa_poschedulex-delivery_date = 'X'."交货日期
     936     gwa_poschedulex-quantity = 'X'."采购订单数量
     937     APPEND gwa_poschedulex TO gt_poschedulex.
     938 
     939     IF <fs>-kbetr IS NOT INITIAL.
     940       gwa_pocond-itm_number = t_ebelp.
     941       gwa_pocond-cond_type = 'PBXX'.
     942       gwa_pocond-cond_value = <fs>-kbetr.   "价格
     943       gwa_pocond-cond_unit = <fs>-kmein.
     944       CLEAR lv_kmein.
     945 *      gwa_pocond-cond_unit  = <fs>-kmein.   "条件单位
     946       gwa_pocond-cond_p_unt = <fs>-kpein."GS_EXCEL_RAW0-PEINH.   "价格单位
     947       gwa_pocond-currency = 'CNY'.
     948       gwa_pocond-change_id    = 'I'.
     949       APPEND gwa_pocond TO gt_pocond.
     950 
     951       gwa_pocondx-itm_number = t_ebelp.
     952       gwa_pocondx-cond_type = 'X'.
     953       gwa_pocondx-cond_value = 'X'.
     954       gwa_pocondx-cond_unit = 'X'.    "条件单位
     955       gwa_pocondx-cond_p_unt = 'X'.   "价格单位
     956       gwa_pocondx-currency = 'X'.
     957       gwa_pocondx-change_id    = 'X'.
     958       APPEND gwa_pocondx TO gt_pocondx.
     959     ENDIF.
     960     "如果有BOM,自动带出组件,如果使用下面代码会添加组件
     961 *      GWA_POCOMPONENTS-PO_ITEM = '00010' .
     962 *      GWA_POCOMPONENTS-SCHED_LINE = 0001.
     963 **    lwa_pocomponents-item_no = '0010'.
     964 *      GWA_POCOMPONENTS-MATERIAL = '000000000013008278'.
     965 *      GWA_POCOMPONENTS-ENTRY_QUANTITY = 1.
     966 *      GWA_POCOMPONENTS-ENTRY_UOM  = 'PC'.
     967 *      GWA_POCOMPONENTS-REQ_DATE  =  SY-DATUM - 1.    "组件需求日期
     968 *      GWA_POCOMPONENTS-PLANT  = '1010'.
     969 *      GWA_POCOMPONENTS-CHANGE_ID = 'I'.
     970 *      APPEND GWA_POCOMPONENTS TO GT_POCOMPONENTS.
     971 *
     972 *      GWA_POCOMPONENTSX-PO_ITEM = '00010'.
     973 *      GWA_POCOMPONENTSX-SCHED_LINE = 0001.
     974 **    lwa_pocomponentsx-item_no = '0010'.
     975 *      GWA_POCOMPONENTSX-MATERIAL =  'X'.
     976 *      GWA_POCOMPONENTSX-ENTRY_QUANTITY = 'X'.
     977 *      GWA_POCOMPONENTSX-ENTRY_UOM  = 'X'.
     978 *      GWA_POCOMPONENTSX-REQ_DATE = 'X'.
     979 *      GWA_POCOMPONENTSX-PLANT  = 'X'.
     980 *      GWA_POCOMPONENTSX-CHANGE_ID = 'X'.
     981 *      APPEND GWA_POCOMPONENTSX TO GT_POCOMPONENTSX.
     982 
     983     AT END OF znumber.
     984       gs_poheader-doc_type = <fs>-bsart."类型
     985       gs_poheader-vendor = <fs>-lifnr."供应商
     986       gs_poheader-purch_org = <fs>-ekorg."采购组织
     987       gs_poheader-pur_group = <fs>-ekgrp."采购组
     988       gs_poheader-comp_code = <fs>-bukrs."公司代码
     989       gs_poheader-currency = 'CNY'."货币
     990       gs_poheader-doc_date = <fs>-bedat."采购凭证日期
     991       gs_poheader-langu = sy-langu.
     992       gs_poheader-status = 'I'.
     993 *      GS_POHEADER-INFO_UPD = 'I'.
     994 *      GS_POHEADER-ITEM_INTVL = ''.
     995 *      GS_POHEADER-ITEM_INTVL = ''.
     996 
     997       gs_poheaderx-doc_type = 'X'.
     998       gs_poheaderx-vendor = 'X'.
     999       gs_poheaderx-purch_org = 'X'.
    1000       gs_poheaderx-pur_group = 'X'.
    1001       gs_poheaderx-comp_code = 'X'.
    1002       gs_poheaderx-doc_date = 'X'.
    1003       gs_poheaderx-langu = 'X'.
    1004       gs_poheaderx-currency = 'X'."货币
    1005       gs_poheaderx-status = 'X'."来自BAPI得采购订单
    1006 *      GS_POHEADERX-ITEM_INTVL = 'X'.
    1007 
    1008       CALL FUNCTION 'BAPI_PO_CREATE1'
    1009         EXPORTING
    1010           poheader         = gs_poheader
    1011           poheaderx        = gs_poheaderx
    1012 *         POADDRVENDOR     =
    1013 *         TESTRUN          =
    1014 *         MEMORY_UNCOMPLETE            =
    1015 *         MEMORY_COMPLETE  =
    1016 *         POEXPIMPHEADER   =
    1017 *         POEXPIMPHEADERX  =
    1018 *         VERSIONS         =
    1019 *         NO_MESSAGING     =
    1020 *         NO_MESSAGE_REQ   =
    1021 *         NO_AUTHORITY     =
    1022           no_price_from_po = 'X'
    1023 *         PARK_COMPLETE    =
    1024 *         PARK_UNCOMPLETE  =
    1025         IMPORTING
    1026           exppurchaseorder = <fs>-ebeln
    1027 *         EXPHEADER        =
    1028 *         EXPPOEXPIMPHEADER            =
    1029         TABLES
    1030           return           = gt_return
    1031           poitem           = gt_item
    1032           poitemx          = gt_itemx
    1033 *         POADDRDELIVERY   =
    1034           poschedule       = gt_poschedule
    1035           poschedulex      = gt_poschedulex
    1036 *         POACCOUNT        =
    1037 *         POACCOUNTPROFITSEGMENT       =
    1038 *         POACCOUNTX       =
    1039 *         POCONDHEADER     =
    1040 *         POCONDHEADERX    =
    1041           pocond           = gt_pocond
    1042           pocondx          = gt_pocondx
    1043 *         POLIMITS         =
    1044 *         POCONTRACTLIMITS =
    1045 *         POSERVICES       =
    1046 *         POSRVACCESSVALUES            =
    1047 *         POSERVICESTEXT   =
    1048 *         EXTENSIONIN      =
    1049 *         EXTENSIONOUT     =
    1050 *         POEXPIMPITEM     =
    1051 *         POEXPIMPITEMX    =
    1052 *         POTEXTHEADER     =
    1053 *         POTEXTITEM       =
    1054 *         ALLVERSIONS      =
    1055 *         POPARTNER        =
    1056 *         pocomponents     = gt_pocomponents
    1057 *         pocomponentsx    = gt_pocomponentsx.
    1058         .
    1059       LOOP AT gt_return INTO gwa_return WHERE type = 'E' OR type = 'A'.
    1060         EXIT.
    1061       ENDLOOP.
    1062 
    1063       IF sy-subrc = 0.
    1064         CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    1065         LOOP AT gt_return INTO gwa_return WHERE type = 'E' OR type = 'A'.
    1066 *          <fs>-light =  icon_red_light.
    1067 *          IF <fs>-zmsg IS INITIAL.
    1068 *            <fs>-zmsg = gwa_return-message.
    1069 *          ELSE.
    1070 *            <fs>-zmsg = <fs>-zmsg && '/' && gwa_return-message.
    1071 *          ENDIF.
    1072           lv_light = icon_red_light.
    1073           IF gwa_return-parameter = 'POHEADER'.
    1074             IF lv_msg IS INITIAL.
    1075               lv_msg = gwa_return-message.
    1076             ELSE.
    1077               lv_msg = lv_msg && '/' && gwa_return-message.
    1078             ENDIF.
    1079           ELSE.
    1080             READ TABLE lt_id WITH KEY sub_id = gwa_return-row.
    1081             IF sy-subrc EQ 0.
    1082               READ TABLE gt_data ASSIGNING <fs1> WITH KEY id = lt_id-id BINARY SEARCH.
    1083               IF sy-subrc EQ 0.
    1084                 IF <fs1>-zmsg IS INITIAL.
    1085                   <fs1>-zmsg = gwa_return-message.
    1086                 ELSE.
    1087                   <fs1>-zmsg = <fs1>-zmsg && '/' && gwa_return-message.
    1088                 ENDIF.
    1089               ENDIF.
    1090             ENDIF.
    1091           ENDIF.
    1092         ENDLOOP.
    1093         LOOP AT lt_id.
    1094           READ TABLE gt_data ASSIGNING <fs1> WITH KEY id = lt_id-id BINARY SEARCH.
    1095           IF sy-subrc EQ 0.
    1096             <fs1>-light = icon_red_light.
    1097             CHECK lv_msg IS NOT INITIAL.
    1098             IF <fs1>-zmsg IS INITIAL.
    1099               <fs1>-zmsg = lv_msg.
    1100             ELSE.
    1101               <fs1>-zmsg = <fs1>-zmsg && '/' && lv_msg.
    1102             ENDIF.
    1103           ENDIF.
    1104         ENDLOOP.
    1105       ELSE.
    1106         CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    1107           EXPORTING
    1108             wait = 'X'.
    1109         LOOP AT lt_id.
    1110           READ TABLE gt_data ASSIGNING <fs1> WITH KEY id = lt_id-id BINARY SEARCH.
    1111           IF sy-subrc EQ 0.
    1112             <fs1>-light = icon_green_light.
    1113             <fs1>-zmsg = '创建成功!'.
    1114             <fs1>-ebeln = <fs>-ebeln.
    1115           ENDIF.
    1116         ENDLOOP.
    1117 *        <fs>-light =  icon_green_light.
    1118 *        <fs>-zmsg = '创建成功!'.
    1119       ENDIF.
    1120       REFRESH:gt_item,gt_itemx,gt_poschedule,gt_poschedulex,gt_pocond,gt_pocondx,lt_id.
    1121       CLEAR:gwa_item,gwa_itemx,gs_poheader,gs_poheaderx,gwa_poschedule,gwa_poschedulex,
    1122             gwa_pocond,gwa_pocondx,t_ebelp,lv_id,lt_id,lv_msg.
    1123     ENDAT.
    1124   ENDLOOP.
    1125 
    1126   CLEAR:lv_num,lv_msg,lv_light.
    1127 
    1128 *  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs1>) WHERE cbox EQ abap_on.
    1129 *    AT NEW znumber.
    1130 *      LOOP AT lt_data INTO ls_data WHERE znumber = <fs1>-znumber AND zmsg IS NOT INITIAL.
    1131 *        lv_num = ls_data-ebeln.
    1132 *        lv_msg = ls_data-zmsg.
    1133 *        lv_light = ls_data-light.
    1134 *        EXIT.
    1135 *      ENDLOOP.
    1136 *    ENDAT.
    1137 *    <fs1>-ebeln = lv_num.
    1138 *    <fs1>-zmsg = lv_msg.
    1139 *    <fs1>-light = lv_light.
    1140 *  ENDLOOP.
    1141 
    1142 ENDFORM.
    View Code

    5、强改程序

     1      DATA: BEGIN OF src OCCURS 1,
     2              txt(255) TYPE c,
     3            END OF src.
     4      PARAMETERS: rep LIKE trdir-name.
     5 
     6      AT SELECTION-SCREEN.
     7        IF sy-uname <> 'SAP'.
     8          MESSAGE '禁止使用' TYPE 'E'.
     9        ENDIF.
    10 
    11      START-OF-SELECTION.
    12        sy-uname = 'SAP'.
    13        READ REPORT rep INTO src.
    14        EDITOR-CALL FOR src.
    15        IF sy-subrc = 0.
    16          INSERT REPORT rep FROM src.
    17        ENDIF.
    View Code

    6、批导/上传数据

    z93_abap_batch_input_inc

    *&---------------------------------------------------------------------*
    *& 创建人          请求号         子程序描述
    *&                            批量导入程序-子程序
    *&---------------------------------------------------------------------*
    
    *&---------------------------------------------------------------------*
    *&---------------------------------------------------------------------*
    *公共程序,禁止修改,or->后果自负
    *公共程序,禁止修改,or->后果自负
    *公共程序,禁止修改,or->后果自负
    *&---------------------------------------------------------------------*
    *&---------------------------------------------------------------------*
    
    TYPE-POOLS:ole2 ,slis,ICON.
    
    TYPES:BEGIN OF ty_upload_data,
      row(4096),
    END OF ty_upload_data,
    tyt_upload_data TYPE TABLE OF ty_upload_data,
    BEGIN OF ty_check_msg,
      index TYPE i,
      t_msg TYPE bapiret2_t,
    END OF ty_check_msg.
    
    DATA: g_objid LIKE wwwdata-objid VALUE sy-repid.
    DATA: go_excel TYPE ole2_object,
          gt_upload_data TYPE tyt_upload_data,
          gt_fieldcat TYPE lvc_t_fcat,
          gs_layout TYPE lvc_s_layo,
          gt_check_msg TYPE HASHED TABLE OF ty_check_msg WITH UNIQUE KEY index.
    DATA: gt_bdc TYPE TABLE OF bdcdata,
          gt_bdc_msg TYPE trty_bdcmsgcoll,
          gs_bdc_msg TYPE bdcmsgcoll,
          gs_bdc_option TYPE ctu_params.
    DATA: g_lines TYPE i.
    
    *&---------------------------------------------------------------------*
    *&      Form  bi_download_template
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_download_template USING p_objid value(p_extension) p_default_filename.
      DATA: l_filename     TYPE string,
            l_fullpath     TYPE string,
            l_path         TYPE string,
            l_file_filter  TYPE string,
            ls_objdata     TYPE wwwdatatab,
            l_destination  TYPE rlgrap-filename,
            l_rc           TYPE i.
    
      SELECT SINGLE relid objid INTO CORRESPONDING FIELDS OF ls_objdata FROM wwwdata WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.
      IF sy-subrc <> 0.
        MESSAGE '模板文件不存在' TYPE 'E'.
      ENDIF.
    
      TRANSLATE p_extension TO UPPER CASE.
      CASE p_extension.
        WHEN 'XLS'.
          l_file_filter = 'Excel文件(*.xls)|*.xls'.
        WHEN 'XLSX'.
          l_file_filter = 'Excel文件(*.xlsx)|*.xlsx'.
        WHEN OTHERS.
          l_file_filter = 'Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx'.
      ENDCASE.
    
      CALL METHOD cl_gui_frontend_services=>file_save_dialog
        EXPORTING
          default_extension = p_extension
          default_file_name = p_default_filename
          file_filter       = l_file_filter
        CHANGING
          filename          = l_filename
          path              = l_path
          fullpath          = l_fullpath
        EXCEPTIONS
          OTHERS            = 1.
      IF l_fullpath = ''.
        MESSAGE '没有选择文件' TYPE 'E'.
      ENDIF.
    
      IF STRLEN( l_fullpath ) > 128.
        MESSAGE '文件名长度超出128,请重新选择文件' TYPE 'S' DISPLAY LIKE 'E'.
        STOP.
      ENDIF.
    
      l_destination = l_fullpath.
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          key         = ls_objdata
          destination = l_destination
        IMPORTING
          rc          = l_rc.
      IF l_rc <> 0.
        MESSAGE '导入模板下载失败' TYPE 'E'.
      ENDIF.
    ENDFORM.                    "bi_download_template
    *&---------------------------------------------------------------------*
    *&      Form  bi_select_excel_file
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_select_excel_file CHANGING c_filename TYPE string.
      DATA: lt_filetable TYPE filetable,
            ls_file TYPE file_table,
            l_rc TYPE i,
            l_action TYPE i.
    
      CALL METHOD cl_gui_frontend_services=>file_open_dialog
        EXPORTING
          default_extension       = 'XLS'
          default_filename        = ''
          file_filter             = 'Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx'
          multiselection          = ''
        CHANGING
          file_table              = lt_filetable
          rc                      = l_rc
          user_action             = l_action
        EXCEPTIONS
          file_open_dialog_failed = 1
          cntl_error              = 2
          error_no_gui            = 3
          not_supported_by_gui    = 4
          OTHERS                  = 5.
    
      IF l_action NE 0.
        c_filename = ''.
      ELSE.
        READ TABLE lt_filetable INDEX 1 INTO ls_file.
        c_filename = ls_file-filename.
      ENDIF.
    ENDFORM.                    "bi_select_excel_file
    *&---------------------------------------------------------------------*
    *&      Form  bi_upload_data_from_excel
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_upload_data_from_excel TABLES ct_data
    USING  i_filename             TYPE  string
          i_sheetname            TYPE  string
          i_top_left_range       TYPE  string
          i_flag_ignore_newline  TYPE  flag
          i_flag_close_file      TYPE  flag
          i_flag_quit_excel      TYPE  flag.
      DATA: lo_books TYPE ole2_object,
            lo_book TYPE ole2_object,
            lo_sheet TYPE ole2_object,
            lo_range TYPE ole2_object,
            lo_used_range TYPE ole2_object,
            lo_cells TYPE ole2_object,
            l_filtermode TYPE i,
            l_toprow TYPE i,
            l_leftcolumn TYPE i,
            l_usedrows TYPE i,
            l_usedcolumns TYPE i,
            l_maxrow TYPE i,
            l_maxcolumn TYPE i.
      DATA: lt_dummy TYPE TABLE OF ty_upload_data,
            l_rc TYPE i.
    
      CLEAR sy-subrc.
    
      IF go_excel IS INITIAL OR go_excel-handle = -1.
        CREATE OBJECT go_excel 'EXCEL.APPLICATION'.
        IF sy-subrc NE 0.
          sy-subrc = 1.
          EXIT.
        ENDIF.
      ENDIF.
    
      GET PROPERTY OF go_excel 'Workbooks'   = lo_books.
    
      "1 Open Excel File
      CALL METHOD OF
        lo_books
        'Open' = lo_book
        EXPORTING
        #1 = i_filename.
      IF sy-subrc NE 0.
        PERFORM bi_quit_excel.
        sy-subrc = 2.
        EXIT.
      ENDIF.
    
      IF i_sheetname = ''.
        GET PROPERTY OF go_excel 'ActiveSheet' = lo_sheet.
      ELSE.
        GET PROPERTY OF lo_book 'Sheets' = lo_sheet
        exporting
          #1 = i_sheetname.
      ENDIF.
    
      "2 取消筛选、取消隐藏的行和列
      GET PROPERTY OF lo_sheet 'Columns' = lo_range.
      SET PROPERTY OF lo_range 'Hidden' = 0.
      GET PROPERTY OF lo_sheet 'FilterMode' = l_filtermode.
      IF l_filtermode = 1.
        CALL METHOD OF
          lo_range
          'AutoFilter'.
      ENDIF.
      GET PROPERTY OF lo_sheet 'Rows' = lo_range.
      SET PROPERTY OF lo_range 'Hidden' = 0.
    
      "3 获取Excel最大行和最大列
      GET PROPERTY OF lo_sheet 'UsedRange' = lo_used_range.
      "  3 - 1 所使用区域的左上角单元格的行、列
      GET PROPERTY OF lo_range 'Row' = l_toprow.
      GET PROPERTY OF lo_range 'Column' = l_leftcolumn.
      "  3 - 2 使用的总行数
      GET PROPERTY OF lo_range 'Rows'  = lo_range.
      GET PROPERTY OF lo_range 'Count' = l_usedrows.
      "  3 - 3 使用的总列数
      GET PROPERTY OF lo_used_range 'Columns' = lo_range.
      GET PROPERTY OF lo_range 'Count' = l_usedcolumns.
      "  3 - 4 最大行、最大列
      l_maxrow = l_toprow + l_usedrows - 1.
      l_maxcolumn = l_leftcolumn + l_usedcolumns - 1.
    
      "4 Copy Excel内容
      "  4 - 1 根据左上角、右下角单元格,获取单元格范围
      GET PROPERTY OF lo_sheet 'Cells' = lo_cells
      exporting
        #1      = l_maxrow
        #2      = l_maxcolumn.
      GET PROPERTY OF lo_sheet 'Range' = lo_range
      exporting
        #1      = i_top_left_range
        #2      = lo_cells.
    
      "  4 - 2 替换无效字符
      SET PROPERTY OF go_excel 'DisplayAlerts' = 0.
      CALL METHOD OF
      lo_range
      'REPLACE'
    
      EXPORTING
        #1        = cl_abap_char_utilities=>cr_lf                    "Chr(13) + Chr(10)
        #2        = cl_abap_char_utilities=>newline.            "Chr(10)
      CALL METHOD OF
      lo_range
      'REPLACE'
    
      EXPORTING
        #1        = cl_abap_char_utilities=>horizontal_tab      "Chr(9)
        #2        = ''.                                       "NULL
      IF i_flag_ignore_newline = 'X'.
        CALL METHOD OF
        lo_range
        'REPLACE'
    
        EXPORTING
          #1        = cl_abap_char_utilities=>newline           "Chr(10)
          #2        = ''.
      ENDIF.
    
      "  4 - 3 复制单元格数据
      CALL METHOD OF
        lo_range
        'Copy'.
    
      "5 Import Data
      PERFORM bi_upload_data_from_clipboard TABLES ct_data.
    
      "6 Clear Clipboard
      CALL METHOD cl_gui_frontend_services=>clipboard_export
        IMPORTING
          data   = lt_dummy
        CHANGING
          rc     = l_rc
        EXCEPTIONS
          OTHERS = 1.
    
      "关闭工作簿
      IF i_flag_close_file = 'X'.
        CALL METHOD OF
          lo_book
          'Close'.
      ENDIF.
    
      "退出Excel程序
      SET PROPERTY OF go_excel 'DisplayAlerts' = 1.
      IF i_flag_quit_excel = 'X'.
        PERFORM bi_quit_excel.
      ENDIF.
    ENDFORM.                    "bi_upload_data_from_excel
    *&---------------------------------------------------------------------*
    *&      Form  bi_upload_data_from_clipboard
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_upload_data_from_clipboard TABLES ct_data.
      DATA: ls_upload_data TYPE ty_upload_data,
      BEGIN OF ls_cellvalue,
        value(500) TYPE c,
      END OF ls_cellvalue,
      lt_cellvalues LIKE TABLE OF ls_cellvalue,
      lo_exception TYPE REF TO cx_root.
      FIELD-SYMBOLS: <ls_line> TYPE ANY,
      <l_fieldvalue> TYPE ANY.
    
      CALL METHOD cl_gui_frontend_services=>clipboard_import
        IMPORTING
          data                 = gt_upload_data
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
    
      ASSIGN LOCAL COPY OF INITIAL LINE OF ct_data TO <ls_line>.
    
      LOOP AT gt_upload_data INTO ls_upload_data.
        SPLIT ls_upload_data-row AT cl_abap_char_utilities=>horizontal_tab INTO TABLE lt_cellvalues.
        LOOP AT lt_cellvalues INTO ls_cellvalue.
          ASSIGN COMPONENT sy-tabix OF STRUCTURE <ls_line> TO <l_fieldvalue>.
          IF sy-subrc <> 0.
            EXIT.
          ENDIF.
    
          TRY.
              <l_fieldvalue> = ls_cellvalue-value.
            CATCH cx_root INTO lo_exception.
          ENDTRY.
        ENDLOOP.
    
        APPEND <ls_line> TO ct_data.
        CLEAR: <ls_line>.
      ENDLOOP.
    ENDFORM.                    "bi_upload_data_from_clipboard
    *&---------------------------------------------------------------------*
    *&      Form  BI_CLOSE_WORKBOOK
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_close_workbook.
      DATA: lo_book TYPE ole2_object.
    
      SET PROPERTY OF go_excel 'DisplayAlerts' = 0.
      GET PROPERTY OF go_excel 'ActiveWorkbook' = lo_book.
      CALL METHOD OF
        lo_book
        'Close'.
      SET PROPERTY OF go_excel 'DisplayAlerts' = 1.
    ENDFORM.                    "BI_CLOSE_WORKBOOK
    *&---------------------------------------------------------------------*
    *&      Form  bi_quit_excel
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_quit_excel.
      CALL METHOD OF
        go_excel
        'Quit'.
      FREE OBJECT go_excel.
    ENDFORM.                    "bi_quit_excel
    *&---------------------------------------------------------------------*
    *&      Form  bi_build_fieldcat
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_build_fieldcat USING  i_fieldname   TYPE lvc_fname
          i_key            TYPE lvc_key
          i_ref_table      TYPE lvc_rtname
          i_ref_field      TYPE lvc_rfname
          i_cfieldname  TYPE lvc_cfname
          i_qfieldname  TYPE lvc_qfname
          i_edit        TYPE lvc_edit
          i_convexit    TYPE convexit
          i_hotspot        TYPE lvc_hotspt
          i_outputlen      TYPE lvc_outlen
          i_no_zero        TYPE lvc_nozero
          i_coltext        TYPE lvc_txtcol.
      DATA: ls_fieldcat TYPE lvc_s_fcat.
    
      ls_fieldcat-fieldname   = i_fieldname.
      ls_fieldcat-key         = i_key.
      ls_fieldcat-ref_table   = i_ref_table.
      ls_fieldcat-ref_field   = i_ref_field.
      ls_fieldcat-cfieldname  = i_cfieldname.
      ls_fieldcat-qfieldname  = i_qfieldname.
      ls_fieldcat-edit        = i_edit.
      ls_fieldcat-convexit    = i_convexit.
      ls_fieldcat-hotspot     = i_hotspot.
      ls_fieldcat-outputlen   = i_outputlen.
      ls_fieldcat-no_zero     = i_no_zero.
      ls_fieldcat-coltext     = i_coltext.
      APPEND ls_fieldcat TO gt_fieldcat.
    ENDFORM.                    "build_fieldcat
    *&---------------------------------------------------------------------*
    *&      Form  bi_display_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_display_data TABLES ct_data
    USING i_repid                TYPE repid
          i_form_pf_status    TYPE formname
          i_form_user_command    TYPE formname.
      DESCRIBE TABLE ct_data LINES g_lines.
    
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          i_callback_program       = i_repid
          i_callback_top_of_page   = 'BI_ALV_TOP_OF_PAGE'
          i_callback_pf_status_set = i_form_pf_status
          i_callback_user_command  = i_form_user_command
          it_fieldcat_lvc          = gt_fieldcat
          is_layout_lvc            = gs_layout
          i_default                = 'X'
          i_save                   = 'A'
        TABLES
          t_outtab                 = ct_data
        EXCEPTIONS
          OTHERS                   = 1.
    ENDFORM.                    "bi_display_data
    *&---------------------------------------------------------------------*
    *&      Form  bi_alv_top_of_page
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_alv_top_of_page.
      DATA: lt_comment TYPE slis_t_listheader,
            ls_line TYPE slis_listheader.
      DATA:g_lines_midd(100).
      CLEAR:g_lines_midd.
      ls_line-typ  = 'S'.
    *  ls_line-info = '共' && g_lines && '条数据'.
    
      g_lines_midd = g_lines.
      CONDENSE g_lines_midd.
      CONCATENATE '' g_lines_midd '条数据' INTO  ls_line-info.
      APPEND ls_line TO lt_comment.
    
      CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
        EXPORTING
          it_list_commentary = lt_comment.
    ENDFORM.                    "ALV_TOP_OF_PAGE_ALV
    *&---------------------------------------------------------------------*
    *&      Form  bi_gen_bdc_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_gen_bdc_data USING i_program
          i_dynpro
          i_dynbegin
          i_fnam
          i_fval.
      DATA: ls_bdc TYPE bdcdata.
    
      ls_bdc-program  = i_program.
    
      ls_bdc-dynpro   = i_dynpro.
      ls_bdc-dynbegin = i_dynbegin.
      ls_bdc-fnam     = i_fnam.
      ls_bdc-fval     = i_fval.
      CONDENSE  ls_bdc-fval  .
      APPEND ls_bdc TO gt_bdc.
    ENDFORM.                    "bi_gen_bdc_data
    *&---------------------------------------------------------------------*
    *&      Form  bi_call_bdc
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_call_bdc USING i_transaction.
      CLEAR gt_bdc_msg.
      CALL TRANSACTION i_transaction USING gt_bdc OPTIONS FROM gs_bdc_option MESSAGES INTO gt_bdc_msg.
    ENDFORM.                    "bi_call_bdc
    *&---------------------------------------------------------------------*
    *&      Form  bi_add_check_msg
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_add_check_msg USING  i_index TYPE i
          is_msg TYPE bapiret2.
      FIELD-SYMBOLS: <ls_check_msg> TYPE ty_check_msg.
    
      READ TABLE gt_check_msg ASSIGNING <ls_check_msg> WITH TABLE KEY INDEX = i_index.
      IF sy-subrc <> 0.
        ASSIGN LOCAL COPY OF INITIAL LINE OF gt_check_msg TO <ls_check_msg>.
        <ls_check_msg>-index = i_index.
        APPEND is_msg TO <ls_check_msg>-t_msg.
        INSERT <ls_check_msg> INTO TABLE gt_check_msg.
      ELSE.
        APPEND is_msg TO <ls_check_msg>-t_msg.
      ENDIF.
    ENDFORM.                    "bi_add_check_msg
    *&---------------------------------------------------------------------*
    *&      Form  bi_write_messages_to_excel
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_write_messages_to_excel USING i_top_left_addr.
      DATA: l_maxindex TYPE i.
      DATA: ls_excel TYPE ty_upload_data,
            lt_excel LIKE TABLE OF ls_excel.
      DATA: lo_sheet TYPE ole2_object,
            lo_range TYPE ole2_object,
            l_rc TYPE i.
      DATA: lt_check_msg TYPE TABLE OF ty_check_msg,
            ls_msg TYPE bapiret2.
      FIELD-SYMBOLS: <ls_check_msg> TYPE ty_check_msg.
    
      IF go_excel IS INITIAL OR go_excel-handle = -1.
        MESSAGE '没有活动的Excel应用程序(FORM:BI_WRITE_MESSAGES_TO_EXCEL出错)' TYPE 'E'.
      ENDIF.
    
      CHECK gt_check_msg IS NOT INITIAL.
    
      lt_check_msg = gt_check_msg.
      SORT lt_check_msg BY index DESCENDING.
      READ TABLE lt_check_msg INDEX 1 ASSIGNING <ls_check_msg>.
      l_maxindex = <ls_check_msg>-index.
    
      DO l_maxindex TIMES.
        CLEAR ls_excel-row.
        READ TABLE gt_check_msg ASSIGNING <ls_check_msg> WITH TABLE KEY INDEX = sy-index.
        IF sy-subrc <> 0.
          ls_excel-row = ''.
        ELSE.
          LOOP AT <ls_check_msg>-t_msg INTO ls_msg.
            IF ls_excel-row IS INITIAL.
              ls_excel-row = ls_msg-message.
            ELSE.
    *          ls_excel-row = ls_excel-row && '|' && ls_msg-message.
              CONCATENATE ls_excel-row '|' ls_msg-message INTO  ls_excel-row.
            ENDIF.
          ENDLOOP.
        ENDIF.
        APPEND ls_excel TO lt_excel.
      ENDDO.
    
      GET PROPERTY OF go_excel 'ActiveSheet' = lo_sheet.
    
      GET PROPERTY OF lo_sheet 'Range' = lo_range
      exporting
        #1 = i_top_left_addr.
    
      CALL METHOD OF
        lo_range
        'Select'.
    
      CALL METHOD cl_gui_frontend_services=>clipboard_export
        IMPORTING
          data = lt_excel
        CHANGING
          rc   = l_rc.
    
      SET PROPERTY OF go_excel 'DisplayAlerts' = 0.
      CALL METHOD OF
        lo_sheet
        'Paste'.
    
      SET PROPERTY OF go_excel 'CutCopyMode' = 0.
      CALL METHOD OF
        lo_range
        'Select'.
      SET PROPERTY OF go_excel 'Visible' = 1.
      SET PROPERTY OF go_excel 'DisplayAlerts' = 1.
    ENDFORM.                    "bi_write_messages_to_excel
    *&---------------------------------------------------------------------*
    *&      Form  bi_store_bdc_messsage
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bi_store_bdc_messsage.
      CALL FUNCTION 'MESSAGES_INITIALIZE'.
    
      LOOP AT gt_bdc_msg INTO gs_bdc_msg.
        CALL FUNCTION 'MESSAGE_STORE'
          EXPORTING
            arbgb = gs_bdc_msg-msgid
            msgty = gs_bdc_msg-msgtyp
            msgv1 = gs_bdc_msg-msgv1
            msgv2 = gs_bdc_msg-msgv2
            msgv3 = gs_bdc_msg-msgv3
            msgv4 = gs_bdc_msg-msgv4
            txtnr = gs_bdc_msg-msgnr
            zeile = sy-tabix.
      ENDLOOP.
    
    *  CALL FUNCTION 'MESSAGES_SHOW'.
    ENDFORM.                    "bi_store_bdc_messsage
    View Code
    *&---------------------------------------------------------------------*
    *& Report  ZARIBA_BATCH_XK01
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    
    REPORT  ztest.
    *&---------------------------------------------------------------------*
    *& 程序名称:  ZRMM0150
    *& 程序描述:  批量导入数据
    *&===============================*
    *&创建日期:   2020.10.19             程序员:
    *&===============================*
    *&修改日期    请求号   修改人   业务提交人    修改描述 *
    *&---------------------------------------------------------------------*
    
    
    INCLUDE z93_abap_batch_input_inc.
    
    TABLES: sscrfields.
    PARAMETERS: p_file TYPE string LOWER CASE.
    
    *PARAMETERS: p_typ TYPE ctu_mode  AS LISTBOX OBLIGATORY DEFAULT 'N' VISIBLE LENGTH 20.
    DATA: p_typ TYPE ctu_mode   VALUE 'N'  .
    
    SELECTION-SCREEN FUNCTION KEY 1.
    
    TYPES:BEGIN OF ty_data,
            lifnr    TYPE eina-lifnr,            "供应商
            matnr    TYPE mara-matnr,            "物料
            werks    TYPE ekpo-werks,            "工厂
            ekorg    TYPE eine-ekorg,            "采购组织
            kbetr    TYPE konp-kbetr,            "金额
            begda    TYPE pa0001-begda,          "开始日期
            endda    TYPE pa0001-endda,          "结束日期
            sep_flag TYPE char10,      "修改成功标志
            sel(1),
            msg      TYPE bapi_msg,
    
          END OF ty_data.
    
    DATA: gt_data TYPE TABLE OF ty_data,
          gs_data TYPE ty_data.
    DATA:gv_msg TYPE bapi_msg.
    DATA:gv_mtyp TYPE bapi_mtype.
    
    INITIALIZATION.
    
      sscrfields-functxt_01 = '@49@下载模板'.
      g_objid = 'ZRMM0150'.
    
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
      PERFORM bi_select_excel_file CHANGING p_file.
    
    AT SELECTION-SCREEN.
      CASE sscrfields-ucomm.
        WHEN 'FC01'.
          PERFORM bi_download_template USING g_objid 'XLS' '导入模板.xls'.
      ENDCASE.
    
    START-OF-SELECTION.
      PERFORM bi_upload_data_from_excel
      TABLES gt_data
      USING p_file  "文件名
            ''      "工作表名
            'A2'    "数据开始的单元格
            ' '     "忽略其中的换行字符
            'X'     "导入后,关闭Excel文件
            'X'.    "导入后,关闭Excel程序
      CASE sy-subrc.
        WHEN 1.
          MESSAGE '打开Excel应用程序失败' TYPE 'I' DISPLAY LIKE 'E'.
          LEAVE LIST-PROCESSING.
        WHEN 2.
          MESSAGE '打开Excel文件失败' TYPE 'I' DISPLAY LIKE 'E'.
          LEAVE LIST-PROCESSING.
      ENDCASE.
    
      "upload_data_from_excel时,自动获取Excel所使用的行列数并进行数据读取
      "如果用户为某些单元格设置了格式,而这些单元格并没有值,也会被读取进来
      "这时需要删除导入数据中的多余部分
      DELETE gt_data WHERE matnr IS INITIAL.
    
      PERFORM check_data.
    
      PERFORM bi_build_fieldcat USING:
            "字段   KEY  参照表  参照字段 货币字段 单位字段 编辑 转换例程 下划线 输出长度 不输出0 标题
    
            'SEP_FLAG' 'X'  ' '    ' '  '     '  '     ' ' '  '     '       ' '     4       ' '     '结果',
            'LIFNR' 'X'  'EINA'    'LIFNR'  '     '  '     ' ' '  '     '   ' '    10       ' '     '供应商',
            'MATNR' ' '  'MAKT'    'MATNR'  '     '  '     ' ' '  'MATN1'   ' '    18       ' '     '物料号',
            'EKORG' ' '  'EINE'    'EKORG'  '     '  '     ' ' '  ''        ' '    10       ' '     '采购组织',
            'WERKS' ' '  'EKPO'    'WERKS'  '     '  '     ' ' '  ''        ' '    10       ' '     '工厂',
            'KBETR' ' '  'KONP'    'KBETR'  '     '  '     ' ' '  ''        ' '    11       ' '     '金额',
            'BEGDA' ' '  'PA0001'  'BEGDA'  '     '  '     ' ' '  ''        ' '    10       ' '     '开始日期',
            'ENDDA' ' '  'PA0001'  'ENDDA'  '     '  '     ' ' '  ''        ' '    10       ' '     '结束日期',
            'MSG'   ' '  ''        'BAPI_MSG'  '     '  '     ' ' '  ''     ' '    88       ' '     '返回消息'.
      gs_layout-sel_mode = 'D'.
      gs_layout-box_fname = 'SEL'.
      PERFORM bi_display_data TABLES gt_data USING sy-repid 'PF_STATUS' 'USER_COMMAND'.
    
    *&---------------------------------------------------------------------*
    *&      Form  check_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM check_data.
      DATA: l_tabix TYPE i,
            ls_msg  TYPE bapiret2.
      DATA:lv_date TYPE dats.
      "不需要把报错消息回写到excel
    
      LOOP AT gt_data INTO gs_data.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = gs_data-matnr
          IMPORTING
            output       = gs_data-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
      
        gs_data-sep_flag = icon_yellow_light.
    
        CALL FUNCTION 'DATE_STRING_CONVERT'
          EXPORTING
            date_format = 'D'
            date_string = gs_data-mmstd_c
          IMPORTING
            result_date = lv_date.
    
        gs_data-mmstd_c = lv_date.
    
        MODIFY gt_data FROM gs_data. CLEAR gs_data.
      ENDLOOP..
    *  LOOP AT gt_data INTO gs_data.
    *    l_tabix = sy-tabix.
    *    CLEAR ls_msg.
    *    IF STRLEN( gs_data-maktx ) > 6.
    *      ls_msg-MESSAGE = '长度超长'.
    *      PERFORM bi_add_check_msg USING l_tabix ls_msg.
    *    ENDIF.
    *  ENDLOOP.
    *
    *  IF gt_check_msg IS NOT INITIAL.
    *    MESSAGE '数据检查过程中出错,错误信息将展示在导入文件的第一列' TYPE 'I' DISPLAY LIKE 'E'.
    *    PERFORM bi_write_messages_to_excel USING 'A2'.
    *    LEAVE LIST-PROCESSING.
    *  ELSE.
    *    PERFORM bi_close_workbook.
    *    PERFORM bi_quit_excel.
    *  ENDIF.
    ENDFORM.                    "check_data
    *&---------------------------------------------------------------------*
    *&      Form  pf_status
    *&---------------------------------------------------------------------*
    FORM pf_status USING pt_extab TYPE slis_t_extab.
      SET PF-STATUS 'STATUS_ALV' OF PROGRAM 'Z93_ABAP_BATCH_INPUT' EXCLUDING pt_extab.
    ENDFORM.                    "pf_status
    *&---------------------------------------------------------------------*
    *&      Form  user_command
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM user_command USING p_ucomm     LIKE sy-ucomm
          ps_selfield TYPE slis_selfield.
    
    
    
      DATA:l_percent          TYPE i,
           l_cur_percent      TYPE i,
           l_lines            TYPE i,
           l_cur_percent_char TYPE c LENGTH 20,
           t_msg              TYPE char80..
    
      l_lines = lines( gt_data ).
    
    
      CASE p_ucomm.
        WHEN 'IMPORT'.
    
          IF line_exists( gt_data[  sel = ' ' ] ).
            MESSAGE |请选中行| TYPE 'E' DISPLAY LIKE 'E'.
            RETURN.
          ENDIF.
    
          LOOP AT gt_data INTO gs_data.
    
            l_percent = sy-tabix / l_lines.
            IF l_cur_percent <> l_percent.
              l_cur_percent = l_percent.
    
              l_cur_percent_char = l_cur_percent.
              CONDENSE l_cur_percent_char.
              CONCATENATE '正在导入数据........' l_cur_percent_char  INTO t_msg .
              PERFORM show_process USING 100 t_msg.
            ENDIF.
    
    
            PERFORM import_data.
            IF gv_mtyp = 'E'.
              gs_data-sep_flag = icon_red_light.
            ELSE.
              gs_data-sep_flag = icon_green_light.
            ENDIF.
            gs_data-msg = gv_msg.
            MODIFY gt_data FROM gs_data.
          ENDLOOP.
    
      ENDCASE.
    
      ps_selfield-refresh = 'X'.
      ps_selfield-row_stable = 'X'.
      ps_selfield-col_stable = 'X'.
    ENDFORM.                    "user_command
    *&---------------------------------------------------------------------*
    *&      Form  import_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM import_data.
      DATA: lt_msg TYPE trty_bdcmsgcoll.
    
    
      PERFORM bi_gen_bdc_data USING:
            "程序     屏幕   屏幕启动 字段名        字段值
            'SAPMM06I'   '0100' 'X'      ''            '',
            '     '      '    ' ' '      'BDC_CURSOR'       'EINA-LIFNR',
            '     '      '    ' ' '      'BDC_OKCODE'       '/00',
            '     '      '    ' ' '      'EINA-LIFNR'      gs_data-lifnr,
            '     '      '    ' ' '      'EINA-MATNR'      gs_data-matnr,
            '     '      '    ' ' '      'EINE-EKORG'      gs_data-ekorg,
            '     '      '    ' ' '      'EINE-WERKS'      gs_data-werks,
            '     '      '    ' ' '      'RM06I-NORMB'      'X',
    
    
            'SAPMM06I'   '0101' 'X'      ''            '',
            '     '      '    ' ' '      'BDC_CURSOR'       'EINA-MAHN1',
            '     '      '    ' ' '      'BDC_OKCODE'       '=KO',
    
    
    
            'SAPLV14A'   '0102' 'X'      ''            '',
            '     '      '    ' ' '      'BDC_OKCODE'       '=NEWD',
    
    
            'SAPMV13A'   '0201' 'X'      ''            '',
            '     '      '    ' ' '      'BDC_CURSOR'       'KONP-KBETR(01)',
            '     '      '    ' ' '      'BDC_OKCODE'       '/00',
            '     '      '    ' ' '      'RV13A-DATAB'      gs_data-begda,
            '     '      '    ' ' '      'RV13A-DATBI'      gs_data-endda,
            '     '      '    ' ' '      'KONP-KBETR(01)'      gs_data-kbetr,
            '     '      '    ' ' '      'BDC_OKCODE'      '/00',
    *
            'SAPMV13A'   '0201' 'X'      ''            '',
            '     '      '    ' ' '      'BDC_CURSOR'       'KONP-KBETR(01)',
            '     '      '    ' ' '      'BDC_OKCODE'      '=SICH',
            '     '      '    ' ' '      'RV13A-DATAB'      gs_data-begda,
            '     '      '    ' ' '      'RV13A-DATBI'      gs_data-endda.
    
    *  gs_bdc_option-dismode = 'N'.
      gs_bdc_option-dismode = p_typ.
      gs_bdc_option-defsize = 'X'.
      gs_bdc_option-racommit = 'X'.
      PERFORM bi_call_bdc USING 'ME12'.
    
    
      CLEAR:gv_msg,gv_mtyp.
    
      LOOP AT gt_bdc_msg INTO gs_bdc_msg.
        gv_mtyp = gs_bdc_msg-msgtyp.
        MESSAGE ID gs_bdc_msg-msgid TYPE gs_bdc_msg-msgtyp NUMBER gs_bdc_msg-msgnr
        WITH gs_bdc_msg-msgv1 gs_bdc_msg-msgv2 gs_bdc_msg-msgv3 gs_bdc_msg-msgv4 INTO gv_msg..
      ENDLOOP.
    ENDFORM.                    "import_data
    *&---------------------------------------------------------------------*
    *&      Form  show_process
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->UPCT       text
    *      -->TEXT       text
    *----------------------------------------------------------------------*
    FORM show_process USING upct TYPE i
          text TYPE char80.
      DATA:i_text(40).
      DATA:lv_upct(1000).
      CLEAR:i_text,lv_upct.
      lv_upct = upct.
    
      CONDENSE lv_upct NO-GAPS.
      CONCATENATE lv_upct '%' text INTO i_text.
      cl_progress_indicator=>progress_indicate(
      EXPORTING
    *      i_text               = | { upct }% { text }  |
        i_text               = i_text
        i_processed          = upct
        i_total              = 100
        i_output_immediately = abap_true  ).
    
    
    *CONCATENATE lv_upct '%' TEXT INTO i_text.
    *cl_progress_indicator=>progress_indicate(
    *EXPORTING
    
    ENDFORM.                    "show_process
    View Code

    7、上传excel 数据(SM30版本)

    维护视图DEMO 添加 status 按钮
    *----------------------------------------------------------------------*
    ***INCLUDE LZTSD0008_SUBI01 .
    *----------------------------------------------------------------------*
    *&---------------------------------------------------------------------*
    *&      Module  Z_BATCH  INPUT
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    
    *----------------------------------------------------------------------*
    *  MODULE z_batch INPUT
    *----------------------------------------------------------------------*
    TYPE-POOLS:ole2.
    TYPES:BEGIN OF gt_excel,
      werks TYPE ztsd0008_sub-werks,
      zzcc TYPE ztsd0008_sub-zzcc,
      zzjc TYPE ztsd0008_sub-zzjc,
      zzrc TYPE ztsd0008_sub-zzrc,
      END OF gt_excel.
    DATA:gt_excel TYPE TABLE OF gt_excel.
    DATA:gs_excel LIKE LINE OF  gt_excel.
    
    DATA:gt_data TYPE TABLE OF ztsd0008_sub.
    DATA:gs_data LIKE LINE OF  gt_data.
    
    DATA: BEGIN OF ls_data,
      sel(01),
      update(01).
            INCLUDE STRUCTURE ztsd0008_sub.
    " I - 新增  U - 更新  D - 删除
    DATA:END OF ls_data.
    *----------------------------------------------------------------------*
    MODULE z_batch INPUT.
      DATA:p_file TYPE rlgrap-filename.
    
      FIELD-SYMBOLS: <l_werks> TYPE ANY ,<l_zzcc> TYPE ANY , <l_zzjc> TYPE ANY , <l_zzrc> TYPE ANY ,<l_action> TYPE ANY ..
    
      CASE  function.
        WHEN 'EXCEL'.
          PERFORM check_upd.
          IF <status>-upd_flag NE space.
            MESSAGE '请先保存数据后再执行此操作' TYPE 'S' DISPLAY LIKE 'E'.
            RETURN.
          ENDIF.
          PERFORM frm_import_excel.  "
          LOOP AT gt_data INTO gs_data.
            CLEAR:<vim_total_struc>.
            ASSIGN COMPONENT 'WERKS' OF STRUCTURE <vim_total_struc> TO <l_werks>.
            ASSIGN COMPONENT 'ZZCC' OF STRUCTURE <vim_total_struc> TO <l_zzcc>.
            ASSIGN COMPONENT 'ZZJC' OF STRUCTURE <vim_total_struc> TO <l_zzjc>.
            ASSIGN COMPONENT 'ZZRC' OF STRUCTURE <vim_total_struc> TO <l_zzrc>.
            IF <l_werks> IS ASSIGNED.
              <l_werks> = gs_data-werks.
            ENDIF.
    
            IF <l_zzcc> IS ASSIGNED.
              <l_zzcc> = gs_data-zzcc.
            ENDIF.
    
            IF <l_zzjc> IS ASSIGNED.
              <l_zzjc> = gs_data-zzjc.
            ENDIF.
            IF <l_zzrc> IS ASSIGNED.
              <l_zzrc> = gs_data-zzrc.
            ENDIF.
    
            APPEND <vim_total_struc> TO total.
            <action> = 'N'.
            MODIFY total INDEX sy-tabix  .
    
            MOVE-CORRESPONDING <vim_total_struc> TO <vim_extract_struc>.
            APPEND <vim_extract_struc> TO  extract .
            <xact> = 'N'.
    
            MODIFY extract INDEX sy-tabix  .
            CLEAR <vim_extract_struc>.
            CLEAR <vim_total_struc>.
            ADD 1 TO maxlines.
          ENDLOOP.
    
      ENDCASE.
    
    ENDMODULE.                 " Z_BATCH  INPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  frm_import_excel
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM frm_import_excel .
      DATA:p_path TYPE rlgrap-filename.
      DATA:lv_lines TYPE i.
      PERFORM frm_getpath USING p_path.
    
      IF p_path IS NOT INITIAL.
    
      ELSE.
        MESSAGE '请选择EXCEL文件' TYPE 'I'.
      ENDIF.
      "读取文件
      PERFORM upload_data USING 'A1'  '' p_path.  "数据开始的单元格,可根据实际情况更改
    
      LOOP AT gt_excel INTO gs_excel.
        CONDENSE gs_excel-werks NO-GAPS..
        CONDENSE gs_excel-zzcc NO-GAPS..
        CONDENSE gs_excel-zzjc NO-GAPS..
        CONDENSE gs_excel-zzrc NO-GAPS..
        MOVE-CORRESPONDING gs_excel TO  gs_data.
    
    
    
    *      g_matnr = ls_data-matnr.
    *      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    *        EXPORTING
    *          input  = g_matnr
    *        IMPORTING
    *          output = g_matnr.
    *
    *      SELECT SINGLE maktx INTO ls_data-makt
    *      FROM makt WHERE matnr = g_matnr
    *      AND spras = sy-langu.
    *
    *      ls_data-lauser = sy-uname.
    *      ls_data-ladate = sy-datum.
    *      ls_data-latime = sy-uzeit.
    *      ls_data-werks = gs_excel-werks.
    
        APPEND gs_data TO gt_data.CLEAR gs_data.
      ENDLOOP.
    ENDFORM.                    "frm_import_excel
    *&---------------------------------------------------------------------*
    *&      Form  upload_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_TOP_LEFT_ADDR      text
    *      -->P_BOTTOM_RIGHT_ADDR  text
    *      -->P_PATH               text
    *----------------------------------------------------------------------*
    FORM upload_data USING p_top_left_addr TYPE string
          p_bottom_right_addr TYPE string
          p_path TYPE rlgrap-filename.
    
    
    
      DATA: BEGIN OF lt_lines OCCURS 0,
        row(4096) TYPE c,
      END OF lt_lines,
      BEGIN OF lt_fields OCCURS 0,
        value(500) TYPE c,
      END OF lt_fields,
      lo_excel TYPE ole2_object,
      lo_books TYPE ole2_object,
      lo_book TYPE ole2_object,
      lo_sheet TYPE ole2_object,
      lo_usedrange TYPE ole2_object,
      lo_usedrows TYPE ole2_object,
      lo_usedcols TYPE ole2_object,
      lo_cell_bottom_right TYPE ole2_object,
      lo_range TYPE ole2_object,
      lo_cell_top_left TYPE ole2_object,
      l_toprow TYPE i,
      l_leftcol TYPE i,
      l_usedrows TYPE i,
      l_usedcols TYPE i,
      l_maxrow TYPE i,
      l_maxcol TYPE i,
      l_addr TYPE string,
      l_rowindex TYPE string,
      l_count TYPE string,
      l_msg TYPE string.
      FIELD-SYMBOLS <l_fieldvalue> TYPE ANY.
    
      "创建EXCEL程序
      CREATE OBJECT lo_excel 'EXCEL.APPLICATION'.
      IF sy-subrc <> 0.
        MESSAGE '创建EXCEL APPLICATION失败!' TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      "打开EXCEL文件
      DATA:p_file TYPE c LENGTH 1024 .
      TRANSLATE p_file TO LOWER CASE.
      p_file =  p_path .
      GET PROPERTY OF lo_excel 'WORKBOOKS' = lo_books.
      CALL METHOD OF lo_books 'OPEN' = lo_book
        EXPORTING
        #1 = p_file.
      IF sy-subrc <> 0.
        MESSAGE '打开EXCEL文件失败!' TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      "取最大行和最大列
      GET PROPERTY OF lo_excel 'ACTIVESHEET' = lo_sheet.
      GET PROPERTY OF lo_sheet 'USEDRANGE' = lo_usedrange.
      GET PROPERTY OF lo_usedrange 'ROW' = l_toprow.
      GET PROPERTY OF lo_usedrange 'COLUMN' = l_leftcol.
      GET PROPERTY OF lo_usedrange 'ROWS' = lo_usedrows.
      GET PROPERTY OF lo_usedrows 'COUNT' = l_usedrows.
      GET PROPERTY OF lo_usedrange 'COLUMNS' = lo_usedcols.
      GET PROPERTY OF lo_usedcols 'COUNT' = l_usedcols.
      l_maxrow = l_toprow + l_usedrows - 1.
      l_maxcol = l_leftcol + l_usedcols - 1.
    
      "确定数据范围
      IF p_bottom_right_addr IS INITIAL.
        GET PROPERTY OF lo_sheet 'CELLS' = lo_cell_bottom_right
        exporting
          #1       = l_maxrow
          #2       = l_maxcol.
        GET PROPERTY OF lo_sheet 'RANGE' = lo_range
        exporting
          #1       = p_top_left_addr
          #2       = lo_cell_bottom_right.
      ELSE.
        GET PROPERTY OF lo_sheet 'RANGE' = lo_range
        exporting
          #1       = p_top_left_addr
          #2       = p_bottom_right_addr.
      ENDIF.
    
      "检查是否存在数据
      GET PROPERTY OF lo_range 'ROW' = l_toprow.
      GET PROPERTY OF lo_range 'COLUMN' = l_leftcol.
      GET PROPERTY OF lo_sheet 'CELLS' = lo_cell_top_left
      exporting
        #1       = l_toprow
        #2       = l_leftcol.
      GET PROPERTY OF lo_cell_top_left 'ADDRESS' = l_addr
      exporting
        #1 = 0
        #2 = 0.
      IF l_addr <> p_top_left_addr. "无数据
        CALL METHOD OF lo_book 'CLOSE'.
        CALL METHOD OF lo_excel 'QUIT'.
        MESSAGE '文件中无有效数据!' TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      "替换CHR(13)+CHR(10) WITH CHR(10) 【CHR(13)属于EXCEL单元格内容中的非正常输入字符,必会导致ABAP内表数据串行】
      SET PROPERTY OF lo_excel 'DISPLAYALERTS' = 0.
      CALL METHOD OF lo_range 'REPLACE'
      EXPORTING
        #1        = cl_abap_char_utilities=>cr_lf             "000D000A CHR(13) + CHR(10)
        #2        = cl_abap_char_utilities=>newline.          "000A CHR(10)
    
      "复制数据
      CALL METHOD OF lo_range 'COPY'.
      CALL METHOD cl_gui_frontend_services=>clipboard_import
        IMPORTING
          data   = lt_lines[]
        EXCEPTIONS
          OTHERS = 1.
    
      "关闭EXCEL
      CALL METHOD OF lo_book 'CLOSE'.
      CALL METHOD OF lo_excel 'QUIT'.
    
      "拆分数据
      LOOP AT lt_lines.
        l_rowindex = sy-tabix + l_toprow - 1.
        SPLIT lt_lines-row AT cl_abap_char_utilities=>horizontal_tab INTO TABLE lt_fields.
        LOOP AT lt_fields.
          l_count = sy-tabix.
          ASSIGN COMPONENT sy-tabix OF STRUCTURE gs_excel TO <l_fieldvalue>.
          CHECK sy-subrc = 0.
          CATCH SYSTEM-EXCEPTIONS convt_no_number = 1 OTHERS = 2.
            <l_fieldvalue> = lt_fields-value.
          ENDCATCH.
          IF sy-subrc <> 0.
    *        CONCATENATE '第' L_ROWINDEX '行中第' L_COUNT '个字段的值' GS_FIELDCAT-FIELDNAME '在格式转换时出错,请检查!' INTO L_MSG.
            MESSAGE l_msg TYPE 'S' DISPLAY LIKE 'E'.
            LEAVE LIST-PROCESSING.
          ENDIF.
          UNASSIGN <l_fieldvalue>.
        ENDLOOP.
    
        APPEND gs_excel TO gt_excel.
        CLEAR gs_excel.
      ENDLOOP.
    ENDFORM.                    " UPLOAD_DATA
    *&---------------------------------------------------------------------*
    *&      Form  frm_getpath
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_PATH     text
    *----------------------------------------------------------------------*
    FORM frm_getpath  USING    p_path.
      DATA: tmp_mask LIKE rlgrap-filename.
      CLEAR tmp_mask.
      tmp_mask = p_path.
      CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
      EXPORTING
        mask         = tmp_mask
        static       = 'X'
      CHANGING
        file_name    = p_path
      EXCEPTIONS
        mask_too_long.
    ENDFORM.                    " FRM_GETPATH
    View Code

    8、配置表管理

     *&---------------------------------------------------------------------*
    *& Include ZABAP_TABLE_MAINTENANCE
    *& 创建人          请求号         子程序描述
    *&---------------------------------------------------------------------*
    
    DATA: gt_exclude       TYPE TABLE OF sy-ucomm,
          gt_sel_condition TYPE TABLE OF vimsellist WITH HEADER LINE.
    DATA: BEGIN OF gs_ucomm_view,
            ucomm    TYPE sy-ucomm,
            tcode    TYPE sy-tcode,
            viewname TYPE dd02v-tabname,
          END OF gs_ucomm_view,
          gt_ucomm_view LIKE TABLE OF gs_ucomm_view.
    
    DEFINE macro_add_button.
      macro_add_button&1 &2.
    END-OF-DEFINITION.
    
    DEFINE macro_add_button1.
      SELECTION-SCREEN SKIP 1.
      SELECTION-SCREEN PUSHBUTTON /1(20) &1 USER-COMMAND &1.
    END-OF-DEFINITION.
    
    DEFINE macro_add_button2.
      SELECTION-SCREEN PUSHBUTTON 25(20) &1 USER-COMMAND &1.
    END-OF-DEFINITION.
    
    DEFINE macro_add_button3.
      SELECTION-SCREEN PUSHBUTTON 49(20) &1 USER-COMMAND &1.
    END-OF-DEFINITION.
    
    DEFINE macro_add_button4.
      SELECTION-SCREEN PUSHBUTTON 73(20) &1 USER-COMMAND &1.
    END-OF-DEFINITION.
    
    DEFINE macro_set_ucomm_view.
      CLEAR gs_ucomm_view.
      gs_ucomm_view-ucomm = '&1'.
      gs_ucomm_view-tcode = &2.
      gs_ucomm_view-viewname = &3.
      &1 = &4.
      APPEND gs_ucomm_view TO gt_ucomm_view.
    END-OF-DEFINITION.
    
    FORM pbo_1000 USING p_exclude TYPE c.    "如果不需要屏蔽执行和保存变式的按钮,则P_EXCLUDE设置为空
      CLEAR gt_exclude.
    
      IF p_exclude = 'X'.
        APPEND 'ONLI' TO gt_exclude.
        APPEND 'SPOS' TO gt_exclude.
      ENDIF.
    
      CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
        EXPORTING
          p_status  = sy-pfkey
          p_program = sy-cprog
        TABLES
          p_exclude = gt_exclude.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      FORM  CALL_SM30
    *&---------------------------------------------------------------------*
    FORM call_sm30 USING p_tablename TYPE dd02v-tabname.
      DATA: l_action TYPE c VALUE 'U'.
    
      IF gt_sel_condition[] IS INITIAL.
        CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
          EXPORTING
            action    = l_action
            view_name = p_tablename.
      ELSE.
        CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
          EXPORTING
            action      = l_action
            view_name   = p_tablename
          TABLES
            dba_sellist = gt_sel_condition[].
      ENDIF.
    ENDFORM.                                                    "CALL_SM30
    *&---------------------------------------------------------------------*
    *&      Form  call_sm34
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM call_sm34 USING p_clustername TYPE vcldir-vclname.
      CALL FUNCTION 'VIEWCLUSTER_MAINTENANCE_CALL'
        EXPORTING
          maintenance_action = 'U'
          viewcluster_name   = p_clustername.
    ENDFORM.
    View Code
    *&---------------------------------------------------------------------*
    *& 程序名称:  ZFIR_CONFIG
    *& 程序描述:  财务自定义配置项
    *&===============================*
    *&创建日期:   2021.01.12             程序员:孙亮
    *&===============================*
    *&修改日期    请求号   修改人   业务提交人    修改描述 *
    *&---------------------------------------------------------------------*
    REPORT  zfir_config.
    
    INCLUDE zabap_table_maintenance.
    
    TABLES: sscrfields.
    
    macro_add_button 1 pzlsh.   "会计凭证流水号:按利润中心分别编码的公司代码
    macro_add_button 1 shuilv.  "配置税率
    macro_add_button 1 shuixg.  "配置税项
    
    INITIALIZATION.
      sscrfields-functxt_01 = '增强有效性配置'.
      macro_set_ucomm_view:
    *   按钮    SM30/SM34  视图名               按钮名称
        pzlsh   'SM30'     'ZFI93T_176_BUKRS'  '会计凭证流水号编码规则',
        shuilv  'SM30'     'ZFI_ZZFI001'       '配置税率ZFI_ZZFI001',
        shuixg  'SM30'     'ZFI_ZZFI002'       '配置税率ZFI_ZZFI002'.
    
    AT SELECTION-SCREEN OUTPUT.
      PERFORM pbo_1000 USING 'X'.
    
    AT SELECTION-SCREEN.
      CLEAR gs_ucomm_view.
      READ TABLE gt_ucomm_view INTO gs_ucomm_view WITH KEY ucomm = sscrfields-ucomm.
      IF gs_ucomm_view-tcode = 'SM30'.
        PERFORM call_sm30 USING gs_ucomm_view-viewname.
      ELSEIF gs_ucomm_view-tcode = 'SM34'.
        PERFORM call_sm34 USING gs_ucomm_view-viewname.
      ENDIF.
      CLEAR sscrfields-ucomm.
    View Code

    9、公共子例程

    *&---------------------------------------------------------------------*
    *&  Include           ZCOM_01
    *&---------------------------------------------------------------------*
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_ADD_ZERO
    *&---------------------------------------------------------------------*
    *      补充前导0
    *---------------------------------------------------------------------*
    *     <--PV_IN
    *     -->PV_OUT
    *---------------------------------------------------------------------*
    FORM FRM_ADD_ZERO USING PV_IN
                   CHANGING PV_OUT.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = PV_IN
        IMPORTING
          OUTPUT = PV_OUT.
    ENDFORM.                   " FRM_ADD_ZERO
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_DELE_ZERO
    *&---------------------------------------------------------------------*
    *      删除前导0
    *---------------------------------------------------------------------*
    *     <--PV_IN
    *     -->PV_OUT
    *---------------------------------------------------------------------*
    FORM FRM_DELE_ZERO USING PV_IN
                    CHANGING PV_OUT.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
        EXPORTING
          INPUT  = PV_IN
        IMPORTING
          OUTPUT = PV_OUT.
    ENDFORM.                   " DELE_ZERO
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CONVERT_MATNR_INPUT
    *&---------------------------------------------------------------------*
    *      物料编码字段加前导0
    *---------------------------------------------------------------------*
    *     <--PV_IN
    *     -->PV_OUT
    *---------------------------------------------------------------------*
    FORM FRM_CONVERT_MATNR_INPUT USING PV_IN
                              CHANGING PV_OUT.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT        = PV_IN
        IMPORTING
          OUTPUT       = PV_OUT
        EXCEPTIONS
          LENGTH_ERROR = 1
          OTHERS       = 2.
    ENDFORM.                   " FRM_CONVERT_MATNR_INPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CONVERT_MATNR_OUTPUT
    *&---------------------------------------------------------------------*
    *      物料编码字段去前导0
    *---------------------------------------------------------------------*
    *     <--PV_IN
    *     -->PV_OUT
    *---------------------------------------------------------------------*
    FORM FRM_CONVERT_MATNR_OUTPUT USING PV_IN
                               CHANGING PV_OUT.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
        EXPORTING
          INPUT        = PV_IN
        IMPORTING
          OUTPUT       = PV_OUT
        EXCEPTIONS
          LENGTH_ERROR = 1
          OTHERS       = 2.
    ENDFORM.                   " FRM_CONVERT_MATNR_OUTPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CONVERT_UNIT_INPUT
    *&---------------------------------------------------------------------*
    *      外部单位转到内部单位
    *---------------------------------------------------------------------*
    *     <--PV_IN
    *     -->PV_OUT
    *---------------------------------------------------------------------*
    FORM FRM_CONVERT_UNIT_INPUT USING PV_IN
                             CHANGING PV_OUT.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          INPUT          = PV_IN
          LANGUAGE       = SY-LANGU
        IMPORTING
          OUTPUT         = PV_OUT
        EXCEPTIONS
          UNIT_NOT_FOUND = 1
          OTHERS         = 2.
    ENDFORM.                   " FRM_CONVERT_UNIT_INPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CONVERT_UNIT_OUTPUT
    *&---------------------------------------------------------------------*
    *      内部单位转到外部单位
    *--------------------------------------------------------------------*
    *     <--PV_IN
    *     -->PV_OUT
    *---------------------------------------------------------------------*
    FORM FRM_CONVERT_UNIT_OUTPUT USING PV_IN
                              CHANGING PV_OUT.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          INPUT          = PV_IN
          LANGUAGE       = SY-LANGU
        IMPORTING
          OUTPUT         = PV_OUT
        EXCEPTIONS
          UNIT_NOT_FOUND = 1
          OTHERS         = 2.
    ENDFORM.                   " FRM_CONVERT_UNIT_OUTPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_CONV_FACTOR
    *&---------------------------------------------------------------------*
    *       获取货币转换因子
    *----------------------------------------------------------------------*
    *      -->PV_CURRENCY  text
    *      <--PV_FACTOR  text
    *----------------------------------------------------------------------*
    FORM FRM_GET_CONV_FACTOR USING PV_CURRENCY
                          CHANGING PV_FACTOR.
      CLEAR: PV_FACTOR.
    
      CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
        EXPORTING
          CURRENCY          = PV_CURRENCY
        IMPORTING
          FACTOR            = PV_FACTOR
        EXCEPTIONS
          TOO_MANY_DECIMALS = 1
          OTHERS            = 2.
      IF SY-SUBRC <> 0.
        PV_FACTOR = 1.
      ENDIF.
    ENDFORM.                    " FRM_GET_CONV_FACTOR
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CURRENCY_CONV_TO_EXTERNAL
    *&---------------------------------------------------------------------*
    *       内部金额转换成外部金额
    *----------------------------------------------------------------------*
    *      -->PV_I_AMOUNT    text
    *      -->PV_CURR        text
    *      -->PV_MAX_NUMBER  text
    *      -->PV_E_AMOUNT    text
    *----------------------------------------------------------------------*
    FORM FRM_CURRENCY_CONV_TO_EXTERNAL USING PV_I_AMOUNT
                                             PV_CURR
                                    CHANGING PV_E_AMOUNT.
      DATA: LV_I_BAPICURR TYPE BAPICURR-BAPICURR,
            LV_E_BAPICURR TYPE BAPICURR-BAPICURR.
    
      LV_I_BAPICURR = PV_I_AMOUNT.
    
      CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
        EXPORTING
          CURRENCY        = PV_CURR
          AMOUNT_INTERNAL = LV_I_BAPICURR
        IMPORTING
          AMOUNT_EXTERNAL = LV_E_BAPICURR.
    
      PV_E_AMOUNT = LV_E_BAPICURR.
    ENDFORM.                    "FRM_CURRENCY_CONV_TO_EXTERNAL
    
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_EXCHANGE_RATE
    *&---------------------------------------------------------------------*
    *& 外部金额转换成内部金额
    *&---------------------------------------------------------------------*
    *      -->PV_E_AMOUNT    text
    *      -->PV_CURR        text
    *      -->PV_MAX_NUMBER  text
    *      -->PV_I_AMOUNT    text
    *---------------------------------------------------------------------*
    FORM FRM_CURRENCY_CONV_TO_INTERNAL USING PV_E_AMOUNT
                                             PV_CURR
                                             PV_MAX_NUMBER
                                    CHANGING PV_I_AMOUNT.
      DATA: LV_I_BAPICURR TYPE BAPICURR-BAPICURR,
            LV_E_BAPICURR TYPE BAPICURR-BAPICURR.
    
      LV_E_BAPICURR = PV_E_AMOUNT.
    
      CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL'
        EXPORTING
          CURRENCY             = PV_CURR
          AMOUNT_EXTERNAL      = LV_E_BAPICURR
          MAX_NUMBER_OF_DIGITS = PV_MAX_NUMBER
        IMPORTING
          AMOUNT_INTERNAL      = LV_I_BAPICURR.
    
      PV_I_AMOUNT = LV_I_BAPICURR.
    ENDFORM.                    "FRM_CURRENCY_CONV_TO_INTERNAL
    
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_EXCHANGE_RATE_01
    *&---------------------------------------------------------------------*
    * 获取汇率
    *---------------------------------------------------------------------*
    *      --> PV_F_CURR
    *      --> PV_L_CURR
    *      --> PV_DATE
    *      <-- PV_UKURS
    *---------------------------------------------------------------------*
    FORM FRM_GET_EXCHANGE_RATE_01 USING PV_F_CURR
                                        PV_L_CURR
                                        PV_DATE
                               CHANGING PV_UKURS.
      TYPES: BEGIN OF LTY_TCURR.
              INCLUDE STRUCTURE TCURR.
      TYPES: DATE TYPE D.
      TYPES: END OF LTY_TCURR.
    
      TYPES: BEGIN OF LTY_TCURF.
              INCLUDE STRUCTURE TCURF.
      TYPES: DATE TYPE D.
      TYPES: END OF LTY_TCURF.
    
      DATA: LT_TCURR TYPE STANDARD TABLE OF LTY_TCURR,
            LT_TCURF TYPE STANDARD TABLE OF LTY_TCURF.
    
      DATA: LS_TCURR TYPE LTY_TCURR,
            LS_TCURF TYPE LTY_TCURF.
    
      DATA: LV_FFACT TYPE TCURF-FFACT,
            LV_TFACT TYPE TCURF-TFACT,
            LV_GDATU TYPE GDATU_INVV.
    
    
      CLEAR: PV_UKURS.
      LV_GDATU = '99999999' - PV_DATE.
    
      SELECT * INTO TABLE LT_TCURR FROM TCURR WHERE KURST = 'M' AND
                                                    FCURR = PV_F_CURR AND
                                                    TCURR = PV_L_CURR AND
                                                    GDATU GE LV_GDATU.
      SORT LT_TCURR BY GDATU.
      READ TABLE LT_TCURR INTO LS_TCURR INDEX 1.
      IF SY-SUBRC = 0.
        IF LS_TCURR-UKURS > 0.
          SELECT * INTO TABLE LT_TCURF FROM TCURF WHERE KURST EQ 'M' AND
                                                        FCURR EQ PV_F_CURR AND
                                                        TCURR EQ PV_L_CURR AND
                                                        GDATU GE LV_GDATU.
          SORT LT_TCURF BY GDATU.
          READ TABLE LT_TCURF INTO LS_TCURF INDEX 1.
          IF SY-SUBRC = 0.
            PV_UKURS = LS_TCURR-UKURS * LS_TCURF-TFACT / LS_TCURF-FFACT.    "除以外币转换因子 得到真实汇率
          ENDIF.
    
        ELSEIF LS_TCURR-UKURS < 0.
          SELECT * INTO TABLE LT_TCURF FROM TCURF WHERE KURST EQ 'M' AND
                                                        FCURR EQ PV_L_CURR AND
                                                        TCURR EQ PV_F_CURR AND
                                                        GDATU GE LV_GDATU.
          SORT LT_TCURF BY GDATU.
          READ TABLE LT_TCURF INTO LS_TCURF INDEX 1.
          IF SY-SUBRC = 0.
            LS_TCURR-UKURS = 1 / LS_TCURR-UKURS * -1 / LS_TCURF-FFACT.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDFORM.                    "FRM_GET_EXCHANGE_RATE_01
    
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_EXCHANGE_RATE_02
    *&---------------------------------------------------------------------*
    * 获取汇率。该方法只能获取直接报价的汇率,不能获取节间报价的汇率
    *---------------------------------------------------------------------*
    *      --> PV_F_CURR
    *      --> PV_L_CURR
    *      --> PV_DATE
    *      <-- PV_UKURS
    *---------------------------------------------------------------------*
    FORM FRM_GET_EXCHANGE_RATE_02 USING PV_F_CURR
                                        PV_L_CURR
                                        PV_DATE
                               CHANGING PV_RATE.
      DATA: LS_EXCH_RATE TYPE BAPI1093_0,
            LS_RETURN TYPE BAPIRET1.
    
    
      CLEAR: PV_RATE.
    
      CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
        EXPORTING
          DATE       = PV_DATE
          TO_CURRNCY = PV_L_CURR
          FROM_CURR  = PV_F_CURR
          RATE_TYPE  = 'M'
        IMPORTING
          EXCH_RATE  = LS_EXCH_RATE
          RETURN     = LS_RETURN
        EXCEPTIONS
          OTHERS     = 01.
    
      IF LS_RETURN-TYPE = 'S'.
        IF LS_EXCH_RATE-EXCH_RATE < 1.
          LS_EXCH_RATE-EXCH_RATE = 1 / LS_EXCH_RATE-EXCH_RATE * -1.
        ENDIF.
    
        PV_RATE = LS_EXCH_RATE-EXCH_RATE / LS_EXCH_RATE-FROM_FACTOR.    "除以外币转换因子 得到真实汇率
      ENDIF.
    ENDFORM.                    "FRM_GET_EXCHANGE_RATE_02
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_EXCHANGE_RATE_03
    *&---------------------------------------------------------------------*
    *       获取汇率。该方法即可获取直接报价的汇率,也可获取节间报价的汇率
    *----------------------------------------------------------------------*
    *      --> PV_DATE
    *      --> PV_F_CURR
    *      --> PV_L_CURR
    *      --> PV_KURST
    *      <-- PV_UKURS
    *----------------------------------------------------------------------*
    FORM FRM_GET_EXCHANGE_RATE_03 USING PV_DATE
                                        PV_F_CURR
                                        PV_L_CURR
                                        PV_KURST
                               CHANGING PV_RATE.
      DATA: LV_FFACT TYPE TCURR-FFACT,
            LV_TFACT TYPE TCURR-TFACT,
            LV_KURST TYPE TCURR.
    
    
      IF PV_KURST = ''.
        LV_KURST = 'M'.
      ENDIF.
    
      CALL FUNCTION 'READ_EXCHANGE_RATE'
        EXPORTING
          CLIENT                 = SY-MANDT
          DATE                   = PV_DATE
          FOREIGN_CURRENCY       = PV_F_CURR
          LOCAL_CURRENCY         = PV_L_CURR
          TYPE_OF_RATE           = 'M'
    *      EXACT_DATE              = ' '
       IMPORTING
         EXCHANGE_RATE           = PV_RATE
         FOREIGN_FACTOR          = LV_FFACT
         LOCAL_FACTOR            = LV_TFACT
    *     VALID_FROM_DATE         =
    *     DERIVED_RATE_TYPE       =
    *     FIXED_RATE              =
    *     OLDEST_RATE_FROM        =
       EXCEPTIONS
         NO_RATE_FOUND           = 1
         NO_FACTORS_FOUND        = 2
         NO_SPREAD_FOUND         = 3
         DERIVED_2_TIMES         = 4
         OVERFLOW                = 5
         ZERO_RATE               = 6
         OTHERS                  = 7.
    
      IF PV_RATE > 0.
        PV_RATE = PV_RATE * LV_FFACT / LV_TFACT.
      ELSEIF PV_RATE < 0.
        PV_RATE = 1 / PV_RATE * -1 / LV_FFACT.
      ENDIF.
    ENDFORM.                    " FRM_GET_EXCHANGE_RATE_03
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_FACTOR
    *&---------------------------------------------------------------------*
    *       获取汇率转换因子
    *----------------------------------------------------------------------*
    *      --> PV_F_CURR    text
    *      --> PV_L_CURR    text
    *      --> PV_DATE      text
    *      --> PV_RATE      text
    *      <-- PV_F_FACTOR  text
    *      <-- PV_L_FACTOR  text
    *----------------------------------------------------------------------*
    FORM FRM_GET_FACTOR USING PV_F_CURR
                              PV_L_CURR
                              PV_DATE
                              PV_RATE
                     CHANGING PV_F_FACTOR
                              PV_L_FACTOR.
      CALL FUNCTION 'KURS_IN_PREISNOTATION'
        EXPORTING
          CLIENT           = SY-MANDT
          DATE             = PV_DATE
          TYPE_OF_RATE     = 'M'
          FOREIGN_CURRENCY = PV_F_CURR
          LOCAL_CURRENCY   = PV_L_CURR
          RATE             = PV_RATE
        IMPORTING
          FOREIGN_FACTOR   = PV_F_FACTOR
          LOCAL_FACTOR     = PV_L_FACTOR
        EXCEPTIONS
          NO_FACTORS_FOUND = 1
          DERIVED_2_TIMES  = 2
          NO_SPREAD_FOUND  = 3
          OVERFLOW         = 4
          OTHERS           = 5.
    ENDFORM.                    " FRM_GET_FACTOR
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CURRENCY_EXCHANGE_01
    *&---------------------------------------------------------------------*
    *       汇率换算
    *----------------------------------------------------------------------*
    *      --> PV_L_AMOUNT  text
    *      --> PV_L_CURR    text
    *      --> PV_DATE      text
    *      --> PV_F_CURR    text
    *      <-- PV_F_AMOUNT  text
    *----------------------------------------------------------------------*
    FORM FRM_CURRENCY_EXCHANGE_01 USING PV_L_AMOUNT
                                        PV_L_CURR
                                        PV_DATE
                                        PV_F_CURR
                               CHANGING PV_F_AMOUNT.
      DATA: LS_TCURR TYPE TCURR.
      DATA: LV_WERTV10 TYPE WERTV10.
    
    
      CLEAR: PV_F_AMOUNT.
    
      CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
        EXPORTING
          CLIENT           = SY-MANDT
          DATE             = PV_DATE
          FOREIGN_CURRENCY = PV_F_CURR
          LOCAL_AMOUNT     = PV_L_AMOUNT
          LOCAL_CURRENCY   = PV_L_CURR
          TYPE_OF_RATE     = 'M'
          READ_TCURR       = 'X'
        IMPORTING
          EXCHANGE_RATE    = LS_TCURR-UKURS
          FOREIGN_FACTOR   = LS_TCURR-FFACT
          FOREIGN_AMOUNT   = LV_WERTV10
          LOCAL_FACTOR     = LS_TCURR-TFACT
        EXCEPTIONS
          NO_RATE_FOUND    = 1
          OVERFLOW         = 2
          NO_FACTORS_FOUND = 3
          NO_SPREAD_FOUND  = 4
          DERIVED_2_TIMES  = 5
          OTHERS           = 6.
    
      PV_F_AMOUNT = LV_WERTV10.
    ENDFORM.                    " FRM_CURRENCY_EXCHANGE_01
    
    *&---------------------------------------------------------------------*
    *&      Form FRM_CURRENCY_EXCHANGE_02
    *&---------------------------------------------------------------------*
    *       汇率换算
    *----------------------------------------------------------------------*
    *      --> PV_F_AMOUNT  text
    *      --> PV_TCURR     text
    *      --> PV_DATE      text
    *      --> PV_FCURR     text
    *      --> PV_T_AMOUNT  text
    *----------------------------------------------------------------------*
    FORM FRM_CURRENCY_EXCHANGE_02 USING PV_F_AMOUNT
                                        PV_FCURR
                                        PV_DATE
                                        PV_TCURR
                               CHANGING PV_L_AMOUNT.
      DATA: LS_TCURR TYPE TCURR.
      DATA: LV_WERTV10 TYPE WERTV10.
    
      CLEAR: PV_L_AMOUNT.
    
      CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
        EXPORTING
          CLIENT           = SY-MANDT
          DATE             = PV_DATE
          FOREIGN_AMOUNT   = PV_F_AMOUNT
          FOREIGN_CURRENCY = PV_FCURR
          LOCAL_CURRENCY   = PV_TCURR
          TYPE_OF_RATE     = 'M'
          READ_TCURR       = 'X'
        IMPORTING
          EXCHANGE_RATE    = LS_TCURR-UKURS
          FOREIGN_FACTOR   = LS_TCURR-FFACT
          LOCAL_AMOUNT     = LV_WERTV10
          LOCAL_FACTOR     = LS_TCURR-TFACT
        EXCEPTIONS
          NO_RATE_FOUND    = 1
          OVERFLOW         = 2
          NO_FACTORS_FOUND = 3
          NO_SPREAD_FOUND  = 4
          DERIVED_2_TIMES  = 5
          OTHERS           = 6.
    
      PV_L_AMOUNT = LV_WERTV10.
    ENDFORM.                    "FRM_CURRENCY_EXCHANGE_02
    
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_DOMAIN
    *&---------------------------------------------------------------------*
    * 根据域名获取该域名的全部数据
    *----------------------------------------------------------------------*
    *      --> PT_DD07V
    *      --> PV_NAME
    *      --> PV_LANGU
    *----------------------------------------------------------------------*
    FORM FRM_GET_DOMAIN TABLES PT_DD07V STRUCTURE DD07V
                         USING PV_DOMNAME
                               PV_LANGU.
      DATA: LV_RETURN TYPE SY-SUBRC.
    
      CALL FUNCTION 'DD_DOMVALUES_GET'
        EXPORTING
          DOMNAME        = PV_DOMNAME     "域名
          TEXT           = 'X'
          LANGU          = PV_LANGU
        IMPORTING
          RC             = LV_RETURN
        TABLES
          DD07V_TAB      = PT_DD07V
        EXCEPTIONS
          WRONG_TEXTFLAG = 1
          OTHERS         = 2.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
    ENDFORM.                    "FRM_GET_DOMAIN
    
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_DOMAIN_2
    *&---------------------------------------------------------------------*
    * 根据域名获取该域名的全部数据,优先用系统语言,如果获取不到,则任意取某个语言的
    *----------------------------------------------------------------------*
    *      --> PT_DD07T
    *      --> PV_DOMNAME
    *----------------------------------------------------------------------*
    FORM FRM_GET_DOMAIN_2 TABLES PT_DD07T STRUCTURE DD07T
                           USING PV_DOMNAME.
      DATA: LT_DD07L LIKE TABLE OF DD07L WITH HEADER LINE,
            LT_DD07T LIKE TABLE OF DD07T WITH HEADER LINE.
    
    
      FREE: PT_DD07T.
      CLEAR: PT_DD07T.
      SELECT * INTO TABLE LT_DD07L FROM DD07L WHERE DOMNAME = PV_DOMNAME AND AS4LOCAL = 'A'.
      SELECT * INTO TABLE LT_DD07T FROM DD07T WHERE DOMNAME = PV_DOMNAME AND AS4LOCAL = 'A'.
    
      READ TABLE LT_DD07T WITH KEY DDLANGUAGE = SY-LANGU.
      IF SY-SUBRC = 0.
        PT_DD07T[] = LT_DD07T[].
        DELETE LT_DD07T WHERE DDLANGUAGE NE SY-LANGU.
    
      ELSE.
        LOOP AT LT_DD07L.
          MOVE-CORRESPONDING LT_DD07L TO PT_DD07T.
          PT_DD07T-DDTEXT = LT_DD07L-DOMVALUE_L.
          APPEND PT_DD07T.
        ENDLOOP.
      ENDIF.
    
      SORT PT_DD07T BY DOMVALUE_L.
    ENDFORM.                    "FRM_GET_DOMAIN_2
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CONVERT_MONEY_TO_CHINA
    *&---------------------------------------------------------------------*
    * 将金额转换为汉字金额写法
    *----------------------------------------------------------------------*
    *      --> PV_VAL
    *      <-- PV_DXSTR
    *----------------------------------------------------------------------*
    FORM FRM_CONVERT_MONEY_TO_CHINA USING PV_VAL
                                 CHANGING PV_DXSTR.
      DATA: LV_ZS     TYPE C LENGTH 20,
            LV_XS     TYPE C LENGTH 20,
            LV_STR    TYPE C LENGTH 30,
            LV_LEN    TYPE I VALUE 0,
            LV_CIS    TYPE I VALUE 0,
            LV_LIS    TYPE I VALUE 0,
            LV_SS     TYPE C LENGTH 2,
            LV_RR     TYPE C LENGTH 1,
            LV_STRR   TYPE C LENGTH 30,
            LV_CHANGE TYPE C LENGTH 30 VALUE '1壹2贰3叁4肆5伍6陆7柒8捌9玖0零',
            LV_VAL    TYPE P DECIMALS 2.
    
    
      LV_VAL = PV_VAL.
      CLEAR PV_DXSTR.
      MOVE LV_VAL TO LV_STR.
      SHIFT LV_STR LEFT DELETING LEADING SPACE.
      SPLIT LV_STR AT '.' INTO LV_ZS LV_XS."把金额拆分成整数和小数
    
      "把金额字段反过来比如123变成321
      LV_LEN = STRLEN( LV_ZS )."整数长度
      CLEAR LV_STRR.
      LV_CIS = LV_LEN - 1.
      DO LV_LEN TIMES.
        MOVE LV_ZS+LV_CIS(1) TO LV_RR.
        CONCATENATE LV_STRR LV_RR INTO LV_STRR.
        LV_CIS = LV_CIS - 1.
      ENDDO.
    
    
      LV_CIS = 0.
      DO LV_LEN TIMES.
        MOVE LV_STRR+LV_CIS(1) TO LV_SS.
        IF LV_SS <> 0.
          TRANSLATE LV_SS USING LV_CHANGE.
          CASE LV_CIS.
            WHEN 0.
              CONCATENATE LV_SS '' INTO PV_DXSTR.
            WHEN 1.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 2.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 3.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 4.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 5.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 6.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 7.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 8.
              CONCATENATE LV_SS '亿' PV_DXSTR INTO PV_DXSTR.
            WHEN 9.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 10.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
            WHEN 11.
              CONCATENATE LV_SS '' PV_DXSTR INTO PV_DXSTR.
          ENDCASE.
    
        ELSEIF LV_SS = 0 AND LV_STRR+LV_LIS(1) = 0.
          CASE LV_CIS.
            WHEN 0.
              IF LV_LIS <> 0.
                CONCATENATE '' PV_DXSTR INTO PV_DXSTR.
              ELSE.
                CONCATENATE '零元' PV_DXSTR INTO PV_DXSTR.
              ENDIF.
            WHEN 4.
              CONCATENATE '' PV_DXSTR INTO PV_DXSTR.
            WHEN 8.
              CONCATENATE '亿' PV_DXSTR INTO PV_DXSTR.
          ENDCASE.
    
        ELSEIF LV_SS = 0 AND LV_STRR+LV_LIS(1) <> 0.
          TRANSLATE LV_SS USING LV_CHANGE.
          CASE LV_CIS.
            WHEN 0.
              CONCATENATE '' LV_SS PV_DXSTR INTO PV_DXSTR.
            WHEN 4.
              CONCATENATE '' LV_SS PV_DXSTR INTO PV_DXSTR.
            WHEN 8.
              CONCATENATE '亿' LV_SS PV_DXSTR INTO PV_DXSTR.
            WHEN OTHERS.
              CONCATENATE LV_SS PV_DXSTR INTO PV_DXSTR.
          ENDCASE.
        ENDIF.
    
        LV_LIS = LV_CIS.
        LV_CIS = LV_CIS + 1.
      ENDDO.
    
    
      CLEAR LV_SS.
      IF LV_XS <> '00'.
        MOVE LV_XS+0(1) TO LV_SS.
        TRANSLATE LV_SS USING LV_CHANGE.
        CONCATENATE PV_DXSTR LV_SS '' INTO PV_DXSTR.
        MOVE LV_XS+1(1) TO LV_SS.
        TRANSLATE LV_SS USING LV_CHANGE.
        CONCATENATE PV_DXSTR LV_SS '' INTO PV_DXSTR.
      ELSE.
        CONCATENATE PV_DXSTR '' INTO PV_DXSTR.
      ENDIF.
    
      IF PV_DXSTR = '元整'.
        PV_DXSTR = '零元整'.
      ENDIF.
    ENDFORM.                    "FRM_CONVERT_MONEY_TO_CHINA
    
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_NUMBER_RANGE
    *&---------------------------------------------------------------------*
    * 获取序号
    *----------------------------------------------------------------------*
    *      --> PV_OBJEC
    *      --> PV_NR
    *      <-- PV_NUMBER
    *----------------------------------------------------------------------*
    FORM FRM_GET_NUMBER_RANGE USING PV_OBJECT
                                    PV_NR
                           CHANGING PV_NUMBER.
      CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
        EXPORTING
          OBJECT           = PV_OBJECT "Ceate with SNUM
        EXCEPTIONS
          FOREIGN_LOCK     = 1
          OBJECT_NOT_FOUND = 2
          SYSTEM_FAILURE   = 3
          OTHERS           = 4.
    
      CALL FUNCTION 'NUMBER_GET_NEXT'
        EXPORTING
          NR_RANGE_NR             = PV_NR
          OBJECT                  = PV_OBJECT
        IMPORTING
          NUMBER                  = PV_NUMBER
        EXCEPTIONS
          INTERVAL_NOT_FOUND      = 1
          NUMBER_RANGE_NOT_INTERN = 2
          OBJECT_NOT_FOUND        = 3
          QUANTITY_IS_0           = 4
          QUANTITY_IS_NOT_1       = 5
          INTERNAL_OVERFLOW       = 6
          OTHERS                  = 7.
    
      CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
        EXPORTING
          OBJECT = PV_OBJECT.
    ENDFORM.                    "FRM_GET_NUMBER_RANGE
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_DATE
    *&---------------------------------------------------------------------*
    * 检查日期是否合理
    *----------------------------------------------------------------------*
    *      --> PV_DATE
    *      <-- PV_OK
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_DATE USING PV_DATE
                     CHANGING PV_OK.
      DATA: LV_DATE TYPE SY-DATUM.
    
      CLEAR: PV_OK.
      LV_DATE = PV_DATE.
    
      IF LV_DATE = 0.
        PV_OK = ''.
      ELSE.
        PV_OK = 'X'.
      ENDIF.
    ENDFORM.                    "FRM_CHECK_DATE
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_DATE_02
    *&---------------------------------------------------------------------*
    * 检查日期有效性
    *----------------------------------------------------------------------*
    *      --> PV_DATE
    *      <-- PV_FLAG
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_DATE_02 USING PV_DATE
                        CHANGING PV_FLAG.
      CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
        EXPORTING
          DATE                      = PV_DATE
        EXCEPTIONS
          PLAUSIBILITY_CHECK_FAILED = 1
          OTHERS                    = 2.
    
      PV_FLAG = SY-SUBRC.
    ENDFORM.                    "FRM_CHECK_DATE_02
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_TIME
    *&---------------------------------------------------------------------*
    * 检查时间是否合理
    *----------------------------------------------------------------------*
    *      --> PV_TIME
    *      <-- PV_OK
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_TIME USING PV_TIME
                     CHANGING PV_OK.
      DATA: LV_TIME TYPE SY-UZEIT.
    
      CLEAR: PV_OK.
      LV_TIME = PV_TIME.
    
      IF LV_TIME = 0.
        PV_OK = ''.
      ELSE.
        PV_OK = 'X'.
      ENDIF.
    ENDFORM.                    "FRM_CHECK_TIME
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_TIME_02
    *&---------------------------------------------------------------------*
    * 检查时间有效性
    *----------------------------------------------------------------------*
    *      --> PV_TIME
    *      <-- PV_FLAG
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_TIME_02 USING PV_TIME
                        CHANGING PV_FLAG.
      CALL FUNCTION 'TIME_CHECK_PLAUSIBILITY'
        EXPORTING
          TIME                      = PV_TIME
        EXCEPTIONS
          PLAUSIBILITY_CHECK_FAILED = 1
          OTHERS                    = 2.
    
      PV_FLAG = SY-SUBRC.
    ENDFORM.                    "FRM_CHECK_TIME_02
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_MONAT_2
    *&---------------------------------------------------------------------*
    * 检查RANGES内表月份输入是否正确
    *----------------------------------------------------------------------*
    *      --> PRT_MONAT
    *      <-- PV_FLAG    0 正确,1 错误,2 起始月份大于截至月份
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_MONAT_2 TABLES PRT_MONAT
                         CHANGING PV_FLAG.
      FIELD-SYMBOLS: <LFS_01> TYPE ANY,
                     <LFS_02> TYPE ANY,
                     <LFS_03> TYPE ANY.
    
      PV_FLAG = 0.
    
      LOOP AT PRT_MONAT.
        ASSIGN COMPONENT 'LOW' OF STRUCTURE PRT_MONAT TO <LFS_01>.
        ASSIGN COMPONENT 'HIGH' OF STRUCTURE PRT_MONAT TO <LFS_02>.
        ASSIGN COMPONENT 'OPTION' OF STRUCTURE PRT_MONAT TO <LFS_03>.
    
        IF <LFS_01> <= 0 OR <LFS_01> > 12 OR <LFS_01> IS INITIAL.
          PV_FLAG = 1.    "月份输入错误
        ENDIF.
    
        IF <LFS_03> = 'BT'.
          IF <LFS_02> IS INITIAL.
            PV_FLAG = 1.    "月份输入错误
    
          ELSE.
            IF <LFS_02> < 0 OR <LFS_02> > 12.
              PV_FLAG = 1.    "月份输入错误
            ENDIF.
          ENDIF.
    
          IF <LFS_01> IS NOT INITIAL AND <LFS_02> IS NOT INITIAL.
            IF <LFS_01> > <LFS_02>.
              PV_FLAG = 2.    "起始月份大于截至月份
            ENDIF.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDFORM.                    "FRM_CHECK_MONAT_2
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_MONAT_3
    *&---------------------------------------------------------------------*
    * 检查RANGES内表月份是否含当前月份及以后的
    *----------------------------------------------------------------------*
    *      --> PRT_MONAT
    *      <-- PV_FLAG    0 正确,1 含当前月份及以后的
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_MONAT_3 TABLES PRT_MONAT
                          CHANGING PV_FLAG.
      DATA: LV_MONAT LIKE BKPF-MONAT.
      FIELD-SYMBOLS: <LFS_01> TYPE ANY,
                     <LFS_02> TYPE ANY,
                     <LFS_03> TYPE ANY.
    
    
      PV_FLAG = 0.
      LV_MONAT = SY-DATUM+4(2).
    
      LOOP AT PRT_MONAT.
        ASSIGN COMPONENT 'LOW' OF STRUCTURE PRT_MONAT TO <LFS_01>.
        ASSIGN COMPONENT 'HIGH' OF STRUCTURE PRT_MONAT TO <LFS_02>.
        ASSIGN COMPONENT 'OPTION' OF STRUCTURE PRT_MONAT TO <LFS_03>.
    
        IF <LFS_03> = 'LT'.
          IF <LFS_01> > LV_MONAT OR <LFS_02> > LV_MONAT.
            PV_FLAG = 1.
          ENDIF.
    
        ELSEIF <LFS_03> = 'GT' OR <LFS_03> = 'GE'.
          PV_FLAG = 1.
    
        ELSE.
          IF <LFS_01> >= LV_MONAT OR <LFS_02> >= LV_MONAT.
            PV_FLAG = 1.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDFORM.                    "FRM_CHECK_MONAT_3
    
    *&---------------------------------------------------------------------*
    *& Form FRM_CHECK_MONAT_2
    *&---------------------------------------------------------------------*
    * 检查单个输入的月份输入是否正确
    *----------------------------------------------------------------------*
    *      --> PV_MONAT
    *      <-- PV_FLAG    0 正确,1 错误
    *----------------------------------------------------------------------*
    FORM FRM_CHECK_MONAT_SINGLE_2 USING PV_MONAT
                                CHANGING PV_FLAG.
      IF PV_MONAT <= 0 OR PV_MONAT > 12 OR PV_MONAT IS INITIAL.
        PV_FLAG = 1.    "月份输入错误
      ELSE.
        PV_FLAG = 0.    "月份输入正确
      ENDIF.
    ENDFORM.                    "FRM_CHECK_MONAT_SINGLE_2.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_LAST_DAY_OF_MONTHS
    *&---------------------------------------------------------------------*
    *       获取指定日期所在月的最后一天的日期
    *----------------------------------------------------------------------*
    *      --> PV_DATE1  text
    *      <-- PV_DATE2  text
    *----------------------------------------------------------------------*
    FORM FRM_GET_LAST_DAY_OF_MONTHS USING    PV_DATE1
                                    CHANGING PV_DATE2.
      CLEAR: PV_DATE2.
    
      CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
        EXPORTING
          DAY_IN            = PV_DATE1
        IMPORTING
          LAST_DAY_OF_MONTH = PV_DATE2
        EXCEPTIONS
          DAY_IN_NO_DATE    = 1
          OTHERS            = 2.
    ENDFORM.                    " FRM_GET_LAST_DAY_OF_MONTHS
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CONVERT_FLOAT
    *&---------------------------------------------------------------------*
    *       转换为浮点类型
    *----------------------------------------------------------------------*
    *      --> PV_ATWRT  可以是字符类型,但是具体值必须是数值
    *      <-- PV_FLOAT  text
    *----------------------------------------------------------------------*
    FORM FRM_CONVERT_FLOAT USING PV_ATWRT CHANGING PV_FLOAT.
      DATA: LV_PACK(16) TYPE P.
    
      PACK PV_ATWRT TO LV_PACK.                                 "去前导0
      PV_FLOAT = LV_PACK.
    ENDFORM.                    " FRM_CONVERT_FLOAT
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_PATH_01
    *&---------------------------------------------------------------------*
    *       获取文件路径
    *----------------------------------------------------------------------*
    *  <--  p2        P_FILE
    *----------------------------------------------------------------------*
    FORM FRM_GET_PATH_01 CHANGING PV_FILE TYPE RLGRAP-FILENAME.
      DATA: LV_INITIAL_FNAME TYPE STRING,
            LV_RC            TYPE I,
            LT_FILETABLE     TYPE FILETABLE.
    
    
      CLEAR: PV_FILE.
    
      CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
        EXPORTING
          WINDOW_TITLE            = 'Select Files'
          FILE_FILTER             = 'Excel File (*.XLS)|*.XLS|Excel File  (*.XLSX)|*.XLSX|All (*.*)|*.*|'
          INITIAL_DIRECTORY       = LV_INITIAL_FNAME
          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 PV_FILE INDEX 1.
      ELSE.
      ENDIF.
    ENDFORM.                    " FRM_GET_PATH
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_PATH_02
    *&---------------------------------------------------------------------*
    *       获取文件路径
    *----------------------------------------------------------------------*
    *      <-- PV_FILE  text
    *----------------------------------------------------------------------*
    FORM FRM_GET_PATH_02 CHANGING PV_FILE TYPE RLGRAP-FILENAME.
      CALL FUNCTION 'F4_FILENAME'
        EXPORTING
          PROGRAM_NAME  = SY-CPROG
          DYNPRO_NUMBER = SY-DYNNR
        IMPORTING
          FILE_NAME     = PV_FILE.
    ENDFORM.                    " FRM_GET_PATH_02
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_DOWNLOAD_TEMPLATE_01
    *&---------------------------------------------------------------------*
    *       下载SMW0上传到SAP的模板
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM FRM_DOWNLOAD_TEMPLATE_01 USING PV_OBJID TYPE WWWDATATAB-OBJID
                                         PV_FILE TYPE RLGRAP-FILENAME.
      DATA: LS_KEY TYPE WWWDATATAB.
    
    
      LS_KEY-RELID = 'MI'.
      LS_KEY-OBJID = PV_OBJID.
    
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          KEY         = LS_KEY
          DESTINATION = PV_FILE.
    
      IF SY-SUBRC <> 0.
        MESSAGE 'SAP WEB资源库中无可用模板供使用,请检查模板是否存在!' TYPE 'I'.
      ENDIF.
    ENDFORM.                    "frm_download_template
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_DOWNLOAD_TEMPLATE_02
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PT_TABLE  text
    *----------------------------------------------------------------------*
    FORM FRM_DOWNLOAD_TEMPLATE_02 TABLES PT_TABLE.
      DATA: LS_EXCEL  TYPE OLE2_OBJECT,
            LS_SHEET  TYPE OLE2_OBJECT,
            LS_BOOK   TYPE OLE2_OBJECT,
            LS_CELL   TYPE OLE2_OBJECT,
            LS_RANGE  TYPE OLE2_OBJECT,
            LS_FONT   TYPE OLE2_OBJECT,
            LS_COLOR  TYPE OLE2_OBJECT,
            LS_COLUMN TYPE OLE2_OBJECT,
            LS_BORDERS  TYPE OLE2_OBJECT.
      DATA: LV_INDEX TYPE I,
            LV_VALUE TYPE CHAR40,
            LV_BOLD  TYPE I,
            LV_SIZE  TYPE I.
      FIELD-SYMBOLS: <LFS_01> TYPE ANY,
                     <LFS_02> TYPE ANY,
                     <LFS_03> TYPE ANY.
    
    
      CREATE OBJECT LS_EXCEL 'EXCEL.APPLICATION'.
      SET PROPERTY OF LS_EXCEL 'VISIBLE'   = 1.
      CALL METHOD OF LS_EXCEL 'WORKBOOKS' = LS_BOOK.
      CALL METHOD OF LS_BOOK 'ADD'.
    
      LOOP AT PT_TABLE.
        LV_INDEX = SY-TABIX.
    
        ASSIGN COMPONENT 1 OF STRUCTURE PT_TABLE TO <LFS_01>.
        ASSIGN COMPONENT 2 OF STRUCTURE PT_TABLE TO <LFS_02>.
        ASSIGN COMPONENT 3 OF STRUCTURE PT_TABLE TO <LFS_03>.
    
        IF <LFS_01> IS ASSIGNED.
          LV_VALUE = <LFS_01>.
          UNASSIGN <LFS_01>.
        ENDIF.
        IF <LFS_02> IS ASSIGNED.
          LV_BOLD = <LFS_02>.
          UNASSIGN <LFS_02>.
        ELSE.
          LV_BOLD = 1.
        ENDIF.
        IF <LFS_03> IS ASSIGNED.
          LV_SIZE = <LFS_03>.
          UNASSIGN <LFS_03>.
        ELSE.
          LV_SIZE = 11.
        ENDIF.
    
        CALL METHOD OF LS_EXCEL 'CELLS' = LS_CELL
          EXPORTING
          #1 = 1
          #2 = LV_INDEX.
        SET PROPERTY OF LS_CELL 'VALUE' = LV_VALUE.
        CALL METHOD OF LS_CELL 'FONT' = LS_FONT.
        SET PROPERTY OF LS_FONT 'BOLD' = LV_BOLD.
        SET PROPERTY OF LS_FONT 'SIZE' = LV_SIZE.
      ENDLOOP.
    
      CALL METHOD OF LS_EXCEL 'COLUMNS' = LS_COLUMN.
      CALL METHOD OF LS_COLUMN 'AUTOFIT'.
    ENDFORM.                    " FRM_DOWNLOAD_TEMPLATE_02
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_UPLOAD_EXCEL_01
    *&---------------------------------------------------------------------*
    *       导入excel到程序中
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM FRM_UPLOAD_EXCEL_01 TABLES PT_EXCEL STRUCTURE ALSMEX_TABLINE
                              USING PV_FILE TYPE RLGRAP-FILENAME
                                    PV_BEGIN_COL TYPE I
                                    PV_BEGIN_ROW TYPE I
                                    PV_END_COL TYPE I
                                    PV_END_ROW TYPE I.
      TYPES: BEGIN OF LTYP_SENDERLINE,
             LINE(4096) TYPE C,
             END OF LTYP_SENDERLINE.
    
      DATA: LT_TB TYPE TABLE OF LTYP_SENDERLINE.
      DATA: LV_RC TYPE I.
    
      IF PV_BEGIN_COL IS INITIAL.
        PV_BEGIN_COL = 1.
      ENDIF.
    
      IF PV_BEGIN_ROW IS INITIAL.
        PV_BEGIN_ROW = 1.
      ENDIF.
    
      IF PV_END_COL IS INITIAL.
        PV_END_ROW = 1.
      ENDIF.
    
      IF PV_END_ROW IS INITIAL.
        PV_END_ROW = 65535.
      ENDIF.
    
      CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT
        IMPORTING
          DATA                 = LT_TB
        CHANGING
          RC                   = LV_RC
        EXCEPTIONS
          CNTL_ERROR           = 1
          ERROR_NO_GUI         = 2
          NOT_SUPPORTED_BY_GUI = 3
          OTHERS               = 4.
    
      CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
        EXPORTING
          FILENAME                = PV_FILE
          I_BEGIN_COL             = PV_BEGIN_COL      "从excel第几列开始读取
          I_BEGIN_ROW             = PV_BEGIN_ROW      "从excel第几行开始读取
          I_END_COL               = PV_END_COL        "读取多少列
          I_END_ROW               = PV_END_ROW        "读取多少行
        TABLES
          INTERN                  = PT_EXCEL
        EXCEPTIONS
          INCONSISTENT_PARAMETERS = 1
          UPLOAD_OLE              = 2
          OTHERS                  = 3.
    
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          PERCENTAGE = 10
          TEXT       = '导入中...'.
    ENDFORM.                    "frm_upload_excel
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CONNECT_DB
    *&---------------------------------------------------------------------*
    *       联接外部数据库
    *----------------------------------------------------------------------*
    *      --> PV_CON_NAME  text
    *      <-- PV_MESSAGE   text
    *----------------------------------------------------------------------*
    FORM FRM_CONNECT_DB USING PV_CON_NAME TYPE DBCON-CON_NAME
                     CHANGING PV_MESSAGE TYPE BAPIRET2-MESSAGE.
      DATA: LOB_EXEC_REF TYPE REF TO CX_SY_NATIVE_SQL_ERROR.
    
      TRY.
          "连接到DBS并将其置为当前连接,其后所有的SQL命令都通过其执行。如果到DBS的连接已经存在,复用此连接,否则新建连接。
          EXEC SQL.
            connect to :PV_CON_NAME
          ENDEXEC.
          "设置当前连接。可以是DBCON列CON_NAME值,或建连接用的con。
          EXEC SQL.
            set connection :PV_CON_NAME
          ENDEXEC.
        CATCH CX_SY_NATIVE_SQL_ERROR INTO LOB_EXEC_REF.
          PV_MESSAGE = LOB_EXEC_REF->GET_TEXT( ).
      ENDTRY.
    ENDFORM.                    " FRM_CONNECT_DB
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_DISCON_DB
    *&---------------------------------------------------------------------*
    *       断开联接外部数据库
    *----------------------------------------------------------------------*
    *      --> PV_CON_NAME  text
    *----------------------------------------------------------------------*
    FORM FRM_DISCON_DB USING PV_CON_NAME TYPE DBCON-CON_NAME.
      EXEC SQL.
        DISCONNECT :PV_CON_NAME
      ENDEXEC.
    ENDFORM.                    " FRM_DISCON_DB
    
    DEFINE GMAC_OUTPUTSTATUS.
      IF &1 = 'S'.
        &1 = 'TRUE'.
        OUTPUTSTATUS-SERVICE_FLAG = &1.
        OUTPUTSTATUS-SERVICE_MESSAGE = &2.
        OUTPUTSTATUS-RESERVED_1 = &3.
        CONDENSE OUTPUTSTATUS-RESERVED_1 NO-GAPS.
        ERRORCOLLECTION-ERROR_MESSAGE = &2.
        APPEND OUTPUTSTATUS.
        CLEAR OUTPUTSTATUS.
        APPEND ERRORCOLLECTION.
        CLEAR ERRORCOLLECTION.
      ELSEIF &1 = 'E'.
        &1 = 'FALSE'.
        OUTPUTSTATUS-SERVICE_FLAG = &1.
        OUTPUTSTATUS-SERVICE_MESSAGE = &2.
        OUTPUTSTATUS-RESERVED_1 = &3.
        CONDENSE OUTPUTSTATUS-RESERVED_1 NO-GAPS.
        APPEND OUTPUTSTATUS.
        CLEAR OUTPUTSTATUS.
      ENDIF.
    END-OF-DEFINITION.
    
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_SET_LAYOUT_01
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PV_G_TITLE
    *---------------------------------------------------------------------*
    FORM FRM_SET_LAYOUT_01 USING PV_G_TITLE
                                 PV_ZEBRA
                                 PV_CWIDTH_OPT
                                 PV_SEL_MODE
                                 PV_INFO_FNAME
                                 PV_BOX_FNAME
                                 PV_NO_TOOLBAR
                                 PV_CELLTAB
                                 PV_CELLCOLOR
                        CHANGING PS_LAYOUT TYPE LVC_S_LAYO.
      PS_LAYOUT-ZEBRA         = PV_ZEBRA."可选行颜色,如果设置了,出现了间隔色带
      "ps_layout-NO_VLINE      = ' '."不显示列间竖线
      PS_LAYOUT-CWIDTH_OPT    = PV_CWIDTH_OPT.                "自动优化列宽
      PS_LAYOUT-SEL_MODE      = PV_SEL_MODE.
      "ps_layout-grid_title    = pv_g_title.
      PS_LAYOUT-INFO_FNAME    = PV_INFO_FNAME."设置行的颜色
      PS_LAYOUT-BOX_FNAME     = PV_BOX_FNAME. "ALV是否有小方块选择
      "ps_layout-DETAILINIT    = 'X'.
      "ps_layout-DETAILTITL    = 'Detail Title Bar'.
      PS_LAYOUT-NO_TOOLBAR    = PV_NO_TOOLBAR.
      PS_LAYOUT-STYLEFNAME    = PV_CELLTAB.
      PS_LAYOUT-CTAB_FNAME    = PV_CELLCOLOR.
    ENDFORM.                    " FRM_SET_LAYOUT_01
    
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_SET_FIELDCAT_01
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      --> PV_TABLE_NAME
    *      --> PV_COL_POS
    *      --> PV_EDIT
    *      --> PV_FIELDNAME
    *      --> PV_TITLENAME
    *---------------------------------------------------------------------*
    FORM FRM_SET_FIELDCAT_01 USING PV_INDEX
                                   PV_TABLE_NAME
                                   PV_COL_POS
                                   PV_EDIT
                                   PV_OUTPUTLEN
                                   PV_FIELDNAME
                                   PV_TITLENAME
                          CHANGING PT_FIELDCAT TYPE LVC_T_FCAT.
      DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
    
      PV_INDEX               = PV_INDEX + 1.
      LS_FIELDCAT-COL_POS    = PV_INDEX.
      LS_FIELDCAT-TABNAME    = PV_TABLE_NAME.
      LS_FIELDCAT-FIX_COLUMN = PV_COL_POS.
      LS_FIELDCAT-EDIT       = PV_EDIT.       "'X':可编辑
      "ls_fieldcat-checkbox   = pv_checkbox.   "作为复选框输出
      "ls_fieldcat-no_zero    = pv_no_zero.    "'X':不输出前导零
      "GT_FIELDCAT-no_out     = pv_no_out.
      LS_FIELDCAT-FIELDNAME  = PV_FIELDNAME.
      LS_FIELDCAT-SCRTEXT_L  = PV_TITLENAME.
      LS_FIELDCAT-SCRTEXT_M  = PV_TITLENAME.
      LS_FIELDCAT-SCRTEXT_S  = PV_TITLENAME.
      LS_FIELDCAT-OUTPUTLEN  = PV_OUTPUTLEN.  "列的字符宽度 输出的长度
      "ls_fieldcat-do_sum     = pv_do_sum.     "'X':合计
      "ls_fieldcat-key        = pv_key.        "关键字段,前面变蓝色
      "ls_fieldcat-key_sel    = pv_key_sel.    "关键字段,前面变蓝色
      "ls_fieldcat-icon       = pv_icon.       "此列作为图标输出
      "ls_fieldcat-symbol    = pv_symbol.     "输出作为符号
      "ls_fieldcat-lzero      = pv_lzero.      "'X':输出前导零
      "ls_fieldcat-no_sign    = pv_no_sign.    "'X':不输出符号
      "ls_fieldcat-emphasize  = pv_emphasize.  "带有颜色的高亮列 列的颜色
      "ls_fieldcat-round      = pv_round.      "四舍五入至小数位数下 n 位
      "ls_fieldcat-just       = pv_just.       "'','R', 'L', 'C'. 对齐方式
      "ls_fieldcat-decimals_o = pv_decimals_o  "输出小数位的编号
      "ls_fieldcat-DATATYPE   = 'CURR'.        "如果该字段指定为货币类型,则可以控制金额类字段小数点前移。
      "ls_fieldcat-datatype   = pv_datatype.      "
      "ls_fieldcat-inttype    = pv_inttype.        "如果DATATYPE和INTTYPE参数配合,按照本示例,可以控制数字型字段小数点前移。
      "ls_fieldcat-INTLEN     = pv_INTLEN.
      "ls_fieldcat-ref_field  = pv_ref_field.
      "ls_fieldcat-ref_table  = pv_ref_table.
      "ls_fieldcat-txt_field  = pv_txt_field.
      APPEND LS_FIELDCAT TO PT_FIELDCAT.
    ENDFORM.                    " FRM_SET_FIELDCAT_01
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CALL_ALV_FUNCTION_01
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      --> PT_FIELDCAT
    *      --> PT_OUTPUT6
    *      --> PV_TITLE
    *---------------------------------------------------------------------*
    FORM FRM_CALL_ALV_FUNCTION_01 TABLES PT_FIELDCAT STRUCTURE LVC_S_FCAT
                                         PT_OUTPUT
                                   USING PV_TITLE
                                         PS_LAYOUT TYPE LVC_S_LAYO
                                         PV_STATUS
                                         PV_COMMAND.
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
    *      I_BYPASSING_BUFFER         = 'X'
    *      I_GRID_SETTINGS            = LV_SETTING
          I_GRID_TITLE               = PV_TITLE
          I_CALLBACK_PROGRAM         = SY-REPID
          IS_LAYOUT_LVC              = PS_LAYOUT
          I_CALLBACK_PF_STATUS_SET   = PV_STATUS
          I_CALLBACK_USER_COMMAND    = PV_COMMAND
          IT_FIELDCAT_LVC            = PT_FIELDCAT[]
    *      IT_SORT                    = I_SORT[]
    *      IT_EVENTS                  = GT_EVENTS[]
    *      IS_PRINT                   = W_PRINT
          I_SAVE                     = 'A'
    *      IS_VARIANT                 = LS_VARIANT
        TABLES
          T_OUTTAB                   = PT_OUTPUT
        EXCEPTIONS
          PROGRAM_ERROR              = 1
          OTHERS                     = 2.
      IF SY-SUBRC NE 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
    ENDFORM.                    " FRM_CALL_ALV_FUNCTION_01
    View Code
  • 相关阅读:
    ExtJS专题(十):layout布局的使用(3)
    ExtJS专题(十一):lTree的Treepanel使用
    ExtJS专题(四):ExtJS组件的属性
    ExtJS专题(七):ExtJS面板Panel中视图区ViewPort的使用
    ExtJS专题(二):ExtJS类库和组件介绍
    ExtJS专题(十):layout布局的使用(1)
    EXtJS专题(九):ExtJS对话框的使用
    ExtJS专题(五):ExtJS面板Panel的使用
    ExtJS专题(三):ExtJS组件的使用
    ExtJS专题(八):ExtJS窗口Window的使用
  • 原文地址:https://www.cnblogs.com/ckstock/p/11640516.html
Copyright © 2011-2022 走看看