需要注意的地方:

行项目这个字段需要自己去生成,而且必须得填,否则会出现都按照第一行数据去生成.

 

 

REPORT zhdl_mm_report_064.

TABLES:sscrfields.

DATA: i_excel TYPE TABLE OF alsmex_tabline.

DATA: wa_excel TYPE alsmex_tabline.

 

*————————上传的内表————————-*

DATA:BEGIN OF ty_upload  ,

       pr_type TYPE bsart, “订单类型(采购)

       auto_source TYPE kzzuo, “自动货源确定

       material TYPE matnr, “物料

       quantity TYPE bamng, “采购申请数量

       deliv_date TYPE eindt, “项目交货日期

       plant TYPE ewerk, “工厂

       trackingno TYPE bednr, “需求跟踪号

    END OF ty_upload.

DATA:i_upload LIKE TABLE OF ty_upload WITH HEADER LINE.

DATA:i_uploadx LIKE TABLE OF ty_upload WITH HEADER LINE.

DATA:TYPE i.           “内表行数

 

TYPES:BEGIN OF ty_result,

      type  TYPE bapi_mtype,  “消息类型

      material(18),

      pr_type TYPE bsart, “订单类型(采购)

      flag(1),

      number TYPE bapimereqheaderpreq_no,

      message(1200),

      END OF ty_result.

DATA:gt_result TYPE TABLE OF ty_result WITH HEADER LINE.

 

DATA:flag(1).

 

DATA:prheader TYPE bapimereqheader,                                  “抬头

     prheaderx TYPE bapimereqheaderx,                                “抬头参数

     number TYPE bapimereqheaderpreq_no,                            “采购申请号(输出)

     pritem TYPE TABLE OF bapimereqitemimp WITH HEADER LINE,         “项目

     pritemx TYPE TABLE OF bapimereqitemx WITH HEADER LINE,          “项目参数

     return TYPE TABLE OF bapiret2 WITH HEADER LINE.                 “返回值

DATA:lv_num(4) TYPE VALUE 10.“行项目

*————————上传的内表————————-*

*———————————————–

*  定义屏幕输入字段,在这里我们要将本地文件

* (excel格式文件)上载到SAP系统

*———————————————–

*————————————————

*Selection Screen

*————————————————

SELECTION-SCREEN BEGIN OF BLOCK bl0 WITH FRAME TITLE text002.

PARAMETERS:p_file LIKE rlgrapfilename .

SELECTION-SCREEN END OF BLOCK bl0.

SELECTION-SCREEN FUNCTION KEY 1.                       “制作一个按钮

*————————————————-

*INITIALIZATION

*————————————————-

INITIALIZATION.

  sscrfieldsfunctxt_01 = ‘默认模板下载’.              “设置按钮的默认名字

*————————————————-

*AT SELECTION-SCREEN.

*————————————————-

*调用函数获取本地文件名

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

 

  PERFORM frm_get_file_name.

 

AT SELECTION-SCREEN.

  “下载模板到本地(模板通过SMW0上传)

  CASE sscrfieldsucomm.  “判断按钮的功能代码 当为FC01时 就是前台点击了默认模板下载按钮。

    WHEN ‘FC01’.

      PERFORM frm_excel_download.

    WHEN OTHERS.

  ENDCASE.

*———————上传文件格式检查———————-*

  IF p_file IS INITIAL.

    MESSAGE ‘请填写上传excel的路径’ TYPE ‘E’ DISPLAY LIKE ‘W’.

  ENDIF.

  PERFORM frm_file_check.

*———————上传文件格式检查———————-*

*————————————————-

*START-OF-SELECTION.

*————————————————-

* 上载数据

START-OF-SELECTION.

*————————上传数据—————————*

  PERFORM frm_upload_data.

*————————上传数据—————————*

*————————————————-

*END-OF-SELECTION.

*————————————————-

END-OF-SELECTION.

*&———————————————————————*

*& Form FRM_GET_FILE_NAME

*&———————————————————————*

* text

*———————————————————————-*

* –> p1 text

* <– p2 text

*———————————————————————-*

FORM frm_get_file_name .

  CALL FUNCTION ‘WS_FILENAME_GET’

    EXPORTING

* DEF_FILENAME = ‘ ‘

* DEF_PATH = ‘ ‘

* MASK = ‘ ‘

     mode ‘ O’

     title ‘ OPEN FILE’

   IMPORTING

     filename = p_file

* RC =

   EXCEPTIONS

     inv_winsys = 1

     no_batch = 2

     selection_cancel = 3

     selection_error = 4

   OTHERS 5.

  IF sysubrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDFORM. ” FRM_GET_FILE_NAME

*&———————————————————————*

*& Form FRM_UPLOAD_DATA

*&———————————————————————*

* text

*———————————————————————-*

* –> p1 text

* <– p2 text

*———————————————————————-*

FORM frm_upload_data .

  DATAl_filename TYPE string.

  l_filename = p_file.

 

**Excel upload

  CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’

    EXPORTING

      filename                = p_file

      i_begin_col             = 1

      i_begin_row             = 2  “从第二行开始,第一行是表头

      i_end_col               = 7                           “共7列数据

      i_end_row               = 50000 “P_ROW

    TABLES

      intern                  = i_excel

    EXCEPTIONS

      inconsistent_parameters = 1

      upload_ole              = 2

      OTHERS                  3.

  IF sysubrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

  “—–将excel中数据赋给上传用的内表中

  LOOP AT i_excel INTO wa_excel.

    CASE wa_excelcol.

      WHEN ‘001’.

        i_uploadpr_type = wa_excelvalue.

      WHEN ‘002’.

        i_uploadauto_source = wa_excelvalue.

      WHEN ‘003’.

        i_uploadmaterial = wa_excelvalue.

      WHEN ‘004’.

        i_uploadquantity = wa_excelvalue.

      WHEN ‘005’.

        i_uploaddeliv_date = wa_excelvalue.

      WHEN ‘006’.

        i_uploadplant = wa_excelvalue.

      WHEN ‘007’.

        i_uploadtrackingno = wa_excelvalue.

      WHEN OTHERS.

    ENDCASE.

    AT END OF row.

      APPEND i_upload.

CLEAR: i_upload..

    ENDAT.

    CLEARwa_excel.

 

  ENDLOOP.

*—————– 处理传上来的数据,然后调用BAPI ———————*

 

  i_uploadx[] = i_upload[].

  DELETE ADJACENT DUPLICATES FROM i_uploadx COMPARING pr_type auto_source.

  DESCRIBE TABLE i_uploadx LINES n.

  IF n <> 1.

    MESSAGE ‘请检查导入的数据,单次导入采购申请类型和货源确定请保持一直’ TYPE ‘E’ DISPLAY LIKE ‘I’.

  ENDIF.

  READ TABLE i_uploadx INDEX 1.   “读取内表数据用来确定抬头数据.

  IF sysubrc = 0.

    prheaderpr_type = i_uploadxpr_type.    “订单类型(采购)

    prheaderauto_source = i_uploadxauto_source.自动货源确定

    prheaderxpr_type = ‘X’.    “订单类型(采购)

    prheaderxauto_source = ‘X’.“自动货源确定

  ENDIF.

  lv_num = 10“重置计数器

  LOOP AT i_upload.

    “增加前导零

    CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’

      EXPORTING

        input  i_uploadmaterial

      IMPORTING

        output i_uploadmaterial.

 

    pritempreq_item     = lv_num.行项目

    pritemmaterial     = i_uploadmaterial.物料

    pritemquantity     = i_uploadquantity  . “采购申请数量

    pritemdeliv_date   = i_uploaddeliv_date. “项目交货日期

    pritemplant        = i_uploadplant     . “工厂

    pritemtrackingno   = i_uploadtrackingno. “需求跟踪号

    APPEND pritem.

    pritemxpreq_item     = lv_num.行项目

    pritemxpreq_itemx     = ‘X’.“行项目

    pritemxmaterial = ‘X’.“物料

    pritemxquantity = ‘X’“采购申请数量

    pritemxdeliv_date = ‘X’“项目交货日期

    pritemxplant = ‘X’“工厂

    pritemxtrackingno = ‘X’“需求跟踪号

    APPEND pritemx.

* 行项目号叠加

    lv_num = lv_num + 10.

    CLEAR:pritem,i_upload,pritemx.

  ENDLOOP.

 

 

*—————– 处理传上来的数据,然后调用BAPI ———————*

*————————–调用采购申请BAPI—————————-*

  CALL FUNCTION ‘BAPI_PR_CREATE’

   EXPORTING

     prheader                     = prheader

     prheaderx                    = prheaderx

*     TESTRUN                      =

   IMPORTING

     number                       number

*     PRHEADEREXP                  =

    TABLES

     return                       return

     pritem                       = pritem

     pritemx                      = pritemx.

 

  LOOP AT return WHERE type ‘E’ OR type ‘A’.

    flag = ‘X’.

    gt_resulttype ‘E’.

    CONCATENATE gt_resultmessage ‘&’ returnmessage INTO gt_resultmessage.

    APPEND gt_result.

  ENDLOOP.

  IF flag = ‘X’.

    CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.

  ELSE.

    CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’.

    WAIT UP TO SECONDS.

    gt_resulttype ‘S’.

    gt_resultmessage ‘成功创建!’.

    gt_resultnumber number.

    APPEND gt_result.

  ENDIF.

 

  LOOP AT gt_result.

    WRITE:/ gt_resulttype,采购申请单:,gt_resultnumber,gt_resultmessage.

  ENDLOOP.

 

 

 

 

ENDFORM. ” FRM_UPLOAD_DATA

 

*&———————————————————————*

*& Form FRM_FILE_CHECK

*&———————————————————————*

* text

*———————————————————————-*

FORM frm_file_check .

  DATAl_len TYPE string.

  DATAl_len1 TYPE string.

  l_len = STRLENp_file ).

  l_len = l_len  3.

  l_len1 = l_len  1.

  IF p_file+l_len(3) <> ‘xls’ AND p_file+l_len(3) <> ‘csv’ AND p_file+l_len1(4) <> ‘xlsx’

  AND p_file+l_len(3) <> ‘XLS’ AND p_file+l_len(3) <> ‘CSV’ AND p_file+l_len1(4) <> ‘XLSX’ .

    MESSAGE ‘该文件不是EXCEL文件,请选择EXCEL文件!’ TYPE ‘E’.

  ENDIF.

ENDFORM. ” FRM_FILE_CHECK

*&———————————————————————*

*&      Form  FRM_EXCEL_DOWNLOAD

*&———————————————————————*

*       text

*———————————————————————-*

*  –>  p1        text

*  <–  p2        text

*———————————————————————-*

FORM frm_excel_download .

  DATA:  lo_objdata LIKE wwwdatatab,

          lo_mime LIKE w3mime,

          lc_filename  TYPE string VALUE‘ZPR_EXCEL’ ,

          lc_fullpath  TYPE string  VALUE‘C:\’ ,

          lc_path      TYPE  string VALUE‘C:\’ ,

          ls_destination LIKE rlgrapfilename,

          ls_objnam TYPE string,

          li_rc LIKE sysubrc,

          ls_errtxt TYPE string.

  DATA:p_objid TYPE wwwdatatabobjid,

       p_dest LIKE sapbsappfad.

  p_objid = ‘ZPR_EXCEL.XLSX’“此处为EXCEL模板名称

  CALL METHOD cl_gui_frontend_services=>file_save_dialog 调用保存对话框

    EXPORTING

      default_extension    = ‘XLSX’

      default_file_name    = lc_filename

    CHANGING

      filename             = lc_filename

      path                 = lc_path

      fullpath             = lc_fullpath

    EXCEPTIONS

      cntl_error           = 1

      error_no_gui         = 2

      not_supported_by_gui = 3

      OTHERS               4.

  IF lc_fullpath = .

    MESSAGE  ‘不能打开excel’ TYPE ‘E’.

  ENDIF.

  IF sysubrc = 0.

    p_dest = lc_fullpath.

*    concatenate p_objid ‘.XLS’ into ls_objnam.

    CONDENSE ls_objnam NOGAPS.

    SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata

           WHERE srtf2 = AND relid = ‘MI’ AND objid = p_objid.

 

*检查表wwwdata中是否存在所指定的模板文件

    IF sysubrc NE OR lo_objdataobjid EQ space.如果不存在,则给出错误提示

      CONCATENATE ‘模板文件’ ls_objnam 不存在 INTO ls_errtxt.

      MESSAGE ls_errtxt TYPE ‘I’.

    ENDIF.

    ls_destination = p_dest. “保存路径

 

*如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下

    CALL FUNCTION ‘DOWNLOAD_WEB_OBJECT’

      EXPORTING

        key         lo_objdata

        destination = ls_destination

      IMPORTING

        rc          = li_rc.

    IF li_rc NE 0.

      CONCATENATE ‘模板文件:’ ls_objnam 下载失败 INTO ls_errtxt.

      MESSAGE ls_errtxt TYPE ‘E’.

    ELSE.

      MESSAGE ‘模板文件下载成功’ TYPE ‘E’ DISPLAY LIKE ‘S’.

    ENDIF.

  ENDIF.

*  CALL SCREEN ‘1000’.

ENDFORM.                    ” FRM_EXCEL_DOWNLOAD