ABAP-批导期初库存

*&---------------------------------------------------------------------*
*& Report ZMMR_031
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmmr_031.

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

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

* EXCEL文件行和列
  BEGIN OF gc_line,
    begin_row TYPE i     VALUE '4',     "起始行
    begin_col TYPE i     VALUE '2',     "起始单元格
    end_row   TYPE i     VALUE '65535'"终了行
    end_col   TYPE i     VALUE '18',    "终了单元格
  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
    filed07 TYPE string,     "项目07
    filed08 TYPE string,     "项目08
    filed09 TYPE string,     "项目09
    filed10 TYPE string,     "项目10
    filed11 TYPE string,     "项目11
    filed12 TYPE string,     "项目12
    filed13 TYPE string,     "项目13
    filed14 TYPE string,     "项目14
    filed15 TYPE string,     "项目15
    filed16 TYPE string,     "项目16
    filed17 TYPE string,     "项目17
  END OF ty_upload,

* 出力用
  BEGIN OF ty_alv,
    zeile  TYPE i,            "物料凭证中的项目
    budat  TYPE mkpf-budat,   "过帐日期
    werks  TYPE mseg-werks,   "工厂
    lgort  TYPE mseg-lgort,   "库位
    matnr  TYPE mseg-matnr,   "物料编码
    maktx  TYPE makt-maktx,   "物料描述
    menge  TYPE mseg-menge,   "数量
    meins  TYPE mseg-meins,   "计量单位
    exbwr  TYPE mseg-exbwr,   "库存金额
    bwart  TYPE mseg-bwart,   "移动类型
*    sobkz  TYPE mseg-sobkz,   "特殊库存
*    posid  TYPE prps-posid,   "WBS 元素
    icon   TYPE string,       "状态
    remark TYPE string,       "消息
    number TYPE i,            "序号
  END OF ty_alv.

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

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

DATA: gv_title TYPE cua_tit_tx,
      gv_lines TYPE i.
*----------------------------------------------------------------------*
*           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-t03.
  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 
1.  l_line  
1.  
LOOP AT lt_excel INTO ls_excel.    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_red_light.    
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_yellow_light.      
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-filed02                            
CHANGING ls_alv.

*   工厂    
PERFORM sub_check_werks USING    ls_upload-filed03                            
CHANGING ls_alv.

*   库位    
PERFORM sub_check_lgort USING    ls_upload-filed04                            
CHANGING ls_alv.

*   物料编码    
PERFORM sub_check_matnr USING    ls_upload-filed05                            
CHANGING ls_alv.

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

*   库存金额    
IF ls_upload-filed10 <> 'Z91'.      
PERFORM sub_check_exbwr USING    ls_upload-filed09                              
CHANGING ls_alv.    
ENDIF.

*   移动类型    
PERFORM sub_check_bwart USING    ls_upload-filed10                            
CHANGING ls_alv.    

CHECK ls_alv-remark IS INITIAL.    

APPEND ls_alv TO gt_alv.  

ENDLOOP.  

DESCRIBE TABLE gt_alv LINES gv_lines.

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
-number  = is_upload-filed01.  es_alv
-budat   = is_upload-filed02.  es_alv
-werks   = is_upload-filed03.  es_alv
-lgort   = is_upload-filed04.  es_alv
-matnr   = is_upload-filed05.  es_alv
-maktx   = is_upload-filed06.  es_alv
-menge   = is_upload-filed07.  es_alv
-meins   = is_upload-filed08.  es_alv
-exbwr   = is_upload-filed09.  es_alv
-bwart   = is_upload-filed10.
*  es_alv-sobkz   = is_upload-filed11.
*  es_alv-posid   = is_upload-filed12.  
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'    
EXPORTING      
input        = es_alv-matnr    
IMPORTING      
output       = es_alv-matnr    
EXCEPTIONS      length_error 
1      
OTHERS       2.  
IF sy-subrc <> 0.
*   Implement suitable error handling here  
ENDIF.

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_red_light.    
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_red_light.    
CONCATENATE iv_text iv_filed TEXT-m04 INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_WERKS
*&---------------------------------------------------------------------*
*       工厂
*----------------------------------------------------------------------*
*      -->IV_WERKS 工厂
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_werks  USING    iv_werks  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 局部变量定义  
DATA: lv_werks TYPE ekpo-werks"工厂

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

CHECK es_alv-icon IS INITIAL.

* 存在检查  
SELECT SINGLE werks    
FROM t001w    
INTO lv_werks   
WHERE werks = es_alv-werks.

* 取得失败时  
IF sy-subrc <> 0.    es_alv
-icon = icon_red_light.    
MESSAGE e003(meWITH es_alv-werks INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_LGORT
*&---------------------------------------------------------------------*
*       库位
*----------------------------------------------------------------------*
*      -->IV_LGORT 库位
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_lgort  USING    iv_lgort  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 局部变量定义  
DATA: lv_lgort TYPE ekpo-lgort"库位

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

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_MATNR
*&---------------------------------------------------------------------*
*       物料编码
*----------------------------------------------------------------------*
*      -->IV_MATNR 物料编码
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_matnr  USING    iv_matnr  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 局部变量定义  
DATA: lv_matnr TYPE ekpo-matnr"物料编码

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

CHECK es_alv-remark IS INITIAL.

* 存在检查  
SELECT SINGLE matnr    
FROM mara    
INTO lv_matnr   
WHERE matnr = es_alv-matnr.

* 取得失败时  
IF sy-subrc <> 0.    es_alv
-icon = icon_red_light.    
MESSAGE e706(12WITH es_alv-matnr INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.  

CHECK es_alv-remark IS INITIAL.  

SELECT SINGLE matnr    
FROM marc    
INTO lv_matnr   
WHERE matnr = es_alv-matnr     
AND werks = es_alv-werks.

* 取得失败时  
IF sy-subrc <> 0.    es_alv
-icon = icon_red_light.    
MESSAGE e200(m3WITH es_alv-matnr es_alv-werks INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ENDIF.  

CHECK es_alv-remark IS INITIAL.

* 物料描述的取得  
SELECT SINGLE maktx    
FROM makt    
INTO es_alv-maktx   
WHERE matnr = es_alv-matnr     
AND spras = sy-langu.

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-c09                          
CHANGING es_alv.  

CHECK es_alv-remark IS INITIAL.

* 数值检查  
PERFORM sub_check_number USING    iv_menge                                    
TEXT-c09                           
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_red_light.    
MESSAGE e326(ckWITH ev_filed INTO es_alv-remark.    
APPEND es_alv TO gt_alv.  
ELSE.    ev_filed 
= lv_filed.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_MEINS
*&---------------------------------------------------------------------*
*       计量单位
*----------------------------------------------------------------------*
*      -->IV_MEINS 计量单位
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_meins  USING    iv_meins  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_meins                                   
TEXT-c10                          
CHANGING es_alv.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_CHARG
*&---------------------------------------------------------------------*
*       批次
*----------------------------------------------------------------------*
*      -->IV_MEINS 计量单位
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_charg  USING    iv_charg  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_charg                                   
TEXT-c11                          
CHANGING es_alv.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_EXBWR
*&---------------------------------------------------------------------*
*       库存金额
*----------------------------------------------------------------------*
*      -->IV_EXBWR 金额
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_exbwr  USING    iv_exbwr  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_exbwr                                   
TEXT-c11                          
CHANGING es_alv.  

CHECK es_alv-remark IS INITIAL.

* 数值检查  
PERFORM sub_check_number USING    iv_exbwr                                    
TEXT-c11                           
CHANGING es_alv-exbwr                                    es_alv
.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_BWART
*&---------------------------------------------------------------------*
*       移动类型
*----------------------------------------------------------------------*
*      -->IV_BWART 移动类型
*      <--ES_ALV   预览画面数据
*----------------------------------------------------------------------*
FORM sub_check_bwart  USING    iv_bwart  TYPE string                      
CHANGING es_alv    TYPE ty_alv.

* 必输入检查  
PERFORM sub_check_input USING    iv_bwart                                   
TEXT-c12                          
CHANGING es_alv.

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

* 设置ALV出力字段  
PERFORM sub_set_fieldcat.

* 设置ALV布局  
PERFORM sub_set_layout.

* ALV排序设置  
PERFORM sub_alv_set_sort.

* 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      it_sort                  
= gt_sort    
TABLES      t_outtab                 
= gt_alv    
EXCEPTIONS      program_error            
1      
OTHERS                   2.

* 失败时  
IF sy-subrc <> 0.
*   输出消息    
MESSAGE TEXT-m03 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' 'NUMBER' TEXT-c03 03.  mcr_set_fieldcat 
'GT_ALV' 'BUDAT'  TEXT-c04 04.  mcr_set_fieldcat 
'GT_ALV' 'WERKS'  TEXT-c05 05.  mcr_set_fieldcat 
'GT_ALV' 'LGORT'  TEXT-c06 06.  mcr_set_fieldcat 
'GT_ALV' 'MATNR'  TEXT-c07 07.  mcr_set_fieldcat 
'GT_ALV' 'MAKTX'  TEXT-c08 08.  mcr_set_fieldcat 
'GT_ALV' 'MENGE'  TEXT-c09 09.  mcr_set_fieldcat 
'GT_ALV' 'MEINS'  TEXT-c10 10.  mcr_set_fieldcat 
'GT_ALV' 'EXBWR'  TEXT-c11 11.  mcr_set_fieldcat 
'GT_ALV' 'BWART'  TEXT-c12 12.
*  mcr_set_fieldcat 'GT_ALV' 'SOBKZ'  TEXT-c13 13.
*  mcr_set_fieldcat 'GT_ALV' 'POSID'  TEXT-c14 14.

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_SORT
*&---------------------------------------------------------------------*
*       ALV排序设置
*----------------------------------------------------------------------*
*      -->ET_SORT  排序数据
*----------------------------------------------------------------------*
FORM sub_alv_set_sort .  

DATA:ls_sort TYPE slis_sortinfo_alv.  

CLEAR ls_sort.  ls_sort
-spos 3.  ls_sort
-fieldname 'NUMBER'.             "字段名称  ls_sort
-up = abap_on.                     "升序排列  
APPEND ls_sort TO gt_sort.
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.  gv_title 
TEXT-t02.  
"copy 程序SAPLKKBL的GUI状态STANDARD_FULLSCREEN  
SET PF-STATUS 'STANDARD_ALV1' EXCLUDING it_extab.
* 标题栏  
SET TITLEBAR 'TITLE_BAR' WITH gv_title gv_lines.
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.

*   ALV出力    
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'      
EXPORTING        i_callback_program       
= sy-repid        i_callback_pf_status_set 
'SUB_SET_PF_STATUS2'        is_layout                
= gs_layout        it_fieldcat              
= gt_fieldcat        it_sort                  
= gt_sort      
TABLES        t_outtab                 
= gt_alv2      
EXCEPTIONS        program_error            
1        
OTHERS                   2.

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

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

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

* 读取成功  
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,        ls_mcha             
TYPE mcha,        lv_lgort            
TYPE mchb-lgort,        ls_clbatch          
TYPE clbatch,        lt_clbatch          
TYPE TABLE OF clbatch,        lv_charg            
TYPE mseg-charg,        lv_icon             
TYPE char04.  

SORT gt_alv BY zeile ASCENDING.  

CLEAR gt_alv2.  
LOOP AT gt_alv INTO ls_alv_tmp.    ls_alv 

= ls_alv_tmp.    

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

*     添加抬头信息      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      '05'.    

ENDAT.

*   数据保存    
APPEND ls_alv TO lt_alv.

*   添加行项目信息    
CLEAR ls_goodsmvt_item.    ls_goodsmvt_item
-material     = ls_alv-matnr.    ls_goodsmvt_item
-plant        = ls_alv-werks.    ls_goodsmvt_item
-stge_loc     = ls_alv-lgort.
*    ls_goodsmvt_item-spec_stock   = ls_alv-sobkz.
*    ls_goodsmvt_item-wbs_elem     = ls_alv-posid.    ls_goodsmvt_item
-move_type    = ls_alv-bwart.    ls_goodsmvt_item
-entry_qnt    = ls_alv-menge.

*    IF ls_alv-sobkz = 'Q'.
*      ls_goodsmvt_item-val_wbs_elem = ls_alv-posid.
*    ENDIF.    

SELECT msehi      
FROM t006a      
INTO ls_goodsmvt_item-entry_uom      
UP TO ROWS     
WHERE spras = sy-langu       
AND mseh3 = ls_alv-meins.    
ENDSELECT.    

IF sy-subrc <> 0.      ls_goodsmvt_item
-entry_uom    = ls_alv-meins.    
ENDIF.    
IF ls_alv-bwart <> 'Z91' OR ls_alv-bwart <> '562'.      ls_goodsmvt_item
-amount_lc    = ls_alv-exbwr.    
ENDIF.    ls_goodsmvt_item
-item_text    = ls_alv-maktx.    
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.    

"---------------------------------------------------    
"创建物料凭证    
"---------------------------------------------------    
AT END OF zeile.      

CLEAR:ls_goodsmvt_headret, lv_matdoc.

*     调用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.      

CLEAR lv_index.      
LOOP AT lt_alv INTO ls_alv_tmp2.        lv_index 
= lv_index + 1.
*       成功的时候        
IF lv_matdoc IS NOT INITIAL.          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_red_light.            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_red_light.              ls_alv_tmp2
-remark = ls_return-message.              
APPEND ls_alv_tmp2 TO gt_alv2.            
ENDLOOP.            

IF sy-subrc <> 0.              
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno                 
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4                 
INTO ls_alv_tmp2-remark.              ls_alv_tmp2
-icon   = icon_red_light.              
APPEND ls_alv_tmp2 TO gt_alv2.            
ENDIF.          
ENDIF.          lv_icon 

= icon_red_light.          
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.        
ENDIF.      
ENDLOOP.      

IF lv_icon IS INITIAL.        ls_alv_tmp2

-icon   = icon_led_green.        
CONCATENATE TEXT-c20 lv_matdoc '被正确的创建' INTO ls_alv_tmp2-remark.        
MODIFY gt_alv2 FROM ls_alv_tmp2  TRANSPORTING icon remark WHERE remark IS INITIAL.        
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'          
EXPORTING            
wait = abap_on.      
ENDIF.      

CLEAR lv_icon.    
ENDAT.  
ENDLOOP.

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_ALV1' EXCLUDING it_extab.
* 标题栏  
SET TITLEBAR 'T02'.
ENDFORM.

 

 

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