ABAP-批导采购订单收货

*&---------------------------------------------------------------------*
*& Report ZMMR_035
*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
*& Program Name  : 采购订单批量收货
*& Date written  : 2019.12.02
*& Author's name : AQJT_ABAP2
*& Last update   : 2019.12.02
*& Program title : 采购订单批量收货
*& Project Name  : 安全集团SAP重新上线
*& Version       : Ver.1.0
*&---------------------------------------------------------------------*
*& Description   : (Incl. Related Function Area and System)
*&---------------------------------------------------------------------*
*& Change History
*&---------------------------------------------------------------------*
*& Date        | Programmer | Corr. # | Description
*&
*&
*&---------------------------------------------------------------------*
REPORT zmmr_035.

*----------------------------------------------------------------------*
*           INCLUDE                                                    *
*----------------------------------------------------------------------*
INCLUDE <list>.
INCLUDE <icon>.

*----------------------------------------------------------------------*
*           CONSTANTS                                                  *
*----------------------------------------------------------------------*
CONSTANTS :
* 常量定义
  BEGIN OF gc_con,
    dow(4TYPE c                VALUE 'FC01',     "下载按钮
    objid  TYPE wwwdatatab-objid VALUE 'ZMMR_035'"SAP WWW 网关对象名
  END OF gc_con,

* EXCEL文件行和列
  BEGIN OF gc_line,
    begin_row TYPE i     VALUE '5',     " 起始行
    begin_col TYPE i     VALUE '2',     " 起始单元格
    end_row   TYPE i     VALUE '65535'" 终了行
    end_col   TYPE i     VALUE '7',     " 终了单元格
  END OF gc_line.

*----------------------------------------------------------------------*
*           TABLES                                                    *
*----------------------------------------------------------------------*
TABLES sscrfields.

*----------------------------------------------------------------------*
*           TYPES                                                      *
*----------------------------------------------------------------------*
TYPES:
* 上传用
  BEGIN OF ty_upload,
    icon    TYPE string,     "状态
    remark  TYPE string,     "消息
    zeile   TYPE i,          "物料凭证中的项目
    filed01 TYPE string,     "项目01
    filed02 TYPE string,     "项目02
    filed03 TYPE string,     "项目03
    filed04 TYPE string,     "项目04
    filed05 TYPE string,     "项目05
    filed06 TYPE string,     "项目06
  END OF ty_upload,

* 出力用
  BEGIN OF ty_alv,
    zeile  TYPE i,            "物料凭证中的项目
    ebeln  TYPE mseg-ebeln,   "采购订单号
    ebelp  TYPE mseg-ebelp,   "采购凭证的项目编号
    budat  TYPE mkpf-budat,   "过帐日期
    menge  TYPE mseg-menge,   "数量
    lgort  TYPE mseg-lgort,   "库位
    charg  TYPE mseg-charg,   "批次
    icon   TYPE string,       "状态
    remark TYPE string,       "消息
  END OF ty_alv.

*----------------------------------------------------------------------*
*           DATA                                                       *
*----------------------------------------------------------------------*
* 全局内表定义
DATA: gt_upload      TYPE STANDARD TABLE OF ty_upload"上传
      gt_alv         TYPE STANDARD TABLE OF ty_alv,    "出力
      gt_fieldcat    TYPE slis_t_fieldcat_alv,         "ALV控制

* 全局构造定义
      gs_fieldcat    TYPE slis_fieldcat_alv,           "ALV控制
      gs_layout      TYPE slis_layout_alv,             "ALV布局
      g_function_key TYPE smp_dyntxt.                  "功能按钮

*----------------------------------------------------------------------*
*           SELECTION-SCREEN                                           *
*----------------------------------------------------------------------*
* 工具栏
SELECTION-SCREEN FUNCTION KEY 1.
* 数据导入
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-t01.
* 选择导入文件
PARAMETERS p_file   TYPE rlgrap-filename.
PARAMETERS p_zeile  TYPE mseg-zeile OBLIGATORY DEFAULT 300.
SELECTION-SCREEN END OF BLOCK blk01.

*----------------------------------------------------------------------*
*           DEFINE                                                     *
*----------------------------------------------------------------------*
*出力字段设置
DEFINE mcr_set_fieldcat.

  gs_fieldcat-tabname    = &1.  " 需要输出的内表名
  gs_fieldcat-fieldname  = &2.  " 需要输出的内表的字段名
  gs_fieldcat-seltext_l  = &3.  " 字段的描述-长字段标签
  gs_fieldcat-col_pos    = &4.  " 字段的位置
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR  gs_fieldcat.

END-OF-DEFINITION.
*----------------------------------------------------------------------*
*           INITIALIZATION                                             *
*----------------------------------------------------------------------*
INITIALIZATION.
* 工具栏添加下载模板按钮
  CLEAR g_function_key.
  g_function_key-icon_id   = icon_export.
  g_function_key-icon_text '下载模版'.
  g_function_key-quickinfo '下载模版'.
  sscrfields-functxt_01    = g_function_key.

*----------------------------------------------------------------------*
*           AT SELECTION-SCREEN                                        *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.

* 按下下载模板按钮时
  IF sy-ucomm 'FC01'.
*   模板下载校验
    PERFORM sub_download_templet.
* 按下回车或执行按钮时
  ELSE.
*   文件必输校验
    PERFORM sub_file_obligatory.
  ENDIF.

*----------------------------------------------------------------------*
*           AT SELECTION-SCREEN  ON VALUE-REQUEST                      *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* 选择文件搜索帮助
  PERFORM sub_set_file_f4 CHANGING p_file.

*----------------------------------------------------------------------*
*           START-OF-SELECTION                                         *
*----------------------------------------------------------------------*
START-OF-SELECTION.
* 批量导入数据
  PERFORM sub_upload_data.

* 检查数据
  PERFORM sub_check_data.

* alv显示
  PERFORM sub_display_data.

*&---------------------------------------------------------------------*
*&       Form SUB_DOWNLOAD_TEMPLET
*&---------------------------------------------------------------------*
*&       模板下载
*&---------------------------------------------------------------------*
FORM sub_download_templet.

* 局部变量定义
  DATA:lo_objdata     TYPE wwwdatatab,             "表 WWWDATA 的内容
       lo_mime        TYPE w3mime,                 "MIME 数据容器
       lc_fullpath    TYPE string VALUE 'c:\',     "文件路径
       lc_path        TYPE string VALUE 'c:\',     "文件路径
       lc_name        TYPE string,                 "文件名称
       ls_destination TYPE rlgrap-filename,        "文件名
       ls_objnam      TYPE string,                 "SAP WWW 网关对象名
       l_rc           TYPE sy-subrc,               "返回码
       ls_errtxt      TYPE string,                 "错误消息
       l_dest         TYPE sapb-sappfad.           "SAP 存档链接文件路径

* 模板下载路径名
  lc_name TEXT-001.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title              '模板下载'
      default_extension         'xlsx'
      default_file_name         = lc_name
    CHANGING
      filename                  = lc_name
      path                      = lc_path
      fullpath                  = lc_fullpath
    EXCEPTIONS
      cntl_error                1
      error_no_gui              2
      not_supported_by_gui      3
      invalid_default_file_name 4
      OTHERS                    5.
* 没有选择路径
  IF lc_fullpath ''.
    MESSAGE  '请选择正确的路径!' TYPE 'E'.
  ELSE.
*-  路径名
    l_dest = lc_fullpath.

    SELECT SINGLE
           relid                   "IMPORT/EXPORT 记录中的区域
           objid                   "SAP WWW 网关对象名
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF lo_objdata
     WHERE srtf2 0
      AND relid 'MI'
      AND objid = gc_con-objid.

    IF sy-subrc <> OR lo_objdata-objid IS INITIAL.
      CONCATENATE '模板文件:' gc_con-objid
                  '不存在,请用TCODE:SMW0进行加载' INTO ls_errtxt.
      MESSAGE e000(00WITH ls_errtxt.
    ENDIF.

    ls_destination = l_dest.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lo_objdata
        destination = ls_destination
      IMPORTING
        rc          = l_rc.
    IF l_rc <> 0.
      MESSAGE '模板下载失败' TYPE 'E'.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_FILE_OBLIGATORY
*&---------------------------------------------------------------------*
*       文件必输校验
*----------------------------------------------------------------------*
FORM sub_file_obligatory .
* 文件必输校验  
IF p_file IS INITIAL.    
MESSAGE '请选择导入的文件' TYPE 'E'.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_SET_FILE_F4
*&---------------------------------------------------------------------*
*       选择导入文件的检索帮助
*----------------------------------------------------------------------*
*      -->O_FILE  文件路径
*----------------------------------------------------------------------*
FORM sub_set_file_f4 CHANGING o_file TYPE rlgrap-filename.
* 局部变量定义  
DATA l_filename TYPE rlgrap-filename.    "文件名  
CLEAR l_filename.
* 选择文件搜索帮助  
CALL FUNCTION 'WS_FILENAME_GET'    
EXPORTING      def_path         
= o_file      
mask             ',*.xlsx,*.XLSX,*.xls,*.XLS.'      
mode             '0'      
title            TEXT-999    
IMPORTING      filename         
= l_filename    
EXCEPTIONS      inv_winsys       
1      no_batch         
2      selection_cancel 
3      selection_error  
4      
OTHERS           5.
* 如果选择了文件  
IF sy-subrc AND l_filename IS NOT INITIAL.    o_file 
= l_filename.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       文件上传
*----------------------------------------------------------------------*
FORM sub_upload_data .
* 局部变量的定义  
DATA: lt_excel    TYPE TABLE OF alsmex_tabline,  "具有 Excel 数据的表行        ls_excel    
TYPE alsmex_tabline,           "具有 Excel 数据的表行        ls_upload   
TYPE ty_upload,                "上传构造        l_begin_row 
TYPE i,                        "起始行        l_end_row   
TYPE i,                        "终了行        l_begin_col 
TYPE i,                        "起始列        l_end_col   
TYPE i,                        "终了列        l_index     
TYPE i,                        "项目位置        l_line      
TYPE i,                        "物料凭证中的项目        l_zeile     
TYPE i.                        "物料凭证中的项目  

CLEAR gt_upload.
* 选择文件后做后续处理  
CHECK p_file IS NOT INITIAL.

* 把文件的数据变成内表  
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'    
EXPORTING      filename                
= p_file      i_begin_col             
= gc_line-begin_col      i_begin_row             
= gc_line-begin_row      i_end_col               
= gc_line-end_col      i_end_row               
= gc_line-end_row    
TABLES      intern                  
= lt_excel    
EXCEPTIONS      inconsistent_parameters 
1      upload_ole              
2      
OTHERS                  3.

* 处理内表数据  
CLEAR ls_excel.  l_zeile 
0.  l_line  
1.  
LOOP AT lt_excel INTO ls_excel.
*    IF ls_excel-row = 1.
*      CONTINUE.
*    ENDIF.    l_index 

= ls_excel-col + 3.    
ASSIGN COMPONENT l_index OF STRUCTURE ls_upload TO FIELD-SYMBOL(<f>).    

TRY.        
MOVE ls_excel-value TO <f>.      
CATCH cx_root INTO DATA(cx).        ls_upload
-remark = cx->get_text).        ls_upload
-icon   = icon_led_red.    
ENDTRY.    

AT END OF row.      
IF l_line > p_zeile.        l_line 
1.        l_zeile 
= l_zeile + 1.      
ELSE.        l_line  
= l_line + 1.      
ENDIF.      ls_upload
-zeile = l_zeile.      ls_upload
-icon  = icon_light_out.      
APPEND ls_upload TO gt_upload.      
CLEAR ls_upload.    
ENDAT.  
ENDLOOP.

* 上传数据不存在  
IF gt_upload IS INITIAL.    
MESSAGE TEXT-m03 TYPE 'S' DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_CHECK_DATA
*&---------------------------------------------------------------------*
*&      检查数据
*&---------------------------------------------------------------------*
FORM sub_check_data .  

DATA: ls_upload TYPE ty_upload,  "上传数据        ls_alv    
TYPE ty_alv.     "预览画面数据  

LOOP AT gt_upload INTO ls_upload.    

CLEAR ls_alv.

*   检查前的保存处理    
PERFORM sub_save_data USING    ls_upload                          
CHANGING ls_alv.

*   过帐日期    
PERFORM sub_check_bedat USING    ls_upload-filed01                            
CHANGING ls_alv.

*   采购订单    
PERFORM sub_check_ebeln USING    ls_upload-filed02                                     ls_upload
-filed03                            
CHANGING ls_alv.

*   数量    
PERFORM sub_check_menge USING    ls_upload-filed04                            
CHANGING ls_alv.    

CHECK ls_alv-remark IS INITIAL.    

APPEND ls_alv TO gt_alv.  

ENDLOOP.  

SORT gt_alv BY ebeln ASCENDING                 ebelp 
ASCENDING.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_SAVE_DATA
*&---------------------------------------------------------------------*
*       检查前的保存处理
*----------------------------------------------------------------------*
*      -->IS_UPLOAD  上传数据
*      <--ES_ALV     预览画面数据
*----------------------------------------------------------------------*
FORM sub_save_data  USING    is_upload TYPE ty_upload                    
CHANGING es_alv    TYPE ty_alv.  es_alv

-icon    = is_upload-icon.  es_alv
-remark  = is_upload-remark.  es_alv
-zeile   = is_upload-zeile.  es_alv
-budat   = is_upload-filed01.  es_alv
-ebeln   = is_upload-filed02.  es_alv
-ebelp   = is_upload-filed03.  es_alv
-menge   = is_upload-filed04.  es_alv
-lgort   = is_upload-filed05.  es_alv
-charg   = is_upload-filed06.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_BUDAT
*&---------------------------------------------------------------------*
*       过帐日期
*----------------------------------------------------------------------*
*      -->IV_BUDAT  过帐日期
*      <--ES_ALV    预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_bedat  USING    iv_budat  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_budat                                   
TEXT-c04                          
CHANGING es_alv.  

CHECK es_alv-icon IS INITIAL.

* 日期检查  
PERFORM sub_check_date USING    es_alv-budat                                  
TEXT-c04                         
CHANGING es_alv.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_INPUT
*&---------------------------------------------------------------------*
*       必输入检查
*----------------------------------------------------------------------*
*      -->IV_FILED 项目ID
*      -->IV_TEXT  项目文本
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_input  USING    iv_filed  TYPE string                               iv_text   
TYPE c                      
CHANGING es_alv    TYPE ty_alv.

* 项目没有输入时  
IF iv_filed IS INITIAL.    es_alv
-icon = icon_led_red.    
MESSAGE e083(meWITH iv_text INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_DATE
*&---------------------------------------------------------------------*
*       日期检查
*----------------------------------------------------------------------*
*      -->IV_FILED 项目ID
*      -->IV_TEXT  项目文本
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_date  USING    iv_filed  TYPE d                              iv_text   
TYPE c                     
CHANGING es_alv    TYPE ty_alv.

* 日期检查  
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'    
EXPORTING      
date                      = iv_filed    
EXCEPTIONS      plausibility_check_failed 
1      
OTHERS                    2.

* 失败时  
IF sy-subrc <> 0.    es_alv
-icon = icon_led_red.    
MESSAGE e540(keWITH iv_filed INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_EBELN
*&---------------------------------------------------------------------*
*       采购订单检查
*----------------------------------------------------------------------*
*      -->IV_EBELN 采购订单号
*      -->IV_EBELP 采购凭证的项目编号
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_ebeln  USING    iv_ebeln  TYPE string                               iv_ebelp  
TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_ebeln                                   
TEXT-c05                          
CHANGING es_alv.  

CHECK es_alv-icon IS INITIAL.

* 必输入检查  
PERFORM sub_check_input USING    iv_ebelp                                   
TEXT-c06                          
CHANGING es_alv.  

CHECK es_alv-icon IS INITIAL.

* 存在检查  
SELECT SINGLE COUNT(*)    
FROM ekpo   
WHERE ebeln = es_alv-ebeln     
AND ebelp = es_alv-ebelp.

* 取得失败时  
IF sy-subrc <> 0.    es_alv
-icon = icon_led_red.    
MESSAGE e019(06WITH es_alv-ebeln INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_MENGE
*&---------------------------------------------------------------------*
*       数量
*----------------------------------------------------------------------*
*      -->IV_MENGE 数量
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_menge  USING    iv_menge  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_menge                                   
TEXT-c07                          
CHANGING es_alv.  

CHECK es_alv-remark IS INITIAL.

* 数值检查  
PERFORM sub_check_number USING    iv_menge                                    
TEXT-c07                           
CHANGING es_alv-menge                                    es_alv
.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_NUMBER
*&---------------------------------------------------------------------*
*       数值检查
*----------------------------------------------------------------------*
*      -->IV_FILED  项目ID
*      -->IV_TEXT   项目文本
*      <--ES_FILED  项目ID
*      <--ES_ALV    预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_number  USING   iv_filed  TYPE string                               iv_text   
TYPE c                      
CHANGING ev_filed  TYPE any                               es_alv    
TYPE ty_alv.  
DATA: lv_filed(30TYPE c.

* 数值检查  
CALL FUNCTION 'CATS_NUMERIC_INPUT_CHECK'    
EXPORTING      
input      = iv_filed      internal   
= abap_on    
IMPORTING      
output     = lv_filed    
EXCEPTIONS      no_numeric 
1      
OTHERS     2.

* 失败时  
IF sy-subrc <> 0.    es_alv
-icon = icon_led_red.    
MESSAGE e326(ckWITH ev_filed INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ELSE.    ev_filed 
= lv_filed.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_DISPLAY_DATA
*&---------------------------------------------------------------------*
*&      alv显示
*&---------------------------------------------------------------------*
FORM sub_display_data .

* 设置ALV出力字段  
PERFORM sub_set_fieldcat.

* 设置ALV布局  
PERFORM sub_set_layout.

* ALV出力  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'    
EXPORTING      i_callback_program       
= sy-repid      i_callback_pf_status_set 
'SUB_SET_PF_STATUS'      i_callback_user_command  
'SUB_USER_COMMAND'      is_layout                
= gs_layout      it_fieldcat              
= gt_fieldcat    
TABLES      t_outtab                 
= gt_alv    
EXCEPTIONS      program_error            
1      
OTHERS                   2.

* 失败时  
IF sy-subrc <> 0.
*   输出消息    
MESSAGE TEXT-m01 TYPE 'S' DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_SET_FIELDCAT
*&---------------------------------------------------------------------*
*&      设置ALV出力字段
*&---------------------------------------------------------------------*
FORM sub_set_fieldcat .  mcr_set_fieldcat 

'GT_ALV' 'ICON'   TEXT-c01 01.  mcr_set_fieldcat 
'GT_ALV' 'REMARK' TEXT-c02 02.  mcr_set_fieldcat 
'GT_ALV' 'BUDAT'  TEXT-c04 04.  mcr_set_fieldcat 
'GT_ALV' 'EBELN'  TEXT-c05 05.  mcr_set_fieldcat 
'GT_ALV' 'EBELP'  TEXT-c06 06.  mcr_set_fieldcat 
'GT_ALV' 'MENGE'  TEXT-c07 07.  mcr_set_fieldcat 
'GT_ALV' 'LGORT'  TEXT-c08 08.  mcr_set_fieldcat 
'GT_ALV' 'CHARG'  TEXT-c09 09.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_SET_LAYOUT
*&---------------------------------------------------------------------*
*&      设置ALV布局
*&---------------------------------------------------------------------*
FORM sub_set_layout .  gs_layout

-zebra = abap_on.  gs_layout
-colwidth_optimize = abap_on.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_SET_PF_STATUS
*&---------------------------------------------------------------------*
*&      设置菜单栏
*&---------------------------------------------------------------------*
*&      --> IT_EXTAB 菜单栏按钮
*&---------------------------------------------------------------------*
FORM sub_set_pf_status USING it_extab TYPE slis_t_extab.  

DATA: ls_extab TYPE slis_extab.  

"copy 程序SAPLKKBL的GUI状态STANDARD_FULLSCREEN  
SET PF-STATUS 'STANDARD_ALV1' EXCLUDING it_extab.
* 标题栏
*  SET TITLEBAR 'T01'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  SUB_USER_COMMAND
*&---------------------------------------------------------------------*
*&      --> IV_UCOMM    按钮
*&      --> IS_SELFIELD 状态
*&---------------------------------------------------------------------*
FORM sub_user_command USING iv_ucomm    TYPE sy-ucomm                            is_selfield 
TYPE slis_selfield.

* 按下导入按钮  
IF iv_ucomm 'IMPORT'.

*   导入前检查    
PERFORM sub_check_imp.

*   导入执行    
PERFORM sub_import_data.    is_selfield

-refresh = abap_on.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_CHECK_IMP
*&---------------------------------------------------------------------*
*&      导入前检查
*&---------------------------------------------------------------------*
FORM sub_check_imp.  

READ TABLE gt_alv TRANSPORTING NO FIELDS       
WITH KEY icon = icon_led_red.

* 读取成功  
IF sy-subrc 0.    
MESSAGE TEXT-m02 TYPE 'E'.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_IMPORT_DATA
*&---------------------------------------------------------------------*
*&      数据导入处理
*&---------------------------------------------------------------------*
FORM sub_import_data.  

DATA: ls_alv              TYPE ty_alv,        ls_alv_tmp          
TYPE ty_alv,        ls_alv_tmp2         
TYPE ty_alv,        ls_goodsmvt_header  
TYPE bapi2017_gm_head_01,        ls_goodsmvt_code    
TYPE bapi2017_gm_code,        ls_goodsmvt_headret 
TYPE bapi2017_gm_head_ret,        ls_goodsmvt_item    
TYPE bapi2017_gm_item_create,        lt_goodsmvt_item    
TYPE TABLE OF bapi2017_gm_item_create,        lt_return           
TYPE TABLE OF bapiret2,        ls_return           
TYPE bapiret2,        lv_matdoc           
TYPE bapi2017_gm_head_ret-mat_doc,        lt_alv              
TYPE TABLE OF ty_alv,        lv_index            
TYPE i,        lv_index_f          
TYPE i,        lv_index_t          
TYPE i,        ls_mcha             
TYPE mcha,        lv_lgort            
TYPE mchb-lgort,        ls_clbatch          
TYPE clbatch,        lt_clbatch          
TYPE TABLE OF clbatch,        lv_charg            
TYPE mseg-charg.  

SORT gt_alv BY zeile ASCENDING                 ebeln 
ASCENDING                 ebelp 
ASCENDING.  lt_alv 

= gt_alv.  
CLEAR gt_alv.  

LOOP AT lt_alv INTO ls_alv_tmp WHERE icon = icon_light_out.    ls_alv 

= ls_alv_tmp.    

AT NEW ebeln.      
"--释放资源      
CLEAR: ls_goodsmvt_header,             ls_goodsmvt_code
,             lt_goodsmvt_item
,             lt_return
.

*     添加抬头信息      ls_goodsmvt_header
-pstng_date = ls_alv-budat.      ls_goodsmvt_header
-doc_date   = sy-datum.      ls_goodsmvt_header
-pr_uname   = sy-uname.      ls_goodsmvt_code
-gm_code      '01'.      lv_index 
= lv_index_t.    
ENDAT.    lv_index_t 

= lv_index_t + 1.

*   添加行项目信息    
CLEAR ls_goodsmvt_item.    ls_goodsmvt_item
-po_number    = ls_alv-ebeln.    ls_goodsmvt_item
-po_item      = ls_alv-ebelp.    ls_goodsmvt_item
-entry_qnt    = ls_alv-menge.    ls_goodsmvt_item
-stge_loc     = ls_alv-lgort.    ls_goodsmvt_item
-move_type    '101'.    ls_goodsmvt_item
-mvt_ind      'B'.    
IF ls_alv-charg IS NOT INITIAL.      ls_goodsmvt_item
-batch      = ls_alv-charg.    
ENDIF.    
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.    

APPEND ls_alv TO gt_alv.    
"---------------------------------------------------    
"创建物料凭证    
"---------------------------------------------------    
AT END OF ebeln.      

CLEAR:ls_goodsmvt_headret, lv_matdoc, lt_return[].

*     调用BAPI      
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'        
EXPORTING          goodsmvt_header  
= ls_goodsmvt_header          goodsmvt_code    
= ls_goodsmvt_code        
IMPORTING          goodsmvt_headret 
= ls_goodsmvt_headret          materialdocument 
= lv_matdoc        
TABLES          goodsmvt_item    
= lt_goodsmvt_item          
return           = lt_return.

*     成功的时候      
IF lv_matdoc IS NOT INITIAL.        ls_alv
-icon   = icon_led_green.        
CONCATENATE TEXT-m04 lv_matdoc TEXT-m05 INTO ls_alv-remark.        
MODIFY gt_alv FROM ls_alv  TRANSPORTING icon remark WHERE icon = icon_light_out.        
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'          
EXPORTING            
wait = abap_on.      
ELSE.
*       错误消息        
LOOP AT lt_return INTO ls_return                          
WHERE type 'E' OR type 'A' ).          ls_alv
-icon   = icon_led_red.          ls_alv
-remark = ls_return-message.          lv_index_f 
= lv_index + ls_return-row.          
MODIFY gt_alv INDEX lv_index_f FROM ls_alv  TRANSPORTING icon remark.        
ENDLOOP.        ls_alv

-icon   = icon_led_red.        ls_alv
-remark TEXT-m06.        
MODIFY gt_alv FROM ls_alv  TRANSPORTING icon remark WHERE icon = icon_light_out.        
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      
ENDIF.
*      CLEAR lv_index.
*      LOOP AT lt_alv INTO ls_alv_tmp2.
*        lv_index = lv_index + 1.
**       成功的时候
*        IF lv_matdoc IS NOT INITIAL.
*
*          IF ls_alv_tmp2-grdate IS NOT INITIAL
*          OR ls_alv_tmp2-vendor IS NOT INITIAL
*          OR ls_alv_tmp2-zwzpp  IS NOT INITIAL
*          OR ls_alv_tmp2-zbc    IS NOT INITIAL.
*            CLEAR: ls_mcha,
*                   lt_clbatch,
*                   lt_return.
*
**           修改批次特性
*            ls_mcha-matnr = ls_alv_tmp2-matnr.
*            ls_mcha-werks = ls_alv_tmp2-werks.
*            ls_mcha-charg = ls_alv_tmp2-charg.
*            ls_mcha-lifnr = ls_alv_tmp2-vendor.
*            ls_mcha-lwedt = ls_alv_tmp2-grdate.
*            lv_lgort      = ls_alv_tmp2-lgort.
*
**           收货日期
*            IF ls_alv-grdate IS NOT INITIAL.
*              CLEAR ls_clbatch.
*              ls_clbatch-atnam = 'ZMM_GRDATE'.
*              ls_clbatch-atwtb = ls_alv-grdate.
*              APPEND ls_clbatch TO lt_clbatch.
*            ENDIF.
*
**           供应商
*            IF ls_alv-vendor IS NOT INITIAL.
*              CLEAR ls_clbatch.
*              ls_clbatch-atnam = 'ZMM_VENDOR'.
*              ls_clbatch-atwtb = ls_alv-vendor.
*              APPEND ls_clbatch TO lt_clbatch.
*            ENDIF.
*
**           品牌
*            IF ls_alv-zwzpp IS NOT INITIAL.
*              CLEAR ls_clbatch.
*              ls_clbatch-atnam = 'ZMM_ZWZPP'.
*              ls_clbatch-atwtb = ls_alv-zwzpp.
*              APPEND ls_clbatch TO lt_clbatch.
*            ENDIF.
*
**           版次
*            IF ls_alv-zbc IS NOT INITIAL.
*              CLEAR ls_clbatch.
*              ls_clbatch-atnam = 'ZMM_ZBC'.
*              ls_clbatch-atwtb = ls_alv-zbc.
*              APPEND ls_clbatch TO lt_clbatch.
*            ENDIF.
*
*            CALL FUNCTION 'VB_CREATE_BATCH'
*              EXPORTING
*                ymcha                       = ls_mcha
*                new_lgort                   = lv_lgort
*                kzcla                       = '1'
*                xkcfc                       = 'X'
*              TABLES
*                char_of_batch               = lt_clbatch
*                return                      = lt_return
*              EXCEPTIONS
*                no_material                 = 1
*                no_batch                    = 2
*                no_plant                    = 3
*                material_not_found          = 4
*                plant_not_found             = 5
*                lock_on_material            = 6
*                lock_on_plant               = 7
*                lock_on_batch               = 8
*                lock_system_error           = 9
*                no_authority                = 10
*                batch_not_exist             = 11
*                no_class                    = 12
*                error_in_classification     = 13
*                error_in_valuation_change   = 14
*                error_in_status_change      = 15
*                region_of_origin_not_found  = 16
*                country_of_origin_not_found = 17
*                OTHERS                      = 18.
*
**           成功时
*            IF sy-subrc = 0.
*              ls_alv_tmp2-icon   = icon_led_green.
*              CONCATENATE TEXT-c20 lv_matdoc '被正确的创建' INTO ls_alv_tmp2-remark.
*              APPEND ls_alv_tmp2 TO gt_alv2.
**           失败时
*            ELSE.
**             错误消息
*              LOOP AT lt_return INTO ls_return
*                                WHERE ( type = 'E' OR type = 'A' )
*                                  AND row = lv_index.
*                ls_alv_tmp2-icon   = icon_led_red.
*                ls_alv_tmp2-remark = ls_return-message.
*                APPEND ls_alv_tmp2 TO gt_alv2.
*              ENDLOOP.
*
*              IF sy-subrc <> 0.
**               错误消息
*                LOOP AT lt_return INTO ls_return
*                                  WHERE ( type = 'E' OR type = 'A' )
*                                    AND row = 0.
*                  ls_alv_tmp2-icon   = icon_led_red.
*                  ls_alv_tmp2-remark = ls_return-message.
*                  APPEND ls_alv_tmp2 TO gt_alv2.
*                ENDLOOP.
*              ENDIF.
*
*              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*            ENDIF.
*          ELSE.
*            ls_alv_tmp2-icon   = icon_led_green.
*            CONCATENATE TEXT-c20 lv_matdoc '被正确的创建' INTO ls_alv_tmp2-remark.
*            APPEND ls_alv_tmp2 TO gt_alv2.
*          ENDIF.
*
*          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*            EXPORTING
*              wait = abap_on.
*        ELSE.
**         错误消息
*          LOOP AT lt_return INTO ls_return
*                            WHERE ( type = 'E' OR type = 'A' )
*                              AND row = lv_index.
*            ls_alv_tmp2-icon   = icon_led_red.
*            ls_alv_tmp2-remark = ls_return-message.
*            APPEND ls_alv_tmp2 TO gt_alv2.
*          ENDLOOP.
*
*          IF sy-subrc <> 0.
**           错误消息
*            LOOP AT lt_return INTO ls_return
*                              WHERE ( type = 'E' OR type = 'A' )
*                                AND row = 0.
*              ls_alv_tmp2-icon   = icon_led_red.
*              ls_alv_tmp2-remark = ls_return-message.
*              APPEND ls_alv_tmp2 TO gt_alv2.
*            ENDLOOP.
*          ENDIF.
*
*          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*        ENDIF.
*      ENDLOOP.    
ENDAT.  
ENDLOOP.  

IF sy-subrc <> 0.    
MESSAGE TEXT-m04 TYPE 'E'.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_SET_PF_STATUS2
*&---------------------------------------------------------------------*
*&      设置菜单栏
*&---------------------------------------------------------------------*
*      -->IT_EXTAB 按钮
*----------------------------------------------------------------------*
*FORM sub_set_pf_status2 USING it_extab TYPE slis_t_extab.
*
*  DATA: ls_extab TYPE slis_extab.
*  "copy 程序SAPLKKBL的GUI状态STANDARD_FULLSCREEN
*  ls_extab-fcode = 'IMPORT'.
*  APPEND ls_extab TO it_extab.
*  SET PF-STATUS 'STANDARD' EXCLUDING it_extab.
** 标题栏
*  SET TITLEBAR 'T02'.
*ENDFORM.

 

posted @ 2021-12-17 11:26  東東東東  阅读(147)  评论(0编辑  收藏  举报