PT项目-采购订单批量导入

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

*-----------------------------------------------------------------------*
* 程序名称:ZMMEXEC0030
* 程序标题:采购订单批量导入
* 程序类型:功能报表
* 创建人  :www
* 创建日期:2013-11-20
* 模块    :
* 事务码  :ZMM003
* 请求号  :
* 功能描述:
* 相关文档:
*----------------------------------------------------------------------*
* 修改记录:
* 作者          日期       请求号      修改原因描述
*-----------  --------  -----------------------------------------------*
*
*----------------------------------------------------------------------*
REPORT zmmexec0030
  NO STANDARD PAGE HEADING
  MESSAGE-ID zcomm.

*----------------------------------------------------------------------*
*        INCLUDE                                                       *
*----------------------------------------------------------------------*
INCLUDE zslis.
INCLUDE zfile.

*----------------------------------------------------------------------*
* 声明数据表;
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* 定义结构;
*----------------------------------------------------------------------*
TYPES: BEGIN OF gts_alv_data,
         ztype    TYPE char1,      " 类型 H-抬头 I-明细
         bsart    TYPE ekko-bsart,
         verkf    TYPE ekko-verkf,
         ihrez    TYPE ekko-ihrez, " 项目号

         unsez    TYPE ekko-unsez, "事业部项目号  新加 20140625

         lifnr    TYPE ekko-lifnr,
         ekorg    TYPE ekko-ekorg,
         ekgrp    TYPE ekko-ekgrp,
         bukrs    TYPE ekko-bukrs,
         zterm    TYPE ekko-zterm,
         inco1    TYPE ekko-inco1,
         inco2    TYPE ekko-inco2,

         ebelp    TYPE char5,
         knttp    TYPE ekpo-knttp,
         pstyp    TYPE ekpo-pstyp,
         matnr    TYPE ekpo-matnr,
         menge    TYPE char25,
         meins    TYPE ekpo-meins,
         eindt    TYPE ekpo-agdat,
         netpr    TYPE char25,
         peinh    TYPE char5,
         mwskz    TYPE ekpo-mwskz,
         waers    TYPE ekko-waers,
         navnw    TYPE char25,    " 折扣金额
         navnw2   TYPE char25,    " 净价折扣%
         matkl    TYPE ekpo-matkl,
         werks    TYPE ekpo-werks,
         lgort    TYPE ekpo-lgort,
         insmk    TYPE ekpo-insmk,
         charg    TYPE charg_d,
         retpo    TYPE ekpo-retpo,
         hkont    TYPE hkont,
         vbeln    TYPE vbap-vbeln,
         posnr    TYPE char6,
         aufnr    TYPE aufk-aufnr,
         kostl    TYPE kostl,
         banfn    TYPE ekpo-banfn,
         bnfpo    TYPE char5,

         ebeln    TYPE ekko-ebeln,
         ebeln_o  TYPE c LENGTH 50,"added by yangk 20151224
         ebeln_p  TYPE c LENGTH 50,"added by yangk 20151224
       END OF gts_alv_data.
TYPES: BEGIN OF gts_alv_base,
         grp      TYPE i,  " 用于分组
         id       TYPE i,
         tag      TYPE i,
         sel      TYPE char1,
         light    TYPE c,
         rowcolor TYPE char4,
         msg      TYPE text255,
         update   TYPE char1,
       END OF gts_alv_base.
TYPES: BEGIN OF gts_alv.
INCLUDE   TYPE ty_file_data.
INCLUDE   TYPE gts_alv_data.
INCLUDE   TYPE gts_alv_base.
TYPES: END OF gts_alv.
TYPES: gtt_alv TYPE TABLE OF gts_alv.

*----------------------------------------------------------------------*
* 定义内表;
*----------------------------------------------------------------------*
DATA: gds_alv  TYPE gts_alv,
      gdt_alv  TYPE TABLE OF gts_alv.
DATA: gdt_item_n TYPE TABLE OF bapimepoitem   WITH HEADER LINE. "added by yangk 20151230

*----------------------------------------------------------------------*
* 定义变量;
*----------------------------------------------------------------------*
DATA: gdf_mandt TYPE mandt.

*----------------------------------------------------------------------*
* 定义常量.
*----------------------------------------------------------------------*
CONSTANTS:
  gdc_objid      TYPE wwwdata-objid VALUE 'ZMM03A',
  gdc_startrow   TYPE i VALUE 2,
*  gdc_maxcolumn  TYPE i VALUE 38,
  gdc_maxcolumn  TYPE i VALUE 40,
  gdc_maxline    TYPE i VALUE 65000.

*----------------------------------------------------------------------*
*        SELECTION-SCREEN  检索条件                                    *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK condi WITH FRAME TITLE text-004.
PARAMETERS : r3 RADIOBUTTON GROUP d1 DEFAULT 'X' USER-COMMAND zks, " 导入文件
             r4 RADIOBUTTON GROUP d1.                  " 下载空白模板
SELECTION-SCREEN END OF BLOCK condi.

SELECTION-SCREEN BEGIN OF BLOCK ifile WITH FRAME TITLE text-002.
PARAMETERS: p_ifile TYPE ibipparms-path MODIF ID ife.
PARAMETERS: p_maxrow TYPE i DEFAULT 500 MODIF ID ife.
PARAMETERS: p_return TYPE c AS CHECKBOX DEFAULT 'X' MODIF ID ife.
SELECTION-SCREEN END OF BLOCK ifile.

SELECTION-SCREEN BEGIN OF BLOCK ofile WITH FRAME TITLE text-003.
PARAMETERS: p_ofile TYPE ibipparms-path MODIF ID ofe.
SELECTION-SCREEN END OF BLOCK ofile.

*$*$----------------------------------------------------------------$*$*
*$*$                          Main Program                          $*$*
*$*$----------------------------------------------------------------$*$*
*--------- 初始化 ----------
INITIALIZATION.

*&------------------------------------------------------------
*&     At selection-screen.
*&------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CASE 'X'.
      WHEN r3. " 导入文件
        IF screen-group1 = 'IFE'.
          screen-active = 1.
          MODIFY SCREEN.
        ENDIF.
        IF screen-group1 = 'OFE'.
          screen-active = 0.
          MODIFY SCREEN.
        ENDIF.
      WHEN r4. " 下载模板
        IF screen-group1 = 'OFE'.
          screen-active = 1.
          MODIFY SCREEN.
        ENDIF.
        IF screen-group1 = 'IFE'.
          screen-active = 0.
          MODIFY SCREEN.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

*----------------------------------------------------------------------*
*        At selection-screen                                           *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ifile .
* 方便用户选择指定的Excel文件
  PERFORM select_ifile.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ofile .
* 方便用户选择指定的Excel文件
  PERFORM select_ofile.

*&------------------------------------------------------------
*&     At selection-screen.
*&------------------------------------------------------------
AT SELECTION-SCREEN.
* 检查参数输入的合法性 / 检查输入权限
  PERFORM frm_check_parameter.

*&------------------------------------------------------------
*&     LOAD-OF-PROGRAM.
*&------------------------------------------------------------
LOAD-OF-PROGRAM.
*--------- START-OF-SELECTION ----------
START-OF-SELECTION.

* 从数据表去数据并整理
  PERFORM get_data.

*--------- END-OF-SELECTION ----------
END-OF-SELECTION.

  CASE 'X'.
    WHEN r3. " 导入数据
      IF gdt_alv[] IS INITIAL.
        MESSAGE s001 DISPLAY LIKE 'E'.
      ELSE.
*       显示alv界面
        PERFORM frm_display_lvc.
      ENDIF.
    WHEN r4. " 下载模板
    WHEN OTHERS.
  ENDCASE.

  CLEAR:   gdt_alv.
  REFRESH: gdt_alv.


************************************************************************
*                         END OF MAIN PROGRAM
************************************************************************
*&---------------------------------------------------------------------*
*&      Form  select_ifile
*&---------------------------------------------------------------------*
*       弹出打开文件路径选择窗口,方便用户选择
*----------------------------------------------------------------------*
FORM select_ifile.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'(100)
      mode             = 'O'
      title            = '选择文件'(101)
    IMPORTING
      filename         = p_ifile
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 0 AND sy-subrc <> 3.
    MESSAGE e021. " 读取文件出错!
  ENDIF.
ENDFORM.                    " select_ifile

*&---------------------------------------------------------------------*
*&      Form  select_ofile
*&---------------------------------------------------------------------*
*       弹出打开文件路径选择窗口,方便用户选择
*----------------------------------------------------------------------*
FORM select_ofile.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'(100)
      mode             = 'S'
      title            = '选择文件'(101)
    IMPORTING
      filename         = p_ofile
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 0 AND sy-subrc <> 3.
    MESSAGE e021. " 读取文件出错!
  ENDIF.
ENDFORM.                    " select_ofile

*&---------------------------------------------------------------------*
*&      Form  frm_check_parameter
*&---------------------------------------------------------------------*
*       检查参数输入的合法性 / 检查输入权限
*----------------------------------------------------------------------*
FORM frm_check_parameter .

  IF sy-ucomm = 'ZKS'.
    RETURN.
  ENDIF.

* 权限检查
  CASE 'X'.
    WHEN r3. " 导入数据
      IF p_ifile IS INITIAL.
        CALL FUNCTION 'WS_FILENAME_GET'
          EXPORTING
            mask             = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'
            mode             = 'O'
            title            = '选择文件'
          IMPORTING
            filename         = p_ifile
          EXCEPTIONS
            inv_winsys       = 1
            no_batch         = 2
            selection_cancel = 3
            selection_error  = 4
            OTHERS           = 5.
        CASE sy-subrc.
          WHEN 0.
          WHEN 3.
            SET CURSOR FIELD 'P_IFILE'.
            MESSAGE e010.
          WHEN OTHERS.
            SET CURSOR FIELD 'P_IFILE'.
            MESSAGE e021.
        ENDCASE.
      ENDIF.
    WHEN r4. " 下载模板
      IF p_ofile IS INITIAL.
        CALL FUNCTION 'WS_FILENAME_GET'
          EXPORTING
            mask             = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'
            mode             = 'S'
            title            = '选择文件'
          IMPORTING
            filename         = p_ofile
          EXCEPTIONS
            inv_winsys       = 1
            no_batch         = 2
            selection_cancel = 3
            selection_error  = 4
            OTHERS           = 5.
        CASE sy-subrc.
          WHEN 0.
          WHEN 3.
            SET CURSOR FIELD 'P_OFILE'.
            MESSAGE e010.
          WHEN OTHERS.
            SET CURSOR FIELD 'P_OFILE'.
            MESSAGE e021.
        ENDCASE.
      ENDIF.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.                    " frm_check_parameter

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       逻辑处理
*----------------------------------------------------------------------*
FORM get_data .

  CLEAR:   gdt_alv.
  REFRESH: gdt_alv.

  CASE 'X'.
    WHEN r3. " 导入数据
      PERFORM frm_upload_file.
    WHEN r4. " 下载模板
      PERFORM frm_download_file.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.                    " GET_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*       将模板下载到本地
*----------------------------------------------------------------------*
FORM frm_download_file .

  DATA: lv_subrc TYPE sysubrc,
        lv_file  TYPE rlgrap-filename,
        lds_data  TYPE wwwdatatab.

  CALL FUNCTION 'ZTOOL_FILE_DOWNLOAD_SMW0'
    EXPORTING
      objname           = gdc_objid
      pathname          = p_ofile
    IMPORTING
      filename          = p_ofile
    EXCEPTIONS
      objname_not_exist = 1
      inv_winsys        = 2
      no_batch          = 3
      selection_cancel  = 4
      selection_error   = 5
      download_false    = 6
      OTHERS            = 7.
  CASE sy-subrc.
    WHEN 0.
      MESSAGE s017. " 模板下载成功!
    WHEN 1.
      MESSAGE e016 DISPLAY LIKE 'S'. " 模板不存在!
    WHEN 4.
    WHEN 5.
      MESSAGE e021 DISPLAY LIKE 'S'. " 读取文件出错!
    WHEN OTHERS.
      MESSAGE e018 DISPLAY LIKE 'S'. " 模板下载失败!
  ENDCASE.

ENDFORM.                    " FRM_DOWNLOAD_FILE

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
*       导入数据
*----------------------------------------------------------------------*
FORM frm_upload_file .

  DATA: lv_info TYPE text255,
        lv_tag  TYPE i,
        lv_msg  TYPE text255.
  lv_info = '导入进行中...'.

* 进度条
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 1
      text       = lv_info.

* 读取 Excel 表格
  PERFORM frm_read_excel_files USING p_ifile gdc_maxcolumn p_maxrow.

* 进度条
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 5
      text       = lv_info.

* 数据导入内表
  PERFORM frm_build_excel_data USING gdc_startrow 2.

* 进度条
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 10
      text       = lv_info.

* 整理导入的数据
  PERFORM frm_build_data.

* 进度条
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 15
      text       = lv_info.

* 即时执行
  IF gdt_alv[] IS NOT INITIAL.
    PERFORM frm_file_input.
  ENDIF.

* 进度条
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 90
      text       = lv_info.

* 数据导出
  IF p_return = 'X'.
    IF gdt_alv[] IS NOT INITIAL.
      PERFORM frm_file_output USING p_ifile gdc_startrow CHANGING lv_tag lv_msg.
      IF lv_tag <> 0.
        MESSAGE lv_msg TYPE 'W'.
      ENDIF.
    ENDIF.
  ENDIF.

* 进度条
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 100
      text       = lv_info.

ENDFORM.                    " FRM_UPLOAD_FILE

*&---------------------------------------------------------------------*
*&      Form  FRM_BUILD_DATA
*&---------------------------------------------------------------------*
*       整理导入的数据
*----------------------------------------------------------------------*
FORM frm_build_data .

  DATA: lv_grp      TYPE i,
        lv_rowcolor TYPE char4,
        ldf_temp    TYPE char30,
        lv_tag      TYPE i.
  DATA: ldf_aufnr   TYPE aufk-aufnr.
  "added by yangk 20160411 begin 查找公司代码对应的工厂
  RANGES: ldf_bukrs FOR bseg-bukrs,
          ldf_werks FOR mseg-werks.
  DATA: BEGIN OF ldt_t001w OCCURS 10,
          werks TYPE t001w-werks,
          bwkey TYPE t001w-bwkey,
        END OF ldt_t001w.
  DATA: BEGIN OF ldt_t001k OCCURS 10,
          bwkey TYPE t001k-bwkey,
          bukrs TYPE t001k-bukrs,
        END OF ldt_t001k.
*   CLEAR: ldt_t001w, ldt_t001w[].
*  SELECT DISTINCT werks bwkey
*    INTO TABLE ldt_t001w
*    FROM t001w.
*
*  SELECT DISTINCT bwkey bukrs
*    INTO TABLE ldt_t001k
*    FROM t001k
*    WHERE ( bukrs = '8100' OR bukrs = '8200' ).
*
*  LOOP AT ldt_t001w.
*    READ TABLE ldt_t001k WITH KEY bwkey = ldt_t001w-bwkey.
*    CHECK sy-subrc = 0.
*    CLEAR: ldf_werks.
*    ldf_werks+0(3) = 'IEQ'.
*    ldf_werks-low = ldt_t001w-werks.
*      APPEND ldf_werks .
*  ENDLOOP.
  "added by yangk 20160411 end.
  lv_grp = 0.
  lv_rowcolor = ''.
  LOOP AT gt_ifile INTO gs_ifile.

    CLEAR gds_alv.
    MOVE-CORRESPONDING gs_ifile TO gds_alv.

*   CHECK 抬头-H 明细-I
    PERFORM frm_check_length USING 1 gs_ifile-f01 '类型' 1
                          CHANGING gds_alv-ztype lv_tag gds_alv-msg.
*   只针对标记为抬头和明细的数据行进行处理
    IF gs_ifile-f01 <> 'H' AND gs_ifile-f01 <> 'I'.
      gds_alv-msg = '类型设置错误, 只能为"H"或者"I"!'.
      CONTINUE.
    ENDIF.

*   抬头检查
    IF gs_ifile-f01 = 'H'.
      PERFORM frm_check_length USING 1 gs_ifile-f02 '订单类型'    4
                            CHANGING gds_alv-bsart lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-bsart TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f03 'IMIS合同号' 30
                            CHANGING gds_alv-verkf lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-verkf TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f04 '库存采购项目号' 12
                            CHANGING gds_alv-ihrez lv_tag gds_alv-msg.
      IF lv_tag = 0.
        IF gds_alv-ihrez IS NOT INITIAL.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = gds_alv-ihrez
            IMPORTING
              output = ldf_aufnr.
          SELECT SINGLE aufnr
            INTO ldf_aufnr
            FROM aufk
           WHERE aufnr = ldf_aufnr
             AND autyp = '01'.
          IF sy-subrc <> 0.
            PERFORM frm_add_msg USING '"库存采购项目号"不是一个有效的内部订单号!' CHANGING gds_alv-msg.
          ENDIF.
        ENDIF.
      ENDIF.


      "begin add by lumingdao 20151211 注释代码
*      "新加   侯鹏飞  20140625
*      PERFORM frm_check_length USING 0 gs_ifile-f05 '事业部项目号' 12
*                            CHANGING gds_alv-unsez lv_tag gds_alv-msg.
*      IF lv_tag = 0.
*        IF gs_ifile-f07 ='8110' OR  gs_ifile-f07 ='8120'.
*          IF gds_alv-unsez IS NOT INITIAL.
*          ELSE.
*            PERFORM frm_add_msg USING '"事业部项目号"在通信事业部和事业五部是必填信息!' CHANGING gds_alv-msg.
*          ENDIF.
*        ENDIF.
*      ENDIF.
      "begin add by lumingdao 20151211 注释代码


      "beign add by lumingdao 20151211 组织架构调整-事业部项目校验修改

      "事业一部采购组织及采购组校验
      PERFORM frm_check_length USING 0 gs_ifile-f05 '事业部项目号' 12
                            CHANGING gds_alv-unsez lv_tag gds_alv-msg.
      IF lv_tag = 0.
*        IF gs_ifile-f07 ='8204' AND  gs_ifile-f08 = '804'.
*          IF gds_alv-unsez IS NOT INITIAL.
*          ELSE.
*            PERFORM frm_add_msg USING '"事业部项目号"在事业一部到事业五部及招标业务部是必填信息!' CHANGING gds_alv-msg.
*          ENDIF.
*        ENDIF.
*
*        IF gs_ifile-f07 ='8202'OR  gs_ifile-f07 ='8203'OR  gs_ifile-f07 ='8201'OR  gs_ifile-f07 ='8205'OR  gs_ifile-f07 ='8206'.
*          IF gds_alv-unsez IS NOT INITIAL.
*          ELSE.
*            PERFORM frm_add_msg USING '"事业部项目号"在事业一部到事业五部及招标业务部是必填信息!' CHANGING gds_alv-msg.
*          ENDIF.
*        ENDIF.
      ENDIF.
      "end add by lumingdao 20151211 组织架构调整-事业部项目校验修改

      "新加   侯鹏飞  20140625

      PERFORM frm_check_length USING 1 gs_ifile-f06 '供应商'     10
                            CHANGING gds_alv-lifnr lv_tag gds_alv-msg.
      PERFORM frm_check_length USING 1 gs_ifile-f07 '采购组织'    4
                            CHANGING gds_alv-ekorg lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-ekorg TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 1 gs_ifile-f08 '采购组'      3
                            CHANGING gds_alv-ekgrp lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-ekgrp TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 1 gs_ifile-f09 '公司代码'    4
                            CHANGING gds_alv-bukrs lv_tag gds_alv-msg.
      CHECK gds_alv-bukrs+0(1) = '8'."added by yangk 20160411
      PERFORM frm_check_length USING 0 gs_ifile-f10 '付款条款'    4
                            CHANGING gds_alv-zterm lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-zterm TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 1 gs_ifile-f11 '货币'         5
                            CHANGING gds_alv-waers lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-waers TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f12 '国际贸易条件1' 3
                            CHANGING gds_alv-inco1 lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-inco1 TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f13 '国际贸易条件2' 28
                            CHANGING gds_alv-inco2 lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-inco2 TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f14 '原采购订单编号' 28
                            CHANGING gds_alv-ebeln_o lv_tag gds_alv-msg.
*   明细数据检查
    ELSEIF gs_ifile-f01 = 'I'.
      PERFORM frm_check_length USING 1 gs_ifile-f15 '行项目号'     5
                            CHANGING gds_alv-ebelp lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f15 '行项目号'
                            CHANGING gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f16 '科目分配类别' 1
                            CHANGING gds_alv-knttp lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-knttp TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f17 '项目类别'     1
                            CHANGING gds_alv-pstyp lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-pstyp TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f18 '物料号'      18
                            CHANGING gds_alv-matnr lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-matnr TO UPPER CASE.
        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = gs_ifile-f18
          IMPORTING
            output       = gds_alv-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f19 '订单数量'    20
                            CHANGING gds_alv-menge lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_number USING gs_ifile-f19 '订单数量'
                              CHANGING gds_alv-menge lv_tag gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f20 '订单单位'     3
                            CHANGING gds_alv-meins lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-meins TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f21 '交货日期'    10
                            CHANGING ldf_temp lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_date USING gs_ifile-f21 '交货日期' CHANGING gds_alv-eindt gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 1 gs_ifile-f22 '含税净价'    20
                            CHANGING gds_alv-netpr lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_number USING gs_ifile-f22 '含税净价'
                              CHANGING gds_alv-netpr lv_tag gds_alv-msg.
      ENDIF.
      IF gs_ifile-f22 IS INITIAL.
        gds_alv-peinh = '1'.
      ELSE.
        PERFORM frm_check_length USING 0 gs_ifile-f23 '价格单位'     5
                              CHANGING gds_alv-peinh lv_tag gds_alv-msg.
        IF lv_tag = 0.
          PERFORM frm_check_number USING gs_ifile-f23 '价格单位'
                                CHANGING gds_alv-peinh lv_tag gds_alv-msg.
        ENDIF.
      ENDIF.
      PERFORM frm_check_length USING 1 gs_ifile-f24 '税码'         2
                            CHANGING gds_alv-mwskz lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-mwskz TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f25 '折扣金额'    20
                            CHANGING gds_alv-navnw lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_number USING gs_ifile-f25 '折扣金额'
                              CHANGING gds_alv-navnw lv_tag gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f26 '净价折扣%'   20
                            CHANGING gds_alv-navnw2 lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_number USING gs_ifile-f26 '净价折扣%'
                              CHANGING gds_alv-navnw2 lv_tag gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f27 '物料组'       9
                            CHANGING gds_alv-matkl lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-matkl TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f28 '工厂'         4
                            CHANGING gds_alv-werks lv_tag gds_alv-msg.
**      CHECK gds_alv-werks IN ldf_werks. "added by yangk 20160411
      PERFORM frm_check_length USING 1 gs_ifile-f29 '库存地点'     4
                            CHANGING gds_alv-lgort lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-lgort TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f30 '库存类型'     1
                            CHANGING gds_alv-insmk lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-insmk TO UPPER CASE.
      ENDIF.

      PERFORM frm_check_length USING 0 gs_ifile-f31 '批次'        10
                            CHANGING gds_alv-charg lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-charg TO UPPER CASE.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f32 '退货项目'     1
                            CHANGING gds_alv-retpo lv_tag gds_alv-msg.
      IF lv_tag = 0.
        TRANSLATE gds_alv-retpo TO UPPER CASE.
      ENDIF.
      IF lv_tag = 0.
        IF gs_ifile-f32 = '' OR gs_ifile-f32 = space OR gs_ifile-f32 = 'X'.
        ELSE.
          PERFORM frm_add_msg USING '退货项目只能输入空或者"X"' CHANGING gds_alv-msg.
        ENDIF.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f32 '总账科目'    10
                            CHANGING gds_alv-hkont lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f33 '总账科目'
                            CHANGING gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f34 '销售订单号'  10
                            CHANGING gds_alv-vbeln lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f34 '销售订单号'
                            CHANGING gds_alv-msg.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gds_alv-vbeln
          IMPORTING
            output = gds_alv-vbeln.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f35 '销售订单项目' 6
                            CHANGING gds_alv-posnr lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f35 '销售订单项目'
                            CHANGING gds_alv-msg.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gds_alv-posnr
          IMPORTING
            output = gds_alv-posnr.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f36 '内部订单号'  12
                            CHANGING gds_alv-aufnr lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f36 '内部订单号'
                            CHANGING gds_alv-msg.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gds_alv-aufnr
          IMPORTING
            output = gds_alv-aufnr.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f37 '成本中心'    10
                            CHANGING gds_alv-kostl lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f37 '成本中心'
                            CHANGING gds_alv-msg.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f38 '采购申请号'  10
                            CHANGING gds_alv-banfn lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f38 '采购申请号'
                            CHANGING gds_alv-msg.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gs_ifile-f38
          IMPORTING
            output = gds_alv-banfn.

        IF gs_ifile-f02 ='ZXS'.
          IF gds_alv-banfn IS INITIAL.
            PERFORM frm_add_msg USING '以销定采采购订单时,采购申请号 为必填!' CHANGING gds_alv-msg.
          ENDIF.
        ENDIF.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f39 '采购申请行项目号' 5
                            CHANGING gds_alv-bnfpo lv_tag gds_alv-msg.
      IF lv_tag = 0.
        PERFORM frm_check_numb USING gs_ifile-f39 '采购申请行项目号'
                            CHANGING gds_alv-msg.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gs_ifile-f39
          IMPORTING
            output = gds_alv-bnfpo.
        IF gs_ifile-f02 ='ZXS'.
          IF gds_alv-bnfpo IS INITIAL.
            PERFORM frm_add_msg USING '以销定采采购订单时,采购申请行项目号 为必填!' CHANGING gds_alv-msg.
          ENDIF.
        ENDIF.
      ENDIF.
      PERFORM frm_check_length USING 0 gs_ifile-f40 '原采购订单及行项目编号' 50
                            CHANGING gds_alv-ebeln_p lv_tag gds_alv-msg.
    ENDIF.

*   分组设定
    IF gs_ifile-f01 = 'H'.
      ADD 1 TO lv_grp.
*     颜色设定
      IF lv_rowcolor  = 'C500'.
        lv_rowcolor = 'C210'.
      ELSE.
        lv_rowcolor = 'C500'.
      ENDIF.
    ENDIF.
    gds_alv-grp = lv_grp.
    gds_alv-rowcolor = lv_rowcolor.
    gds_alv-id = gs_ifile-line.

    IF gds_alv-msg IS NOT INITIAL.
      gds_alv-light = '1'.
    ENDIF.

    APPEND gds_alv TO gdt_alv.
  ENDLOOP.

  CLEAR:   gt_ifile.
  REFRESH: gt_ifile.

ENDFORM.                    " FRM_BUILD_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_INPUT
*&---------------------------------------------------------------------*
*       即时执行
*----------------------------------------------------------------------*
FORM frm_file_input .
  DATA: BEGIN OF ldt_sort OCCURS 10,
          grp TYPE i,
          tag TYPE i,
        END OF ldt_sort.
  DATA: ldf_from  TYPE i,
        ldf_index TYPE i,
        ldf_count TYPE i,
        ldf_ebeln TYPE ekko-ebeln,
        ldf_waers TYPE ekko-waers,
        ldf_msg   TYPE text255.
  DATA: lds_head TYPE gts_alv,
        ldt_item TYPE TABLE OF gts_alv WITH HEADER LINE.
  DATA: lds_num TYPE c LENGTH 5.

* 判断分组错误状态,保证每个分组中都没有错误的记录
  CLEAR: ldt_sort, ldt_sort[].
  LOOP AT gdt_alv INTO gds_alv WHERE msg IS NOT INITIAL.
    CLEAR ldt_sort.
    ldt_sort-grp = gds_alv-grp.
    ldt_sort-tag = 1.
    APPEND ldt_sort.
  ENDLOOP.
  LOOP AT gdt_alv INTO gds_alv.
    READ TABLE ldt_sort WITH KEY grp = gds_alv-grp.
    IF sy-subrc <> 0.
      CLEAR ldt_sort.
      ldt_sort-grp = gds_alv-grp.
      ldt_sort-tag = 0.
      APPEND ldt_sort.
    ENDIF.
  ENDLOOP.
  DELETE ldt_sort WHERE tag = 1.
  SORT ldt_sort BY grp.

* 根据分组 执行采购订单的导入操作
  SORT gdt_alv BY grp id.
  LOOP AT ldt_sort.
    READ TABLE gdt_alv INTO gds_alv WITH KEY grp = ldt_sort-grp
      BINARY SEARCH.
    IF sy-subrc = 0.
      ldf_from  = sy-tabix.
      ldf_count = 0.
      CLEAR: lds_head, ldt_item, ldt_item[], ldf_waers.
      LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
        IF gds_alv-grp <> ldt_sort-grp.
          EXIT.
        ENDIF.
        IF gds_alv-ztype = 'H'.
          lds_head = gds_alv.
          ADD 1 TO ldf_count.
        ELSEIF gds_alv-ztype = 'I'.
*          IF gds_alv-waers is not INITIAL.
*            IF ldf_waers is INITIAL.
*              ldf_waers = gds_alv-waers.
*            elseif ldf_waers <> gds_alv-waers.
*              ldf_waers = 'XXX'.
*            ENDIF.
*          ENDIF.
          APPEND gds_alv TO ldt_item.
        ENDIF.
      ENDLOOP.
*      lds_head-waers = ldf_waers.
*      IF ldf_waers is INITIAL or ldf_waers = 'XXX'.
*        LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
*          ldf_index = sy-tabix.
*          IF gds_alv-grp <> ldt_sort-grp.
*            EXIT.
*          ENDIF.
*          gds_alv-light = '1'.
*          gds_alv-msg   = '同一张凭证中的币种必需一致!'.
*          MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
*        ENDLOOP.
*        CONTINUE.
*      ENDIF.
*     抬头信息错误
      IF ldf_count <> 1.
        LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
          ldf_index = sy-tabix.
          IF gds_alv-grp <> ldt_sort-grp.
            EXIT.
          ENDIF.
          gds_alv-light = '1'.
          IF ldf_count = 0.
            gds_alv-msg = '缺少抬头信息'.
          ELSE.
            gds_alv-msg = '只需要一条抬头信息'.
          ENDIF.
          MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
        ENDLOOP.
        CONTINUE.
      ENDIF.
*     缺少明细数据
      IF ldt_item[] IS INITIAL.
        LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
          ldf_index = sy-tabix.
          IF gds_alv-grp <> ldt_sort-grp.
            EXIT.
          ENDIF.
          gds_alv-light = '1'.
          gds_alv-msg = '缺少明细信息'.
          MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
        ENDLOOP.
        CONTINUE.
      ENDIF.
*     创建 PO
      CLEAR:gdt_item_n,gdt_item_n[],lds_num.
      PERFORM frm_create_po TABLES ldt_item USING lds_head CHANGING ldf_ebeln ldf_msg .
      IF ldf_ebeln IS INITIAL.
        LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
          ldf_index = sy-tabix.
          IF gds_alv-grp <> ldt_sort-grp.
            EXIT.
          ENDIF.
          gds_alv-light = '1'.
          gds_alv-msg   = ldf_msg.
          MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
        ENDLOOP.
      ELSE.
        LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
          ldf_index = sy-tabix.
          IF gds_alv-grp <> ldt_sort-grp.
            EXIT.
          ENDIF.
          gds_alv-light = '3'.
          gds_alv-ebeln = ldf_ebeln.
          CONCATENATE '创建成功,采购订单号:' ldf_ebeln INTO gds_alv-msg.
          gds_alv-f42 = ldf_ebeln.
          IF lds_num IS NOT INITIAL.
            gds_alv-f43 = lds_num.
          ENDIF.
          lds_num = lds_num + 10.
          MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING ebeln light msg f42 f43.
        ENDLOOP.
      ENDIF.
    ENDIF.
  ENDLOOP.

  CLEAR: ldt_sort, ldt_sort[].
  CLEAR: lds_head, ldt_item, ldt_item[].

ENDFORM.                    " FRM_FILE_INPUT

*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_outPUT
*&---------------------------------------------------------------------*
*       数据导出 -- 反馈错误日志
*----------------------------------------------------------------------*
FORM frm_file_output USING im_ifile    TYPE ibipparms-path
                           im_startrow TYPE i
                  CHANGING ex_tag      TYPE i
                           ex_msg      TYPE text255.
  DATA: ldf_filename TYPE text255,
        ls_fieldcat  TYPE zexcel_s_fieldcat,
        lt_fieldcat  TYPE zexcel_t_fieldcat.
  DATA: ldf_count    TYPE i,
        ldf_row      TYPE i,
        ldf_col      TYPE i,
        ldf_title    TYPE text255.
  DATA: ldt_alv      TYPE TABLE OF gts_alv WITH HEADER LINE.

  ldf_filename = im_ifile.

* 打开文件
  CALL FUNCTION 'ZEXCEL_START'
    EXPORTING
      filename = ldf_filename
    IMPORTING
      subrc    = ex_tag
      msg      = ex_msg.
  CHECK ex_tag = 0.

  CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
  ls_fieldcat-fname   = 'MSG'.
  ls_fieldcat-coltext = '错误日志'.
  APPEND ls_fieldcat TO lt_fieldcat.

  CLEAR ldt_alv.
  ldf_row = im_startrow.
  LOOP AT gdt_alv INTO gds_alv.
    DO.
      IF gds_alv-id > ldf_row.
        APPEND ldt_alv.
        ADD 1 TO ldf_row.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
    APPEND gds_alv TO ldt_alv.
    ADD 1 TO ldf_row.
  ENDLOOP.
  "added by yangk 20151220  begin
  CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
  ls_fieldcat-fname   = 'F42'.
  ls_fieldcat-coltext = '新采购订单编号'.
  APPEND ls_fieldcat TO lt_fieldcat.
  ldf_row = im_startrow.
  ldf_col = 42.
  CALL FUNCTION 'ZEXCEL_FILL_ITAB'
    EXPORTING
      row        = ldf_row
      column     = ldf_col
      fieldcat   = lt_fieldcat
      autoheader = 0
    IMPORTING
      subrc      = ex_tag
      msg        = ex_msg
    TABLES
      itab       = ldt_alv.

  CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
  ls_fieldcat-fname   = 'F43'.
  ls_fieldcat-coltext = '新采购订单行项目号'.
  APPEND ls_fieldcat TO lt_fieldcat.
  ldf_row = im_startrow.
  ldf_col = 43.
  CALL FUNCTION 'ZEXCEL_FILL_ITAB'
    EXPORTING
      row        = ldf_row
      column     = ldf_col
      fieldcat   = lt_fieldcat
      autoheader = 0
    IMPORTING
      subrc      = ex_tag
      msg        = ex_msg
    TABLES
      itab       = ldt_alv.

  "added by yangk 20151220  end
  CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
  ls_fieldcat-fname   = 'MSG'.
  ls_fieldcat-coltext = '错误日志'.
  APPEND ls_fieldcat TO lt_fieldcat.
  ldf_row = im_startrow.
  ldf_col = gdc_maxcolumn + 1.
  CALL FUNCTION 'ZEXCEL_FILL_ITAB'
    EXPORTING
      row        = ldf_row
      column     = ldf_col
      fieldcat   = lt_fieldcat
      autoheader = 0
    IMPORTING
      subrc      = ex_tag
      msg        = ex_msg
    TABLES
      itab       = ldt_alv.
  CLEAR: ldt_alv, ldt_alv[].

* 结束Excel
  CALL FUNCTION 'ZEXCEL_END'
    EXPORTING
      visible  = 1
      saves    = 1
*     FILENAME = LDF_FILENAME
      close    = 1
    IMPORTING
      subrc    = ex_tag
      msg      = ex_msg.

ENDFORM.                    " FRM_FILE_outPUT

*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       显示alv界面
*----------------------------------------------------------------------*
FORM frm_display_lvc.

* 设定报表输出样式。
  PERFORM set_layout_lvc.
* 设定报表列标题格式
  PERFORM set_fieldcat_lvc.
* 输出ALV报表
  PERFORM alv_grid_display_lvc.

ENDFORM.                    " FRM_DISPLAY_ALV

*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT_LVC
*&---------------------------------------------------------------------*
*       设定报表输出样式。
*----------------------------------------------------------------------*
FORM set_layout_lvc.
  CLEAR: gds_alv_layout_lvc.
* 设置Grid的字段列宽度自动适应
  gds_alv_layout_lvc-cwidth_opt = 'X'.
* 设置Grid的行颜色变换显示
  gds_alv_layout_lvc-zebra  = 'X'.
* 置弹出窗口的标题栏
  gds_alv_layout_lvc-detailtitl = '详细内容'.
* 设置Grid的多行选择列,其中BOX必须为内表的一列,为一个字符长度
  gds_alv_layout_lvc-box_fname = 'SEL'.
* 行颜色字段设置
  gds_alv_layout_lvc-info_fname = 'ROWCOLOR'.
* 信号灯设置
  gds_alv_layout_lvc-excp_fname = 'LIGHT'.
ENDFORM.                    " SET_LAYOUT_LVC

*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT_LVC
*&---------------------------------------------------------------------*
*       设定报表列标题格式
*----------------------------------------------------------------------*
FORM set_fieldcat_lvc.

* ------ initial valuation
  CLEAR   gdt_alv_fieldcat_lvc.
  REFRESH gdt_alv_fieldcat_lvc.

  gdf_alv_col_pos = 0.
  DEFINE fieldcat_macro.
    gdf_alv_col_pos = gdf_alv_col_pos + 1.
    gds_alv_fieldcat_lvc-tabname   = 'GDT_ALV'.
    gds_alv_fieldcat_lvc-fieldname = '&1'.
    gds_alv_fieldcat_lvc-scrtext_l = &2.
    gds_alv_fieldcat_lvc-key       = &3.
    gds_alv_fieldcat_lvc-emphasize = &4.
    gds_alv_fieldcat_lvc-no_out    = &5.
    gds_alv_fieldcat_lvc-edit      = &6.
*   gds_alv_fieldcat_lvc-hotspot    = &6.
*   GdS_ALV_FIELDCAT_LVC-DECIMALS_O = &6.
*   GdS_ALV_FIELDCAT_LVC-DECIMALS   = &6.
*   gds_alv_fieldcat_lvc-checkbox   = &6.
*   gds_alv_fieldcat_lvc-cwidth_opt = &6.
    gds_alv_fieldcat_lvc-outputlen = &7.
    gds_alv_fieldcat_lvc-no_zero   = &8.
    gds_alv_fieldcat_lvc-just      = &9.
    gds_alv_fieldcat_lvc-col_pos   = gdf_alv_col_pos.
    append gds_alv_fieldcat_lvc to gdt_alv_fieldcat_lvc.
    clear gds_alv_fieldcat_lvc.
  END-OF-DEFINITION.

* 列标题设定
  fieldcat_macro msg   '消息' '' 'C700' '' '' '' '' ''.
  fieldcat_macro ebeln '采购订单' '' 'C510' '' '' '' '' ''.
  fieldcat_macro ztype '类型' '' '' '' '' '' '' ''.
  fieldcat_macro bsart '订单类型' '' '' '' '' '' '' ''.
  fieldcat_macro verkf 'IMIS合同号' '' '' '' '' '' '' ''.
  fieldcat_macro ihrez '库存采购项目号' '' '' '' '' '' '' ''.
  fieldcat_macro unsez '事业部项目号' '' '' '' '' '' '' ''.  "新加
  fieldcat_macro lifnr '供应商' '' '' '' '' '' '' ''.
  fieldcat_macro ekorg '采购组织' '' '' '' '' '' '' ''.
  fieldcat_macro ekgrp '采购组' '' '' '' '' '' '' ''.
  fieldcat_macro bukrs '公司代码' '' '' '' '' '' '' ''.
  fieldcat_macro zterm '付款条款' '' '' '' '' '' '' ''.
  fieldcat_macro inco1 '国际贸易条件1' '' '' '' '' '' '' ''.
  fieldcat_macro inco2 '国际贸易条件2' '' '' '' '' '' '' ''.

  fieldcat_macro ebelp '行项目号' '' '' '' '' '' '' ''.
  fieldcat_macro knttp '科目分配类别' '' '' '' '' '' '' ''.
  fieldcat_macro pstyp '项目类别' '' '' '' '' '' '' ''.
  fieldcat_macro matnr '物料号' '' '' '' '' '' '' ''.
  fieldcat_macro menge '订单数量' '' 'C300' '' '' '' '' ''.
  fieldcat_macro meins '订单单位' '' '' '' '' '' '' ''.
  fieldcat_macro eindt '交货日期' '' '' '' '' '' '' ''.
  fieldcat_macro netpr '含税净价' '' 'C300' '' '' '' '' ''.
  fieldcat_macro peinh '价格单位' '' '' '' '' '' '' ''.
  fieldcat_macro mwskz '税码' '' '' '' '' '' '' ''.
  fieldcat_macro waers '货币' '' '' '' '' '' '' ''.
  fieldcat_macro navnw '折扣金额' '' 'C300' '' '' '' '' ''.
  fieldcat_macro matkl '物料组(如果无料号)' '' '' '' '' '' '' ''.
  fieldcat_macro werks '工厂' '' '' '' '' '' '' ''.
  fieldcat_macro lgort '库存地点' '' '' '' '' '' '' ''.
  fieldcat_macro insmk '库存类型' '' '' '' '' '' '' ''.
  fieldcat_macro charg '批次' '' '' '' '' '' '' ''.
  fieldcat_macro retpo '退货项目' '' '' '' '' '' '' ''.
  fieldcat_macro hkont '总账科目' '' '' '' '' '' '' ''.
  fieldcat_macro vbeln '销售订单号' '' '' '' '' '' '' ''.
  fieldcat_macro posnr '销售订单行项目号' '' '' '' '' '' '' ''.
  fieldcat_macro aufnr '内部订单号' '' '' '' '' '' '' ''.
  fieldcat_macro kostl '成本中心' '' '' '' '' '' '' ''.
  fieldcat_macro banfn '采购申请号' '' '' '' '' '' '' ''.
  fieldcat_macro bnfpo '采购申请行项目号' '' '' '' '' '' '' ''.

* 其他项目补充
  CALL FUNCTION 'ZTOOL_BUILD_FIELDCAT'
    EXPORTING
      im_fieldcat = gdt_alv_fieldcat_lvc
    IMPORTING
      fieldcat    = gdt_alv_fieldcat_lvc
    TABLES
      itab        = gdt_alv.

ENDFORM.                    " SET_FIELDCAT_LVC

*&---------------------------------------------------------------------*
*&      Form  ALV_GRID_DISPLAY_LVC
*&---------------------------------------------------------------------*
*       输出ALV报表
*----------------------------------------------------------------------*
FORM alv_grid_display_lvc.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF_STATUS_LVC'
      i_callback_user_command  = 'USER_COMMAND_LVC'
      is_layout_lvc            = gds_alv_layout_lvc  "设定报表输出样式。
      it_fieldcat_lvc          = gdt_alv_fieldcat_lvc[]
*     it_sort_lvc              = gdt_alv_sortinfo_lvc
      i_default                = 'X'
      i_save                   = 'A'  "设定是否可以保存报表布局
*     i_html_height_top        = 12
*     i_html_height_end        = 8
    TABLES
      t_outtab                 = gdt_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_GRID_DISPLAY_LVC

*&---------------------------------------------------------------------*
*&      Form  PF_STATUS_SET_LVC
*&---------------------------------------------------------------------*
*       定义用户自定义的屏幕菜单。
*----------------------------------------------------------------------*
FORM set_pf_status_lvc USING im_extab TYPE slis_t_extab.
  DATA: l_count TYPE i.
  DATA: ldt_fcode TYPE TABLE OF sy-ucomm.

  CLEAR:   ldt_fcode.
  REFRESH: ldt_fcode.

  DESCRIBE TABLE gdt_alv[] LINES l_count.
  SET TITLEBAR  'TITLE' WITH l_count.

*  APPEND '&SUM' TO ldt_fcode.   " 小计
*  APPEND '&ABC' TO ldt_fcode.   " ABC分析
*  APPEND '&GRAPH' TO ldt_fcode. " 图形分析
  APPEND 'REFR' TO ldt_fcode.   " 刷新
  APPEND 'SAVE' TO ldt_fcode.   " 保存
  SET PF-STATUS 'STANDARD' EXCLUDING ldt_fcode.
ENDFORM.                    "SET_PF_STATUS_LVC


*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND_LVC
*&---------------------------------------------------------------------*
*       响应菜单项及相应事件。
*----------------------------------------------------------------------*
FORM user_command_lvc USING im_ucomm   TYPE sy-ucomm
                            im_filecat TYPE slis_selfield.
  DATA: lv_tag  TYPE i.

  CASE im_ucomm .
*   返回/退出
    WHEN  'BACK' OR  'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.

*   刷新
*    WHEN 'REFR'.
**     从数据表取数据并整理
*      PERFORM get_data.
*      IF gdt_alv[] IS INITIAL.
*        MESSAGE i001.  " 没有找到相关的数据!
*        LEAVE TO SCREEN 0.
*      ELSE.
*        im_filecat-refresh = 'X'.
*      ENDIF.

*   双击
    WHEN '&IC1' .
      READ TABLE gdt_alv INTO gds_alv INDEX im_filecat-tabindex.
      IF sy-subrc = 0.
        PERFORM frm_alv_dbclick USING gds_alv im_filecat CHANGING lv_tag.
*        IF lv_tag <> 0.
*        ENDIF.
      ENDIF .

    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    "user_command_lvc

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_PO
*&---------------------------------------------------------------------*
*       创建 PO
*----------------------------------------------------------------------*
FORM frm_create_po  TABLES   it_item  TYPE gtt_alv
                    USING    is_head  TYPE gts_alv
                    CHANGING ex_ebeln TYPE ekko-ebeln
                             ex_msg   TYPE text255.
  DATA: lds_head     TYPE bapimepoheader,
        lds_headx    TYPE bapimepoheaderx.
  DATA: ldt_return   TYPE TABLE OF bapiret2         WITH HEADER LINE,
        ldt_item     TYPE TABLE OF bapimepoitem     WITH HEADER LINE,
        ldt_itemx    TYPE TABLE OF bapimepoitemx    WITH HEADER LINE,
        ldt_plan     TYPE TABLE OF bapimeposchedule WITH HEADER LINE,
        ldt_planx    TYPE TABLE OF bapimeposchedulx WITH HEADER LINE,
        ldt_account  TYPE TABLE OF bapimepoaccount  WITH HEADER LINE,
        ldt_accountx TYPE TABLE OF bapimepoaccountx WITH HEADER LINE,
        ldt_cond     TYPE TABLE OF bapimepocond     WITH HEADER LINE,
        ldt_condx    TYPE TABLE OF bapimepocondx    WITH HEADER LINE.

  CLEAR:   ex_ebeln, ex_msg, lds_head, lds_headx.
  CLEAR:   ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
           ldt_account, ldt_accountx, ldt_cond, ldt_condx.
  REFRESH: ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
           ldt_account, ldt_accountx, ldt_cond, ldt_condx.

* 抬头信息
  lds_head-comp_code  = is_head-bukrs.
  lds_head-doc_type   = is_head-bsart.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = is_head-lifnr
    IMPORTING
      output = lds_head-vendor.
* 付款条件
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = is_head-zterm
    IMPORTING
      output = lds_head-pmnttrms.
  lds_head-purch_org  = is_head-ekorg.
  lds_head-pur_group  = is_head-ekgrp.
  lds_head-ref_1      = is_head-ihrez.
  lds_head-our_ref    = is_head-unsez. "新加
  lds_head-sales_pers = is_head-verkf.
  lds_head-incoterms1 = is_head-inco1.
  lds_head-incoterms2 = is_head-inco2.
  lds_head-currency   = is_head-waers.
  lds_head-telephone  = is_head-ebeln_o."added by yangk 20151224
*  lds_head-po_rel_ind = 'X'.
*  lds_headx-po_rel_ind = 'X'.
  lds_headx-telephone  = 'X'."added by yangk 20151224
  lds_headx-comp_code  = 'X'.
  lds_headx-doc_type   = 'X'.
  lds_headx-vendor     = 'X'.
  lds_headx-pmnttrms   = 'X'.
  lds_headx-purch_org  = 'X'.
  lds_headx-pur_group  = 'X'.
  IF is_head-ihrez IS NOT INITIAL.
    lds_headx-ref_1    = 'X'.
  ENDIF.
  lds_headx-our_ref    = 'X'.
  lds_headx-sales_pers = 'X'.
  lds_headx-incoterms1 = 'X'.
  lds_headx-incoterms2 = 'X'.
  lds_headx-currency   = 'X'.
* 明细数据
  LOOP AT it_item.
    CLEAR ldt_item.
    ldt_item-po_item    = it_item-ebelp.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = it_item-matnr
      IMPORTING
        output       = ldt_item-material
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    ldt_item-plant      = it_item-werks.
    ldt_item-stge_loc   = it_item-lgort.
    ldt_item-batch      = it_item-charg.
    ldt_item-matl_group = it_item-matkl. " 物料组
    ldt_item-quantity   = it_item-menge.
    ldt_item-po_unit    = it_item-meins.
    ldt_item-net_price  = it_item-netpr.
    ldt_item-price_unit = it_item-peinh.
    ldt_item-item_cat   = it_item-pstyp.
    ldt_item-acctasscat = it_item-knttp.
    ldt_item-ret_item   = it_item-retpo.
    ldt_item-tax_code   = it_item-mwskz. " 税代码
    ldt_item-gr_to_date = it_item-eindt.
    ldt_item-qual_insp  = it_item-insmk.
    ldt_item-preq_no    = it_item-banfn. " 采购申请编号
    ldt_item-preq_item  = it_item-bnfpo. " 采购申请的项目编号
    ldt_item-vend_mat   = it_item-ebeln_p. "原采购订单+行项目  "added by yangk 20151224
    APPEND ldt_item.
    CLEAR ldt_itemx.
    ldt_itemx-po_item    = it_item-ebelp.
    ldt_itemx-po_itemx   = 'X'.
    ldt_itemx-vend_mat   = 'X'. "added by yangk 20151224
    IF ldt_item-preq_no IS INITIAL.
      ldt_itemx-material   = 'X'.
      ldt_itemx-plant      = 'X'.
      ldt_itemx-matl_group = 'X'.
      ldt_itemx-quantity   = 'X'.
      ldt_itemx-po_unit    = 'X'.
      ldt_itemx-item_cat   = 'X'.
      ldt_itemx-acctasscat = 'X'.
      ldt_itemx-ret_item   = 'X'.
    ENDIF.
    ldt_itemx-stge_loc   = 'X'.
    ldt_itemx-batch      = 'X'.
    ldt_itemx-net_price  = 'X'.
    ldt_itemx-price_unit = 'X'.
    ldt_itemx-tax_code   = 'X'.
    IF ldt_item-gr_to_date IS NOT INITIAL.
      ldt_itemx-gr_to_date = 'X'.
    ENDIF.
    ldt_itemx-qual_insp  = 'X'.
    ldt_itemx-preq_no    = 'X'. " 采购申请编号
    ldt_itemx-preq_item  = 'X'. " 采购申请的项目编号
    APPEND ldt_itemx.

    IF it_item-eindt IS NOT INITIAL.
      CLEAR ldt_plan.
      ldt_plan-po_item        = it_item-ebelp.
      ldt_plan-sched_line     = 1.
      ldt_plan-del_datcat_ext = 'D'.
      WRITE it_item-eindt TO ldt_plan-delivery_date.
      ldt_plan-quantity       = it_item-menge.
      ldt_plan-stat_date      = it_item-eindt.
      APPEND ldt_plan.
      CLEAR ldt_planx.
      ldt_planx-po_item        = it_item-ebelp.
      ldt_planx-sched_line     = 1.
      ldt_planx-po_itemx       = 'X'.
      ldt_planx-sched_linex    = 'X'.
      ldt_planx-del_datcat_ext = 'X'.
      ldt_planx-delivery_date  = 'X'.
      IF ldt_plan-quantity IS NOT INITIAL.
        ldt_planx-quantity       = 'X'.
      ENDIF.
      ldt_planx-stat_date      = 'X'.
      APPEND ldt_planx.
    ENDIF.

    IF it_item-navnw IS NOT INITIAL.
      CLEAR ldt_cond.
      ldt_cond-itm_number   = it_item-ebelp.
      ldt_cond-cond_st_no   = 1.
      ldt_cond-cond_type    = 'RB00'. " 绝对折扣
      ldt_cond-cond_value   = it_item-navnw.
      ldt_cond-currency     = is_head-waers.
*      ldt_cond-COND_UNIT    = it_item-meins.
*      ldt_cond-CONBASEVAL   = 1.
*      ldt_cond-NUMCONVERT   = 1.
*      ldt_cond-DENOMINATO   = 1.
      ldt_cond-change_id    = 'I'.
      APPEND ldt_cond.
      CLEAR ldt_condx.
      ldt_condx-itm_number  = it_item-ebelp.
      ldt_condx-cond_st_no  = 1.
      ldt_condx-itm_numberx = 'X'.
      ldt_condx-cond_st_nox = 'X'.
      ldt_condx-cond_type   = 'X'.
      ldt_condx-cond_value  = 'X'.
      ldt_condx-currency    = 'X'.
*      ldt_condx-COND_UNIT   = 'X'.
*      ldt_condx-CONBASEVAL  = 'X'.
*      ldt_condx-NUMCONVERT  = 'X'.
*      ldt_condx-DENOMINATO  = 'X'.
      ldt_condx-change_id   = 'X'.
      APPEND ldt_condx.
    ENDIF.
    IF it_item-navnw2 IS NOT INITIAL.
      CLEAR ldt_cond.
      ldt_cond-itm_number   = it_item-ebelp.
      ldt_cond-cond_st_no   = 1.
      ldt_cond-cond_type    = 'RA00'. " 净价折扣%
      ldt_cond-cond_value   = it_item-navnw2.
      ldt_cond-currency     = '%'.
*      ldt_cond-COND_UNIT    = it_item-meins.
*      ldt_cond-CONBASEVAL   = 1.
*      ldt_cond-NUMCONVERT   = 1.
*      ldt_cond-DENOMINATO   = 1.
      ldt_cond-change_id    = 'I'.
      APPEND ldt_cond.
      CLEAR ldt_condx.
      ldt_condx-itm_number  = it_item-ebelp.
      ldt_condx-cond_st_no  = 1.
      ldt_condx-itm_numberx = 'X'.
      ldt_condx-cond_st_nox = 'X'.
      ldt_condx-cond_type   = 'X'.
      ldt_condx-cond_value  = 'X'.
      ldt_condx-currency    = 'X'.
*      ldt_condx-COND_UNIT   = 'X'.
*      ldt_condx-CONBASEVAL  = 'X'.
*      ldt_condx-NUMCONVERT  = 'X'.
*      ldt_condx-DENOMINATO  = 'X'.
      ldt_condx-change_id   = 'X'.
      APPEND ldt_condx.
    ENDIF.

    IF it_item-hkont IS NOT INITIAL
      OR it_item-vbeln IS NOT INITIAL
      OR it_item-aufnr IS NOT INITIAL
      OR it_item-kostl IS NOT INITIAL.
      CLEAR ldt_account.
      ldt_account-po_item    = it_item-ebelp.
      ldt_account-serial_no  = 1.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = it_item-hkont
        IMPORTING
          output = ldt_account-gl_account.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = it_item-vbeln
        IMPORTING
          output = ldt_account-sd_doc.
      ldt_account-itm_number = it_item-posnr.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = it_item-aufnr
        IMPORTING
          output = ldt_account-orderid.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = it_item-kostl
        IMPORTING
          output = ldt_account-costcenter.
      APPEND ldt_account.
      CLEAR ldt_accountx.
      ldt_accountx-po_item    = it_item-ebelp.
      ldt_accountx-serial_no  = 1.
      ldt_accountx-po_itemx   = 'X'.
      ldt_accountx-serial_nox = 'X'.
      ldt_accountx-gl_account = 'X'.
      ldt_accountx-sd_doc     = 'X'.
      ldt_accountx-itm_number = 'X'.
      ldt_accountx-orderid    = 'X'.
      ldt_accountx-costcenter = 'X'.
      APPEND ldt_accountx.
    ENDIF.
  ENDLOOP.
*         navnw    TYPE char25,

  CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
      poheader               = lds_head
      poheaderx              = lds_headx
*     POADDRVENDOR           =
*     TESTRUN                =
*     MEMORY_UNCOMPLETE      =
*     MEMORY_COMPLETE        =
*     POEXPIMPHEADER         =
*     POEXPIMPHEADERX        =
*     VERSIONS               =
*     NO_MESSAGING           =
*     NO_MESSAGE_REQ         =
*     NO_AUTHORITY           =
      no_price_from_po       = 'X'
*     PARK_COMPLETE          =
*     PARK_UNCOMPLETE        =
    IMPORTING
      exppurchaseorder       = ex_ebeln
*     EXPHEADER              =
*     EXPPOEXPIMPHEADER      =
    TABLES
      return                 = ldt_return[]
      poitem                 = ldt_item[]
      poitemx                = ldt_itemx[]
*     POADDRDELIVERY         =
      poschedule             = ldt_plan[]
      poschedulex            = ldt_planx[]
      poaccount              = ldt_account[]
*     POACCOUNTPROFITSEGMENT =
      poaccountx             = ldt_accountx[]
*     POCONDHEADER           =
*     POCONDHEADERX          =
      pocond                 = ldt_cond
      pocondx                = ldt_condx
*     POLIMITS               =
*     POCONTRACTLIMITS       =
*     POSERVICES             =
*     POSRVACCESSVALUES      =
*     POSERVICESTEXT         =
*     EXTENSIONIN            =
*     EXTENSIONOUT           =
*     POEXPIMPITEM           =
*     POEXPIMPITEMX          =
*     POTEXTHEADER           =
*     POTEXTITEM             =
*     ALLVERSIONS            =
*     POPARTNER              =
*     POCOMPONENTS           =
*     POCOMPONENTSX          =
*     POSHIPPING             =
*     POSHIPPINGX            =
*     POSHIPPINGEXP          =
*     SERIALNUMBER           =
*     SERIALNUMBERX          =
*     INVPLANHEADER          =
*     INVPLANHEADERX         =
*     INVPLANITEM            =
*     INVPLANITEMX           =
    .

  IF ex_ebeln IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    SORT ldt_return BY type id number message.
    DELETE ADJACENT DUPLICATES FROM ldt_return COMPARING type id number message.
    LOOP AT ldt_return WHERE type = 'E'.
      PERFORM frm_add_msg USING ldt_return-message CHANGING ex_msg.
    ENDLOOP.
    LOOP AT ldt_return WHERE type <> 'E' AND type <> 'I'.
      PERFORM frm_add_msg USING ldt_return-message CHANGING ex_msg.
    ENDLOOP.
  ELSE.
    gdt_item_n[] = ldt_item[]. "added by yangk 20151230
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

  CLEAR:   ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
           ldt_account, ldt_accountx, ldt_cond, ldt_condx.
  REFRESH: ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
           ldt_account, ldt_accountx, ldt_cond, ldt_condx.

ENDFORM.                    " FRM_CREATE_PO

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_NUMB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_check_numb  USING    im_value TYPE c
                              im_desc  TYPE c
                     CHANGING ex_msg   TYPE gts_alv-msg.
  DATA: lv_temp TYPE text255.

  CALL FUNCTION 'ZTOOL_GET_NUMCHAR'
    EXPORTING
      im_char    = im_value
    EXCEPTIONS
      not_number = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
    CONCATENATE '“' im_desc '”不是数字' INTO lv_temp.
    PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
  ENDIF.

ENDFORM.                    " FRM_CHECK_NUMB

INCLUDE zslis. 详细代码如下

*&---------------------------------------------------------------------*
*&  Include           ZSLIS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 程序名称: ALV公用包含程序段
* 作者    : 王俊岭
* 时间    : 2013-11-07
* 模块    : 通用
* 描述    : ALV报表常用变量定义等
* 特殊特性: 无
*----------------------------------------------------------------------*
* 修改记录:
* 作者   时间       描述                                     请求号
* ------ ---------- ---------------------------------------- ----------*
*
*----------------------------------------------------------------------*

*&------------------------------------------------------------
*&        ALV data declarations.
*&------------------------------------------------------------
INCLUDE <icon>.
INCLUDE <symbol>.
TYPE-POOLS slis.

TYPES: BEGIN OF ty_alv_color,
         ch1 TYPE char1,
         ch2 TYPE char1,
         ch3 TYPE char1,
         ch4 TYPE char1,
       END OF ty_alv_color.

DATA: gds_alv_layout        TYPE slis_layout_alv,
      gds_alv_layout_lvc    TYPE lvc_s_layo,
      gds_alv_layout_lv2    TYPE lvc_s_layo,
      gds_alv_layout_lv3    TYPE lvc_s_layo.
DATA: gds_alv_grid          TYPE lvc_s_glay.
DATA: gds_alv_fieldcat      TYPE slis_fieldcat_alv,
      gdt_alv_fieldcat      TYPE TABLE OF slis_fieldcat_alv,
      gdt_alv_fieldca1      TYPE TABLE OF slis_fieldcat_alv,
      gdt_alv_fieldca2      TYPE TABLE OF slis_fieldcat_alv,
      gdt_alv_fieldca3      TYPE TABLE OF slis_fieldcat_alv,
      gdt_alv_fieldca4      TYPE TABLE OF slis_fieldcat_alv,
      gdt_alv_fieldcat_item TYPE TABLE OF slis_fieldcat_alv,
      gdt_alv_fieldcat_msg  TYPE TABLE OF slis_fieldcat_alv.
DATA: gds_alv_fieldcat_lvc  TYPE lvc_s_fcat,
      gdt_alv_fieldcat_lvc  TYPE lvc_t_fcat,
      gdt_alv_fieldcat_lv2  TYPE lvc_t_fcat,
      gdt_alv_fieldcat_lv3  TYPE lvc_t_fcat,
      gdt_alv_fieldcat_lv4  TYPE lvc_t_fcat.
DATA: gds_alv_sortinfo      TYPE slis_sortinfo_alv,
      gdt_alv_sortinfo      TYPE slis_t_sortinfo_alv.
DATA: gds_alv_sortinfo_lvc  TYPE lvc_s_sort,
      gdt_alv_sortinfo_lvc  TYPE lvc_t_sort,
      gdt_alv_sortinfo_lv2  TYPE lvc_t_sort,
      gdt_alv_sortinfo_lv3  TYPE lvc_t_sort.
DATA: gdt_alv_top_of_page   TYPE slis_t_listheader.
DATA: gds_alv_print         TYPE slis_print_alv.
DATA: gds_alv_event         TYPE slis_alv_event,
      gdt_alv_event         TYPE slis_t_event.
DATA: gdf_alv_col_pos       TYPE i,
      gdf_alv_fieldcat_val  TYPE text10.
DATA: gds_alv_color         TYPE slis_specialcol_alv,
      gds_alv_cellcolor     TYPE ty_alv_color,
      gds_alv_style         TYPE lvc_s_styl..
DATA: gdo_alv_grid          TYPE REF TO cl_gui_alv_grid,
      gdo_alv_igrid         TYPE REF TO cl_gui_alv_grid.
DATA: gdo_alv_screen        TYPE REF TO cl_gui_alv_grid.
DATA: gdo_alv_descr         TYPE REF TO cl_abap_structdescr.

FIELD-SYMBOLS: <gdf_alv_value> TYPE any,
               <gdf_alv_line>  TYPE any.

*&---------------------------------------------------------------------*
*&      Form  ALV_CHECK_VALUE
*&---------------------------------------------------------------------*
*       获取改变后的值
*----------------------------------------------------------------------*
FORM alv_check_value.
  IF gdo_alv_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = gdo_alv_grid.
  ENDIF.
  IF NOT gdo_alv_grid IS INITIAL.
    CALL METHOD gdo_alv_grid->check_changed_data.
  ENDIF.
ENDFORM.                    " ALV_CHECK_VALUE

*&---------------------------------------------------------------------*
*&      Form  ALV_REJUST_LAYOUT_WIDTH
*&---------------------------------------------------------------------*
*       重新调整列宽
*----------------------------------------------------------------------*
FORM alv_rejust_layout_width.
  DATA: lv_layout TYPE lvc_s_layo.
  IF gdo_alv_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = gdo_alv_grid.
  ENDIF.
  IF NOT gdo_alv_grid IS INITIAL.
    CALL METHOD gdo_alv_grid->get_frontend_layout
      IMPORTING
        es_layout = lv_layout.
    lv_layout-cwidth_opt = 'X'. " 设置Grid的字段列宽度自动适应
    CALL METHOD gdo_alv_grid->set_frontend_layout
      EXPORTING
        is_layout = lv_layout.
  ENDIF.
ENDFORM.                    " ALV_REJUST_LAYOUT_WIDTH

*&---------------------------------------------------------------------*
*&      Form  ALV_CHECK_ITEMVALUE
*&---------------------------------------------------------------------*
*       获取改变后的值
*----------------------------------------------------------------------*
FORM alv_check_itemvalue.
  IF gdo_alv_igrid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = gdo_alv_igrid.
  ENDIF.
  IF NOT gdo_alv_igrid IS INITIAL.
    CALL METHOD gdo_alv_igrid->check_changed_data.
  ENDIF.
ENDFORM.                    " ALV_CHECK_ITEMVALUE

*&---------------------------------------------------------------------*
*&      Form  frm_alv_dbclick
*&---------------------------------------------------------------------*
*       检查并进入相关业务界面
*----------------------------------------------------------------------*
FORM frm_alv_dbclick  USING is_line    TYPE any
                            im_filecat TYPE slis_selfield
                   CHANGING ex_tag     TYPE i.
  DATA: lv_tag  TYPE i.

* 全局变量赋值
  ASSIGN is_line TO <gdf_alv_line>.
* 初始化
  ex_tag = 0.
  lv_tag = 0.
* 根据点击的不同字段,跳转到相应的tcode.
  CASE im_filecat-fieldname.
*==================================== MM 采购 =========================
    WHEN 'EBELN'. " 采购订单
      PERFORM frm_set_param_id USING 'BES' 'EBELN' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'ME23N'       CHANGING lv_tag.
    WHEN 'MATNR' OR 'MAKTX'. " 物料代码
      PERFORM frm_set_param_id USING 'MAT' 'MATNR' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'MM03'        CHANGING lv_tag.
    WHEN 'MBLNR' OR 'MJAHR'. " 物料凭证
      PERFORM frm_set_param_id USING 'MBN' 'MBLNR' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'MJA' 'MJAHR' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'MB03'        CHANGING lv_tag.
*==================================== SD 采购 =========================
    WHEN 'VBELN'. " 销售订单
      PERFORM frm_set_param_id USING 'AUN' 'VBELN' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'VA03'        CHANGING lv_tag.
*    when 'VBELN'. " 发货单
*      PERFORM frm_set_param_id USING 'VL' 'VBELN' CHANGING lv_tag.
*      PERFORM frm_turnto_tcode USING 'VL03N'      CHANGING lv_tag.
    WHEN 'KUNNR'. " 客户
      PERFORM frm_set_param_id USING 'KUN' 'KUNNR' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'XD03'        CHANGING lv_tag.
    WHEN 'BLRQNO'. " 金税发票
      PERFORM frm_set_param_id USING 'ZBLRQ' 'BLRQNO' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'ZSD007'      CHANGING lv_tag.
*==================================== FI 财务 =========================
    WHEN 'BELNR' OR 'GJAHR'. " 会计凭证
      PERFORM frm_set_param_id USING 'BLN' 'BELNR' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'BUK' 'BUKRS' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'GJR' 'GJAHR' CHANGING lv_tag.
*     PERFORM frm_turnto_tcode USING 'FB03'        CHANGING lv_tag.
      SET PARAMETER ID 'GLN_FLEX' FIELD '0L'.
      CALL TRANSACTION 'IDCNFB03'.
    WHEN 'BELNR2' OR 'GJAHR2'. " 会计凭证
      PERFORM frm_set_param_id USING 'BLN' 'BELNR2' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'BUK' 'BUKRS2' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'GJR' 'GJAHR2' CHANGING lv_tag.
*     PERFORM frm_turnto_tcode USING 'FB03'        CHANGING lv_tag.
      SET PARAMETER ID 'GLN_FLEX' FIELD '0L'.
      CALL TRANSACTION 'IDCNFB03'.
*==================================== PM 设备 =========================
    WHEN 'EQUNR' OR 'EQKTX'. " 设备号
      PERFORM frm_set_param_id USING 'EQN' 'EQUNR' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'IE03'        CHANGING lv_tag.
    WHEN 'PLNNR' OR 'PLNTY' OR 'PLNAL'. " 设备任务清单
      PERFORM frm_set_param_id USING 'PLN' 'PLNNR' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'PTY' 'PLNTY' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'PAL' 'PLNAL' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'IA07'        CHANGING lv_tag.
*==================================== PM 设备维修 =====================
    WHEN 'PLNUM'. " 计划订单
      PERFORM frm_set_param_id USING 'PAF' 'PLNUM' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'MD13'        CHANGING lv_tag.
    WHEN 'AUFNR'. " 内部订单
      PERFORM frm_set_param_id USING 'ANR' 'AUFNR' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'KO03'        CHANGING lv_tag.
*      PERFORM frm_turnto_tcode USING 'IW33'        CHANGING lv_tag.
*    WHEN 'AUFNR'. " 生产订单
*      PERFORM frm_set_param_id USING 'ANR' 'AUFNR' CHANGING lv_tag.
*      PERFORM frm_turnto_tcode USING 'CO03'        CHANGING lv_tag.
    WHEN 'QMNUM'. " 通知单
      PERFORM frm_set_param_id USING 'IQM' 'QMNUM' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'IW23'        CHANGING lv_tag.
    WHEN 'RSNUM'. " 预留
      PERFORM frm_set_param_id USING 'RES' 'RSNUM' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'MB23'        CHANGING lv_tag.
*==================================== PS 项目管理 =====================
    WHEN 'PSPHI'. " 项目      SET PARAMETER ID 'PSP' FIELD ''.
      SET PARAMETER ID 'PRO' FIELD ''.
      PERFORM frm_set_param_id_proj  USING 'PSP' 'PSPHI'
                                  CHANGING lv_tag.
      PERFORM frm_turnto_tcode       USING 'CJ03'
                                  CHANGING lv_tag.
    WHEN 'PSPNR' OR 'PSPNR1' OR 'PSPNR2' OR 'PSPNR3'. " WBS 要素
      SET PARAMETER ID 'PSP' FIELD ''.
      SET PARAMETER ID 'PRO' FIELD ''.
      PERFORM frm_set_param_id_pspnr USING 'PRO' im_filecat-fieldname
                                  CHANGING lv_tag.
      PERFORM frm_turnto_tcode       USING 'CJ03'
                                  CHANGING lv_tag.
    WHEN 'POSKI' OR 'POSKI1' OR 'POSKI2' OR 'POSKI3'. " WBS 要素
      SET PARAMETER ID 'PSP' FIELD ''.
      SET PARAMETER ID 'PRO' FIELD ''.
      PERFORM frm_set_param_id USING 'PRO' im_filecat-fieldname
                            CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'CJ03'
                            CHANGING lv_tag.
*==================================== 其它 ============================
    WHEN 'DOKNR'. " 凭证编号
      PERFORM frm_set_param_id USING 'CV1' 'DOKNR' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'CV2' 'DOKAR' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'CV4' 'DOKTL' CHANGING lv_tag.
      PERFORM frm_set_param_id USING 'CV3' 'DOKVR' CHANGING lv_tag.
      PERFORM frm_turnto_tcode USING 'CV03N'       CHANGING lv_tag.
    WHEN OTHERS.
      ex_tag = 1.
  ENDCASE.
ENDFORM.                    " frm_alv_dbclick

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PARAM_ID
*&---------------------------------------------------------------------*
*       设置 Parameter ID
*----------------------------------------------------------------------*
FORM frm_set_param_id  USING im_parameterid TYPE c
                             im_fieldname   TYPE c
                    CHANGING ex_tag         TYPE i.
  IF ex_tag <> 0.
    RETURN.
  ENDIF.
  ASSIGN COMPONENT im_fieldname OF STRUCTURE <gdf_alv_line>
      TO <gdf_alv_value>.
  IF sy-subrc <> 0.
    ex_tag = 1.
    RETURN.
  ENDIF.
  IF <gdf_alv_value> IS INITIAL.
    ex_tag = 2.
    RETURN.
  ENDIF.
  SET PARAMETER ID im_parameterid FIELD <gdf_alv_value>.

ENDFORM.                    " frm_set_PARAM_id

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PARAM_ID_PSPNR
*&---------------------------------------------------------------------*
*       设置 Parameter ID
*----------------------------------------------------------------------*
FORM frm_set_param_id_pspnr USING im_parameterid TYPE c
                                  im_fieldname   TYPE c
                         CHANGING ex_tag         TYPE i.
  DATA: lv_poski TYPE char40.
  IF ex_tag <> 0.
    RETURN.
  ENDIF.
  ASSIGN COMPONENT im_fieldname OF STRUCTURE <gdf_alv_line>
      TO <gdf_alv_value>.
  IF sy-subrc <> 0.
    ex_tag = 1.
    RETURN.
  ENDIF.
  IF <gdf_alv_value> IS INITIAL.
    ex_tag = 2.
    RETURN.
  ENDIF.
  lv_poski = <gdf_alv_value>.
  CALL FUNCTION 'CONVERSION_EXIT_ABPSP_OUTPUT'
    EXPORTING
      input  = <gdf_alv_value>
    IMPORTING
      output = lv_poski.
  SET PARAMETER ID im_parameterid FIELD lv_poski.

ENDFORM.                    " FRM_SET_PARAM_ID_PSPNR

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PARAM_ID_PROJ
*&---------------------------------------------------------------------*
*       设置 Parameter ID
*----------------------------------------------------------------------*
FORM frm_set_param_id_proj USING im_parameterid TYPE c
                                  im_fieldname   TYPE c
                         CHANGING ex_tag         TYPE i.
  DATA: lv_poski TYPE char40.
  IF ex_tag <> 0.
    RETURN.
  ENDIF.
  ASSIGN COMPONENT im_fieldname OF STRUCTURE <gdf_alv_line>
      TO <gdf_alv_value>.
  IF sy-subrc <> 0.
    ex_tag = 1.
    RETURN.
  ENDIF.
  IF <gdf_alv_value> IS INITIAL.
    ex_tag = 2.
    RETURN.
  ENDIF.
  CALL FUNCTION 'CONVERSION_EXIT_KONPD_OUTPUT'
    EXPORTING
      input  = <gdf_alv_value>
    IMPORTING
      output = lv_poski.
  SET PARAMETER ID im_parameterid FIELD lv_poski.
ENDFORM.                    " FRM_SET_PARAM_ID_PROJ

*&---------------------------------------------------------------------*
*&      Form  frm_turnto_tcode
*&---------------------------------------------------------------------*
*       跳转到指定的tcode
*----------------------------------------------------------------------*
FORM frm_turnto_tcode  USING im_tcode TYPE c
                    CHANGING ex_tag   TYPE i.
  IF ex_tag <> 0.
    RETURN.
  ENDIF.
  CALL TRANSACTION im_tcode AND SKIP FIRST SCREEN .
ENDFORM.                    " frm_turnto_tcode

*&---------------------------------------------------------------------*
*&      Form  frm_update_shorttxt
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_update_shorttxt  USING im_fname TYPE lvc_s_fcat-fieldname
                                im_descp TYPE lvc_s_fcat-scrtext_s.
  READ TABLE gdt_alv_fieldcat_lvc INTO gds_alv_fieldcat_lvc
    WITH KEY fieldname = im_fname.
  IF sy-subrc = 0.
    gds_alv_fieldcat_lvc-scrtext_s = im_descp.
    MODIFY gdt_alv_fieldcat_lvc
      FROM gds_alv_fieldcat_lvc
     INDEX sy-tabix.
  ENDIF.
ENDFORM.                    " frm_update_shorttxt

*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_MSG
*&---------------------------------------------------------------------*
*       添加消息
*----------------------------------------------------------------------*
FORM frm_add_msg  USING    im_msg TYPE c
                  CHANGING ex_msg TYPE c.
  IF ex_msg IS INITIAL.
    ex_msg = im_msg.
  ELSE.
    CONCATENATE ex_msg im_msg INTO ex_msg SEPARATED BY '; '.
  ENDIF.
ENDFORM.                    " FRM_ADD_MSG

*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_MSG2
*&---------------------------------------------------------------------*
*       添加消息
*----------------------------------------------------------------------*
FORM frm_add_msg2 USING    im_msg TYPE c
                  CHANGING ex_msg TYPE c.
  IF ex_msg IS INITIAL.
    ex_msg = im_msg.
  ELSE.
    CONCATENATE im_msg ex_msg INTO ex_msg SEPARATED BY '; '.
  ENDIF.
ENDFORM.                    " FRM_ADD_MSG2

*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT_FIELD
*&---------------------------------------------------------------------*
*       输出文本
*----------------------------------------------------------------------*
FORM frm_output_field  USING im_document TYPE REF TO cl_dd_document
                            im_index    TYPE i
                            im_text     TYPE sdydo_text_element
                            im_value    TYPE sdydo_text_element.

  IF im_index > 0.
    CALL METHOD im_document->add_gap
      EXPORTING
        width = im_index.
  ENDIF.

  CALL METHOD im_document->add_text
    EXPORTING
      text         = im_text
      sap_fontsize = cl_dd_document=>small
      sap_emphasis = 'Strong'.

  CALL METHOD im_document->add_text
    EXPORTING
      text          = im_value
      sap_color     = cl_dd_document=>list_total_int
      sap_fontsize  = cl_dd_document=>small
*     sap_fontstyle = cl_dd_document=>serif
      sap_emphasis  = cl_dd_document=>emphasis.  "加粗还是斜体 STRONG是加粗

ENDFORM.                    " FRM_OUTPUT_FIELD

INCLUDE zfile 详细代码如下:

*&---------------------------------------------------------------------*
*&  包含                ZFILE
*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
* 程序名称: 文件操作公用包含程序段
* 作者    : www
* 时间    : 2013-04-22
* 模块    : 通用
* 描述    : 文件操作常用变量定义等
* 特殊特性: 无
*----------------------------------------------------------------------*
* 修改记录:
* 作者   时间       描述                                     请求号
* ------ ---------- ---------------------------------------- ----------*
*
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* 定义结构;
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_file_data,
        line  TYPE i,
        f01   TYPE text255,
        f02   TYPE text255,
        f03   TYPE text255,
        f04   TYPE text255,
        f05   TYPE text255,
        f06   TYPE text255,
        f07   TYPE text255,
        f08   TYPE text255,
        f09   TYPE text255,
        f10   TYPE text255,
        f11   TYPE text255,
        f12   TYPE text255,
        f13   TYPE text255,
        f14   TYPE text255,
        f15   TYPE text255,
        f16   TYPE text255,
        f17   TYPE text255,
        f18   TYPE text255,
        f19   TYPE text255,
        f20   TYPE text255,
        f21   TYPE text255,
        f22   TYPE text255,
        f23   TYPE text255,
        f24   TYPE text255,
        f25   TYPE text255,
        f26   TYPE text255,
        f27   TYPE text255,
        f28   TYPE text255,
        f29   TYPE text255,
        f30   TYPE text255,
        f31   TYPE text255,
        f32   TYPE text255,
        f33   TYPE text255,
        f34   TYPE text255,
        f35   TYPE text255,
        f36   TYPE text255,
        f37   TYPE text255,
        f38   TYPE text255,
        f39   TYPE text255,
        f40   TYPE text255,
        f41   TYPE text255,
        f42   TYPE text255,
        f43   TYPE text255,
        f44   TYPE text255,
        f45   TYPE text255,
        f46   TYPE text255,
        f47   TYPE text255,
        f48   TYPE text255,
        f49   TYPE text255,
        f50   TYPE text255,
      END OF ty_file_data.

DATA: gs_ifile TYPE ty_file_data,
      gt_ifile TYPE TABLE OF ty_file_data,
      gs_efile TYPE ztool_exceltabline,      " 读入的Excel文件
      gt_efile TYPE TABLE OF ztool_exceltabline.

FIELD-SYMBOLS: <gf_file_data>.

*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_INIT
*&---------------------------------------------------------------------*
*       FILE 初始化
*----------------------------------------------------------------------*
FORM frm_file_init .

  CLEAR:   gt_efile, gt_ifile.
  REFRESH: gt_efile, gt_ifile.

ENDFORM.                    " FRM_FILE_INIT

*&--------------------------------------------------------------------*
*&      Form  frm_read_excel_files
*&--------------------------------------------------------------------*
*       读取 Excel 文件
*---------------------------------------------------------------------*
FORM frm_read_excel_files USING im_ifile     TYPE ibipparms-path
                                im_maxcolumn TYPE i
                                im_maxline   TYPE i.
  CLEAR:   gt_efile.
  REFRESH: gt_efile.

* 第一行作为标题行,不读。
* 最大行数为 65千 行
  CALL FUNCTION 'ZTOOL_EXCEL_FROM_FILE_TO_ITAB'
    EXPORTING
      filename                = im_ifile
      i_begin_col             = 1
      i_begin_row             = 1
      i_end_col               = im_maxcolumn
      i_end_row               = im_maxline
    TABLES
      intern                  = gt_efile
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

ENDFORM. " frm_read_excel_user

*&--------------------------------------------------------------------*
*&      Form  frm_build_excel_data
*&--------------------------------------------------------------------*
*       整理读入的数据
*---------------------------------------------------------------------*
FORM frm_build_excel_data USING im_startrow TYPE i
                                im_startcol TYPE i.

  DATA: lv_tag  TYPE i,
        lv_num2 TYPE numc2,
        lv_fieldname TYPE char20.

  CLEAR:   gt_ifile.
  REFRESH: gt_ifile.

  SORT gt_efile BY row col.

  LOOP AT gt_efile INTO gs_efile WHERE row >= im_startrow.

*   每行初始化
    AT NEW row.
      lv_tag = 0.
      CLEAR: gs_ifile.
      gs_ifile-line = gs_efile-row.
    ENDAT.

    CONDENSE gs_efile-value.

*   按列号赋值
    lv_num2 = gs_efile-col.
    CONCATENATE 'GS_IFILE-F' lv_num2 INTO lv_fieldname.
    ASSIGN (lv_fieldname) TO <gf_file_data>.
    <gf_file_data> = gs_efile-value.
    IF gs_efile-col >= im_startcol.
      IF gs_efile-value IS NOT INITIAL.
        ADD 1 TO lv_tag.
      ENDIF.
    ENDIF.

    AT END OF row.
      DO 1 TIMES.
        IF gs_ifile-f01 = '例'. EXIT. ENDIF.
        IF gs_ifile-f01 = '样例'. EXIT. ENDIF.
        IF gs_ifile-f01 = '样例行'. EXIT. ENDIF.
        IF lv_tag = 0. EXIT. ENDIF.
        APPEND gs_ifile TO gt_ifile.
        CLEAR:gs_ifile.
      ENDDO.
    ENDAT.
    CLEAR:lv_num2,lv_fieldname.
  ENDLOOP.

  CLEAR:   gt_efile.
  REFRESH: gt_efile.

ENDFORM.                    " frm_build_excel_data

*&---------------------------------------------------------------------*
*&      Form  frm_check_length
*&---------------------------------------------------------------------*
*       长度验证
*----------------------------------------------------------------------*
FORM frm_check_length  USING    im_flag  TYPE i
                                im_value TYPE c
                                im_desc  TYPE c
                                im_len   TYPE i
                       CHANGING ex_value TYPE c
                                ex_tag   TYPE i
                                ex_msg   TYPE text255.
  DATA: lv_len TYPE i,
        lv_num  TYPE text255,
        lv_temp TYPE text255.

  ex_tag = 0.

  IF im_value IS INITIAL.
    IF im_flag = 0.
      RETURN.
    ELSE.
      ex_tag = 1.
      CONCATENATE '“' im_desc '”不能为空' INTO lv_temp.
      PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
      RETURN.
    ENDIF.
  ENDIF.

  lv_len = strlen( im_value ).
  IF lv_len > im_len.
    ex_tag = 1.
    lv_num = im_len. CONDENSE lv_num.
    CONCATENATE '“' im_desc '”长度不能大于' INTO lv_temp.
    CONCATENATE lv_temp lv_num '位!' INTO lv_temp SEPARATED BY space.
    PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
    RETURN.
  ELSE.
    ex_value = im_value.
  ENDIF.

ENDFORM.                    " frm_check_length

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_NUMBER
*&---------------------------------------------------------------------*
*       检查是否数字
*----------------------------------------------------------------------*
FORM frm_check_number USING    im_value TYPE c
                               im_desc  TYPE c
                      CHANGING ex_value TYPE c
                               ex_tag   TYPE i
                               ex_msg   TYPE c.
  DATA: lv_temp TYPE text255.

  CLEAR ex_value.
  ex_tag = 0.
  CALL FUNCTION 'ZTOOL_GET_NUMCHAR'
    EXPORTING
      im_char    = im_value
    IMPORTING
      ex_char    = ex_value
    EXCEPTIONS
      not_number = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
    ex_tag = 1.
    CONCATENATE '“' im_desc '”不是数字' INTO lv_temp.
    PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
  ENDIF.

ENDFORM.                    " FRM_CHECK_NUMBER

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_DATE
*&---------------------------------------------------------------------*
*       检查日期
*----------------------------------------------------------------------*
*      输入的日期格式: YYYYMMDD / YYYY-MM-DD / YYYY.MM.DD / YYYY/MM/DD
*----------------------------------------------------------------------*
FORM frm_check_date  USING    im_value TYPE c
                               im_desc  TYPE c
                      CHANGING ex_dat   TYPE sydatum
                               ex_msg   TYPE c.
  DATA: ldf_value TYPE char10,
        ldf_msg   TYPE text255,
        ldf_datum TYPE sydatum,
        ldf_len   TYPE i,
        ldf_year  TYPE numc4,
        ldf_month TYPE numc2,
        ldf_day   TYPE numc2.

  IF im_value IS INITIAL.
    RETURN.
  ENDIF.
  ldf_len = strlen( im_value ).
  IF ldf_len < 8.
    CONCATENATE im_desc '格式不正确!' INTO ldf_msg.
    PERFORM frm_add_msg USING ldf_msg CHANGING ex_msg.
    RETURN.
  ENDIF.

  CASE im_value+4(1).
    WHEN '-' OR '.' OR '/'.
      ldf_year  = im_value+0(4).
      CASE im_value+6(1).
        WHEN '-' OR '.' OR '/'.
          ldf_month = im_value+5(1).
          ldf_day   = im_value+7(2).
        WHEN OTHERS.
          ldf_month = im_value+5(2).
          ldf_day   = im_value+8(2).
      ENDCASE.
      CONCATENATE ldf_year ldf_month ldf_day INTO ldf_datum.
    WHEN OTHERS.
      ldf_value = im_value.
      REPLACE ALL OCCURRENCES OF '-' IN ldf_value WITH ``.
      REPLACE ALL OCCURRENCES OF '.' IN ldf_value WITH ``.
      REPLACE ALL OCCURRENCES OF '/' IN ldf_value WITH ``.
      ldf_datum = ldf_value.
  ENDCASE.
  ldf_len = strlen( ldf_datum ).
  IF ldf_len <> 8.
    CONCATENATE im_desc '格式不正确!' INTO ldf_msg.
    PERFORM frm_add_msg USING ldf_msg CHANGING ex_msg.
    RETURN.
  ENDIF.

  CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
    EXPORTING
      date                      = ldf_datum
    EXCEPTIONS
      plausibility_check_failed = 1
      OTHERS                    = 2.
  IF sy-subrc <> 0.
    CONCATENATE im_desc '格式不正确!' INTO ldf_msg.
    PERFORM frm_add_msg USING ldf_msg CHANGING ex_msg.
  ELSE.
    ex_dat = ldf_datum.
  ENDIF.


ENDFORM.                    " FRM_CHECK_DATE
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值