[MM]采购申请批导代码

 

需要注意的地方:

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

   

   

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:n TYPE i.           “内表行数

   

TYPES:BEGIN OF ty_result,

      type  TYPE bapi_mtype,  “消息类型

      material(18),

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

      flag(1),

      number TYPE bapimereqheader-preq_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 bapimereqheader-preq_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 n VALUE 10.“行项目

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

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

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

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

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

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

*Selection Screen

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

SELECTION-SCREEN BEGIN OF BLOCK bl0 WITH FRAME TITLE text-002.

PARAMETERS:p_file LIKE rlgrap-filename .

SELECTION-SCREEN END OF BLOCK bl0.

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

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

*INITIALIZATION

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

INITIALIZATION.

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

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

*AT SELECTION-SCREEN.

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

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

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

   

  PERFORM frm_get_file_name.

   

AT SELECTION-SCREEN.

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

  CASE sscrfields-ucomm.  “判断按钮的功能代码 当为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 sy-subrc <> 0.

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

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

  ENDIF.

ENDFORM. ” FRM_GET_FILE_NAME

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

*& Form FRM_UPLOAD_DATA

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

* text

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

* –> p1 text

* <– p2 text

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

FORM frm_upload_data .

  DATA: l_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 sy-subrc <> 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_excel-col.

      WHEN ‘001’.

        i_upload-pr_type = wa_excel-value.

      WHEN ‘002’.

        i_upload-auto_source = wa_excel-value.

      WHEN ‘003’.

        i_upload-material = wa_excel-value.

      WHEN ‘004’.

        i_upload-quantity = wa_excel-value.

      WHEN ‘005’.

        i_upload-deliv_date = wa_excel-value.

      WHEN ‘006’.

        i_upload-plant = wa_excel-value.

      WHEN ‘007’.

        i_upload-trackingno = wa_excel-value.

      WHEN OTHERS.

    ENDCASE.

    AT END OF row.

      APPEND i_upload.

CLEAR: i_upload..

    ENDAT.

    CLEAR: wa_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 sy-subrc = 0.

    prheader-pr_type = i_uploadx-pr_type.    “订单类型(采购)

    prheader-auto_source = i_uploadx-auto_source.“自动货源确定

    prheaderx-pr_type = ‘X’.    “订单类型(采购)

    prheaderx-auto_source = ‘X’.“自动货源确定

  ENDIF.

  lv_num = 10. “重置计数器

  LOOP AT i_upload.

    “增加前导零

    CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’

      EXPORTING

        input  = i_upload-material

      IMPORTING

        output = i_upload-material.

   

    pritem-preq_item     = lv_num.“行项目

    pritem-material     = i_upload-material.“物料

    pritem-quantity     = i_upload-quantity  . “采购申请数量

    pritem-deliv_date   = i_upload-deliv_date. “项目交货日期

    pritem-plant        = i_upload-plant     . “工厂

    pritem-trackingno   = i_upload-trackingno. “需求跟踪号

    APPEND pritem.

    pritemx-preq_item     = lv_num.“行项目

    pritemx-preq_itemx     = ‘X’.“行项目

    pritemx-material = ‘X’.“物料

    pritemx-quantity = ‘X’. “采购申请数量

    pritemx-deliv_date = ‘X’. “项目交货日期

    pritemx-plant = ‘X’. “工厂

    pritemx-trackingno = ‘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_result-type = ‘E’.

    CONCATENATE gt_result-message ‘&’ return-message INTO gt_result-message.

    APPEND gt_result.

  ENDLOOP.

  IF flag = ‘X’.

    CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.

  ELSE.

    CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’.

    WAIT UP TO 1 SECONDS.

    gt_result-type = ‘S’.

    gt_result-message = ‘成功创建!’.

    gt_result-number = number.

    APPEND gt_result.

  ENDIF.

   

  LOOP AT gt_result.

    WRITE:/ gt_result-type,’采购申请单:’,gt_result-number,gt_result-message.

  ENDLOOP.

   

   

   

   

ENDFORM. ” FRM_UPLOAD_DATA

   

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

*& Form FRM_FILE_CHECK

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

* text

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

FORM frm_file_check .

  DATA: l_len TYPE string.

  DATA: l_len1 TYPE string.

  l_len = STRLEN( p_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 rlgrap-filename,

          ls_objnam TYPE string,

          li_rc LIKE sy-subrc,

          ls_errtxt TYPE string.

  DATA:p_objid TYPE wwwdatatab-objid,

       p_dest LIKE sapb-sappfad.

  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 sy-subrc = 0.

    p_dest = lc_fullpath.

*    concatenate p_objid ‘.XLS’ into ls_objnam.

    CONDENSE ls_objnam NO-GAPS.

    SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata

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

   

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

    IF sy-subrc NE 0 OR lo_objdata-objid 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 

面向对象

[SAP选择屏幕]设置文本高亮

2019-6-6 15:45:21

知识点

soamanager实在打不开的解决办法

2020-7-3 10:22:48

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索