预留导入

*&---------------------------------------------------------------------*
*& Report ZPPE338
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMME118.
TABLES:SSCRFIELDS,RESB,RKPF.
*&---定义ALV显示的字段列及其描述等属性
DATA:GT_FIELDCAT TYPE TABLE OF LVC_S_FCAT,
     GS_FIELDCAT TYPE LVC_S_FCAT,
     GS_LAYOUT   TYPE LVC_S_LAYO,
     G_REPID     LIKE SY-REPID VALUE SY-REPID.

DEFINE INIT_FIELDCAT.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = &1.
  gs_fieldcat-coltext = &2.
  gs_fieldcat-ref_table = &3.
  gs_fieldcat-ref_field = &4.
  gs_fieldcat-checkbox = &5.
  gs_fieldcat-edit = &6.
  gs_fieldcat-icon = &7.
  gs_fieldcat-outputlen = &8.
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
TYPES:BEGIN OF TY_UPLOAD,
        MATNR  TYPE RESB-MATNR,
        WERKS  TYPE RESB-WERKS,
        BWART  TYPE RESB-BWART,
        ERFMG  TYPE STRING,
        LGORT  TYPE RESB-LGORT,
        KOSTL  TYPE RKPF-KOSTL,
        BDTER  TYPE STRING,
        LGORT1 TYPE RESB-LGORT,
        MEINS  TYPE MARA-MEINS,
      END OF TY_UPLOAD.
DATA:GT_UPLOAD TYPE TABLE OF TY_UPLOAD,
     GS_UPLOAD TYPE TY_UPLOAD.

TYPES:BEGIN OF TY_ALV,
        SEL          TYPE C,
        ICON         TYPE CHAR4,
        MATNR        TYPE RESB-MATNR,
        MAKTX        TYPE MAKT-MAKTX,
        WERKS        TYPE RESB-WERKS,
        BWART        TYPE RESB-BWART,
        ERFMG        TYPE RESB-ERFMG,
        MEINS        TYPE MARA-MEINS,
        UMLGO        TYPE RESB-UMLGO,
        LGORT        TYPE RESB-LGORT,
        CHARG        TYPE RESB-CHARG,
        KOSTL        TYPE RKPF-KOSTL,
        AUFNR        TYPE RESB-AUFNR,
        BDTER        TYPE DATUM,
        USNAM        TYPE RKPF-USNAM,
        RSNUM        TYPE RESB-RSNUM,
        RSPOS        TYPE RESB-RSPOS,
        LGORT1       TYPE RESB-LGORT,
        XLOEK        TYPE RESB-XLOEK,
        MESSAGE(100TYPE C,
      END OF TY_ALV.
DATA:GT_ALV TYPE TABLE OF TY_ALV,
     GS_ALV TYPE TY_ALV.
FIELD-SYMBOLS:<FS_ALV> TYPE TY_ALV.


*----------选择屏幕--------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TEXT-002.
PARAMETERS:P_PATH  LIKE RLGRAP-FILENAME.         "文件路径
SELECT-OPTIONS:S_WERKS FOR RESB-WERKS,
               S_MATNR FOR RESB-MATNR,
               S_BWART FOR RESB-BWART,
               S_BDTER FOR RESB-BDTER,
               S_KOSTL FOR RKPF-KOSTL,
               S_LGORT FOR RESB-LGORT,
               S_USNAM FOR RKPF-USNAM DEFAULT SY-UNAME NO INTERVALS NO-EXTENSION.
PARAMETERS:R1 RADIOBUTTON GROUP GRP1 USER-COMMAND UC1 DEFAULT 'X',
           R2 RADIOBUTTON GROUP GRP1.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN END OF BLOCK BLK2.

INITIALIZATION.

  SSCRFIELDS-FUNCTXT_01 '下载模板'.

AT SELECTION-SCREEN OUTPUT.

  PERFORM FRM_CHANGE_SCREEN.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH.

  PERFORM FRM_BROWSER_FILE.         "选择屏幕获取本地EXCEL

AT SELECTION-SCREEN.

  IF SY-UCOMM EQ 'FC01'.

    PERFORM FRM_DOWNLOAD_TEMPLATE.

  ELSEIF SY-UCOMM EQ 'ONLI'.
    IF R1 'X'.
      IF  P_PATH IS INITIAL.
        MESSAGE '请选择导入文件' TYPE 'S' DISPLAY LIKE 'W'.
        STOP.
      ENDIF.

      PERFORM FRM_UPLOAD_DATA.

*--------------判断上传模板中是否有数据------------
      IF GT_UPLOAD IS INITIAL.
        MESSAGE '上传模板数据不能为空' TYPE 'S' DISPLAY LIKE 'E'.
        EXIT.
      ENDIF.

      PERFORM FRM_SET_DATA.

    ELSE.

      PERFORM FRM_GET_DATA.

    ENDIF.

    PERFORM FRM_DISPLAY.
  ENDIF.

START-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHANGE_SCREEN .
  DATA:LV_STR TYPE STRING.
  IF R1 'X'.
    LOOP AT SCREEN.
      LV_STR SCREEN-NAME.
      SEARCH LV_STR FOR 'S_WERKS'.
      IF SY-SUBRC 0.
        SCREEN-ACTIVE    0.
        SCREEN-INVISIBLE 1.
        MODIFY SCREEN.
      ENDIF.
      SEARCH LV_STR FOR 'S_MATNR'.
      IF SY-SUBRC 0.
        SCREEN-ACTIVE    0.
        SCREEN-INVISIBLE 1.
        MODIFY SCREEN.
      ENDIF.
      SEARCH LV_STR FOR 'S_KOSTL'.
      IF SY-SUBRC 0.
        SCREEN-ACTIVE    0.
        SCREEN-INVISIBLE 1.
        MODIFY SCREEN.
      ENDIF.
      SEARCH LV_STR FOR 'S_LGORT'.
      IF SY-SUBRC 0.
        SCREEN-ACTIVE    0.
        SCREEN-INVISIBLE 1.
        MODIFY SCREEN.
      ENDIF.
      SEARCH LV_STR FOR 'S_BWART'.
      IF SY-SUBRC 0.
        SCREEN-ACTIVE    0.
        SCREEN-INVISIBLE 1.
        MODIFY SCREEN.
      ENDIF.
      SEARCH LV_STR FOR 'S_BDTER'.
      IF SY-SUBRC 0.
        SCREEN-ACTIVE    0.        
SCREEN-INVISIBLE 1.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_USNAM'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    0.        
SCREEN-INVISIBLE 1.        
MODIFY SCREEN.      
ENDIF.      LV_STR 
SCREEN-NAME.      
SEARCH LV_STR FOR 'P_PATH'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.    
ENDLOOP.  
ELSE.    
LOOP AT SCREEN.      LV_STR 
SCREEN-NAME.      
SEARCH LV_STR FOR 'S_WERKS'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_MATNR'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_KOSTL'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_LGORT'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_BWART'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_BDTER'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      
SEARCH LV_STR FOR 'S_USNAM'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    1.        
SCREEN-INVISIBLE 0.        
MODIFY SCREEN.      
ENDIF.      LV_STR 
SCREEN-NAME.      
SEARCH LV_STR FOR 'P_PATH'.      
IF SY-SUBRC 0.        
SCREEN-ACTIVE    0.        
SCREEN-INVISIBLE 1.        
MODIFY SCREEN.      
ENDIF.    
ENDLOOP.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_F4_FOR_P_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_BROWSER_FILE .  
DATA:LV_RC   TYPE I,       LV_USER 
TYPE I,       LT_FILE 
TYPE FILETABLE,       LS_FILE 
TYPE FILE_TABLE.  

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG    
EXPORTING      WINDOW_TITLE            
'选择文件'      DEFAULT_EXTENSION       
'.xlsx'      FILE_FILTER             
''    
CHANGING      FILE_TABLE              
= LT_FILE      RC                      
= LV_RC      USER_ACTION             
= LV_USER    
EXCEPTIONS      FILE_OPEN_DIALOG_FAILED 
1      CNTL_ERROR              
2      ERROR_NO_GUI            
3      NOT_SUPPORTED_BY_GUI    
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.  
ELSE.    
CHECK LV_RC AND LV_USER <> 9.    
READ TABLE LT_FILE INTO LS_FILE INDEX 1.    P_PATH 
= LS_FILE-FILENAME.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMPLATE.  
DATA: L_FILENAME   TYPE STRING,        L_PATH       
TYPE STRING,        L_FULLPATH   
TYPE STRING,        L_DESTINATON 
TYPE RLGRAP-FILENAME,        L_OBJID      
TYPE W3OBJID,        L_OBJECT     
TYPE WWWDATATAB,        L_RC         
TYPE SY-SUBRC.  

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG    
EXPORTING      WINDOW_TITLE         
'Download Template'      DEFAULT_EXTENSION    
'.xlsx'      DEFAULT_FILE_NAME    
'ZMME118'      FILE_FILTER          
''    
CHANGING      FILENAME             
= L_FILENAME      PATH                 
= L_PATH      FULLPATH             
= L_FULLPATH    
EXCEPTIONS      CNTL_ERROR           
1      ERROR_NO_GUI         
2      NOT_SUPPORTED_BY_GUI 
3      
OTHERS               4.  
IF SY-SUBRC 0.    L_OBJID 
'ZMME118'.
*   取得存储对象数据    
SELECT SINGLE *      
INTO CORRESPONDING FIELDS OF L_OBJECT      
FROM WWWDATA     
WHERE SRTF2 0       
AND RELID 'MI'    
AND OBJID = L_OBJID.    
IF SY-SUBRC NE 0.      
MESSAGE '下载失败,请用事务码:SMW0上传相应模板' TYPE 'E'.    
ENDIF.    L_DESTINATON 
= L_FULLPATH.    
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'      
EXPORTING        
KEY         = L_OBJECT        DESTINATION 
= L_DESTINATON      
IMPORTING        RC          
= L_RC.    
IF L_RC NE 0.      
MESSAGE '下载失败,请联系管理员' TYPE 'E'.    
ENDIF.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .  
DATA:LO_EXCEL_READER TYPE REF TO ZIF_EXCEL_READER,       LO_EXCEL        
TYPE REF TO ZCL_EXCEL,       LO_WORKSHEET    
TYPE REF TO ZCL_EXCEL_WORKSHEET,       LV_HIGHEST_ROW  
TYPE INT4,       LV_FIDNAME      
TYPE CHAR20,       LV_CONUM
(2)     TYPE N,       LV_COL          
TYPE I,       LV_ROW          
TYPE I,       LV_COL_ALPHA    
TYPE ZEXCEL_CELL_COLUMN_ALPHA,       LV_VALUE        
TYPE ZEXCEL_CELL_VALUE.  
FIELD-SYMBOLS:<FS_DYN> TYPE ANY.  

CREATE OBJECT LO_EXCEL_READER TYPE ZCL_EXCEL_READER_2007.  LO_EXCEL       
= LO_EXCEL_READER->LOAD_FILE( P_PATH ).  LO_WORKSHEET   
= LO_EXCEL->GET_ACTIVE_WORKSHEET).  LV_HIGHEST_ROW 
= LO_WORKSHEET->GET_HIGHEST_ROW).  

REFRESH:GT_UPLOAD.  LV_ROW 
0.  
DO.    
CLEAR:GS_UPLOAD.    LV_ROW 
= LV_ROW + 1.    
IF LV_ROW GT LV_HIGHEST_ROW.      
EXIT.    
ENDIF.    
IF LV_ROW 1.      
CONTINUE.    
ENDIF.    LV_COL 
0.    
DO.      
CLEAR:LV_VALUE.      LV_COL 
= LV_COL + 1.      LV_COL_ALPHA 
= ZCL_EXCEL_COMMON=>CONVERT_COLUMN2ALPHA( LV_COL ).      LO_WORKSHEET
->GET_CELL(         
EXPORTING           IP_COLUMN 
= LV_COL_ALPHA           IP_ROW    
= LV_ROW         
IMPORTING           EP_VALUE  
= LV_VALUE ).      
CASE LV_COL.        
WHEN 1.         
" GS_UPLOAD-BDTER = ZCL_EXCEL_COMMON=>EXCEL_STRING_TO_DATE( LV_VALUE ).          GS_UPLOAD
-BDTER = LV_VALUE .        
WHEN 2.          GS_UPLOAD
-BWART = LV_VALUE.        
WHEN 3.          GS_UPLOAD
-WERKS = LV_VALUE.        
WHEN 4.          GS_UPLOAD
-KOSTL = LV_VALUE.        
WHEN 5.          GS_UPLOAD
-LGORT1 = LV_VALUE.        
WHEN 6.          GS_UPLOAD
-MATNR = LV_VALUE.          
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'            
EXPORTING              
INPUT  = GS_UPLOAD-MATNR            
IMPORTING              
OUTPUT = GS_UPLOAD-MATNR.        

WHEN 7.          GS_UPLOAD
-ERFMG = LV_VALUE.        
WHEN .          GS_UPLOAD
-MEINS = LV_VALUE.        
WHEN 9.          GS_UPLOAD
-LGORT = LV_VALUE.        


WHEN OTHERS.      
ENDCASE.      

IF LV_COL EQ 9.        
EXIT.      
ENDIF.    
ENDDO.    
APPEND GS_UPLOAD TO GT_UPLOAD.  
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .  

PERFORM FRM_SET_LAYOUT.  

PERFORM FRM_SET_FIELDCAT.  

PERFORM FRM_DISPLAY_OUTPUT.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_DATA .  
DATA:LV_MATNR TYPE MARC-MATNR.
*==========将excel上传数据给到alv  
IF GT_UPLOAD[] IS NOT INITIAL.    
SELECT MARC~WERKS,           MARC
~MATNR,           MARA
~MEINS,           MAKT
~MAKTX      
INTO TABLE @DATA(LT_MARC)      
FROM MARC      
LEFT JOIN MARA ON MARA~MATNR = MARC~MATNR      
LEFT JOIN MAKT ON MAKT~MATNR = MARC~MATNR                    
AND MAKT~SPRAS = @SY-LANGU       
FOR ALL ENTRIES IN @GT_UPLOAD     
WHERE MARC~MATNR = @GT_UPLOAD-MATNR    
AND MARC~WERKS = @GT_UPLOAD-WERKS.    

SELECT WERKS,           LGORT      

INTO TABLE @DATA(LT_T001L)      
FROM T001L       
FOR ALL ENTRIES IN @GT_UPLOAD     
WHERE WERKS = @GT_UPLOAD-WERKS    
AND LGORT = @GT_UPLOAD-LGORT.    

SELECT BWART      
INTO TABLE @DATA(LT_T156)      
FROM T156       
FOR ALL ENTRIES IN @GT_UPLOAD    
WHERE BWART = @GT_UPLOAD-BWART.  
ENDIF.  

SORT LT_MARC BY WERKS MATNR.  
SORT LT_T001L BY WERKS LGORT.  

LOOP AT GT_UPLOAD INTO GS_UPLOAD.    
CLEAR:GS_ALV.    
MOVE-CORRESPONDING GS_UPLOAD TO GS_ALV.    

READ TABLE LT_MARC INTO DATA(LS_MARCWITH KEY WERKS = GS_ALV-WERKS                                                   MATNR 
= GS_ALV-MATNR BINARY SEARCH.    
IF SY-SUBRC NE 0.      GS_ALV
-MESSAGE = GS_ALV-MESSAGE && '物料不存在' .    
ELSE.      GS_ALV
-MEINS = LS_MARC-MEINS.      GS_ALV
-MAKTX = LS_MARC-MAKTX.    
ENDIF.    

READ TABLE LT_T001L INTO DATA(LS_T001LWITH KEY WERKS = GS_ALV-WERKS                                                     LGORT 
= GS_ALV-LGORT BINARY SEARCH.    
IF SY-SUBRC NE 0.      GS_ALV
-MESSAGE = GS_ALV-MESSAGE &&  '库存地点不存在' .    
ENDIF.    

READ TABLE LT_T156 INTO DATA(LS_T156WITH KEY BWART = GS_ALV-BWART.    
IF SY-SUBRC NE 0.      GS_ALV
-MESSAGE = GS_ALV-MESSAGE &&  '移动类型不存在' .    
ENDIF.    

IF GS_ALV-MESSAGE IS NOT INITIAL.      GS_ALV
-ICON '@5C@'.    
ENDIF.    
APPEND GS_ALV TO GT_ALV.    
CLEAR GS_ALV.  
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .  
REFRESH:GT_FIELDCAT.  
IF R1 'X'.    INIT_FIELDCAT 
'ICON'    '标识'     '' '' '' '' '' '4'.    INIT_FIELDCAT 
'RSNUM'   '预留'     '' '' '' '' '' '10'.    INIT_FIELDCAT 
'MATNR'   '物料编号' '' '' '' '' '' '40'.    INIT_FIELDCAT 
'MAKTX'   '物料描述' '' '' '' '' '' '40'.    INIT_FIELDCAT 
'WERKS'   '工厂'     '' '' '' '' '' ''.    INIT_FIELDCAT 
'BWART'   '移动类型' '' '' '' '' '' ''.    INIT_FIELDCAT 
'ERFMG'   '数量'     '' '' '' '' '' ''.    INIT_FIELDCAT 
'MEINS'   '单位'     '' '' '' '' '' ''.    INIT_FIELDCAT 
'LGORT'   '发货库位' '' '' '' '' '' ''.    INIT_FIELDCAT 
'KOSTL'   '成本中心' '' '' '' '' '' ''.    INIT_FIELDCAT 
'BDTER'   '需求日期' '' '' '' '' '' ''.    INIT_FIELDCAT 
'LGORT1'   '收货或发货库存地点' '' '' '' '' '' ''.    INIT_FIELDCAT 
'MESSAGE' '信息'     '' '' '' '' '' '100'.  
ELSE.    INIT_FIELDCAT 
'SEL'     '选择'     '' '' 'X' 'X' '' '4'.    INIT_FIELDCAT 
'ICON'    '标识'     '' '' '' '' '' '4'.    INIT_FIELDCAT 
'RSNUM'   '预留'     '' '' '' '' '' '10'.    INIT_FIELDCAT 
'RSPOS'   '预留行'   '' '' '' '' '' '10'.    INIT_FIELDCAT 
'XLOEK'   '删除标识' '' '' '' '' '' '4'.    INIT_FIELDCAT 
'MATNR'   '物料编号' '' '' '' '' '' '40'.    INIT_FIELDCAT 
'MAKTX'   '物料描述' '' '' '' '' '' '40'.    INIT_FIELDCAT 
'WERKS'   '工厂'     '' '' '' '' '' ''.    INIT_FIELDCAT 
'BWART'   '移动类型' '' '' '' '' '' ''.    INIT_FIELDCAT 
'ERFMG'   '数量'     '' '' '' '' '' ''.    INIT_FIELDCAT 
'MEINS'   '单位'     '' '' '' '' '' ''.    INIT_FIELDCAT 
'LGORT'   '发货库位' '' '' '' '' '' ''.    INIT_FIELDCAT 
'UMLGO'   '收货库位' '' '' '' '' '' ''.    INIT_FIELDCAT 
'KOSTL'   '成本中心' '' '' '' '' '' ''.    INIT_FIELDCAT 
'BDTER'   '需求日期' '' '' '' '' '' ''.    INIT_FIELDCAT 
'USNAM'   '创建人'   '' '' '' '' '' ''.    INIT_FIELDCAT 
'MESSAGE' '信息'     '' '' '' '' '' '100'.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .  GS_LAYOUT
-ZEBRA      'X'.  GS_LAYOUT
-CWIDTH_OPT 'X'.  GS_LAYOUT
-SEL_MODE   'A'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_OUTPUT .  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    
EXPORTING      I_CALLBACK_PROGRAM       
= SY-REPID      I_CALLBACK_PF_STATUS_SET 
'ALV_STATUS'      I_CALLBACK_USER_COMMAND  
'ALV_COMMAND'      IS_LAYOUT_LVC            
= GS_LAYOUT      IT_FIELDCAT_LVC          
= GT_FIELDCAT    
TABLES      T_OUTTAB                 
= GT_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.
*&      FORM  ALV_PF_STATUS
*&---------------------------------------------------------------------*
*       GUI状态设置
*----------------------------------------------------------------------*
*      -->RT_EXTAB   GUI状态设置
*----------------------------------------------------------------------*
FORM ALV_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.  
IF R1 'X'.    
APPEND 'DEL' TO RT_EXTAB.  
ELSE.    
APPEND 'ZSAVE1' TO RT_EXTAB.  
ENDIF.  
SET PF-STATUS 'STANDARD' EXCLUDING RT_EXTAB.
ENDFORM.                    "ALV_PF_STATUS
*&---------------------------------------------------------------------*
*&      FORM  ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*       ALV执行查询后的事件响应
*----------------------------------------------------------------------*
*      -->R_UCOMN      响应码
*      -->RS_SELFIELD  当前行信息
*----------------------------------------------------------------------*
FORM ALV_COMMAND USING PV_UCOMM LIKE SY-UCOMM                       RS_SELFIELD 
TYPE SLIS_SELFIELD.  
DATA:LV_INDEX TYPE SY-TABIX.  
DATA:GV_GRID TYPE REF TO CL_GUI_ALV_GRID .

*--------------------刷新-------------------*  
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      E_GRID 
= GV_GRID.  

CALL METHOD GV_GRID->CHECK_CHANGED_DATA.  

CALL METHOD GV_GRID->REFRESH_TABLE_DISPLAY.  RS_SELFIELD

-REFRESH 'X'.  

CASE PV_UCOMM.    
WHEN 'ZSAVE1'.      

PERFORM FRM_CREATE_RESERVATION.    

WHEN 'ALL'.      

LOOP AT GT_ALV INTO GS_ALV.        GS_ALV
-SEL 'X'.        
MODIFY GT_ALV FROM GS_ALV TRANSPORTING SEL..      
ENDLOOP.    

WHEN 'SAL'.      

LOOP AT GT_ALV INTO GS_ALV.        GS_ALV
-SEL ''.        
MODIFY GT_ALV FROM GS_ALV TRANSPORTING SEL..      
ENDLOOP.    

WHEN 'DEL'.      

PERFORM FRM_DELETE_RESERVATION.  

ENDCASE.  RS_SELFIELD
-REFRESH 'X'.
ENDFORM.                    "ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_BAPI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CREATE_RESERVATION.  
DATA:L_RSNUM TYPE BAPIRKPFC-RES_NO.  
DATA:LT_ALV TYPE TABLE OF TY_ALV,       LS_ALV 
LIKE LINE OF LT_ALV.  
DATA:GS_HEADER TYPE BAPIRKPFC,       GT_ITEM   
TYPE TABLE OF BAPIRESBC,       GS_ITEM   
TYPE BAPIRESBC,       GT_RETURN 
TYPE TABLE OF BAPIRETURN,       GS_RETURN 
TYPE BAPIRETURN.  

READ TABLE GT_ALV INTO GS_ALV WITH KEY ICON '@5C@'.  
IF SY-SUBRC 0.    
MESSAGE E001(00WITH '清单中有异常数据,请先处理异常数据再保存预留!'.  
ENDIF.  LT_ALV[] 

= GT_ALV[].  
SORT LT_ALV BY BWART KOSTL AUFNR UMLGO BDTER LGORT1.  
DELETE ADJACENT DUPLICATES FROM LT_ALV COMPARING BWART KOSTL AUFNR UMLGO BDTER LGORT1.  

LOOP AT LT_ALV INTO LS_ALV.    
CLEAR:GS_HEADER,GS_ITEM,GT_RETURN,GT_ITEM[].    GS_HEADER
-PLANT      = LS_ALV-WERKS.    GS_HEADER
-MOVE_TYPE  = LS_ALV-BWART.    GS_HEADER
-COST_CTR   = LS_ALV-KOSTL.    GS_HEADER
-RES_DATE   = LS_ALV-BDTER.
*    gs_header-move_plant = ls_alv-werks.    GS_HEADER
-CREATED_BY = SY-UNAME.    GS_HEADER
-MOVE_STLOC = LS_ALV-LGORT1.    GS_HEADER
-MOVE_PLANT = LS_ALV-WERKS.    

LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BWART = LS_ALV-BWART                                        
AND KOSTL = LS_ALV-KOSTL                                        
AND UMLGO = LS_ALV-UMLGO                                        
AND AUFNR = LS_ALV-AUFNR                                        
AND BDTER = LS_ALV-BDTER                                       
AND LGORT1 = LS_ALV-LGORT1.      GS_ITEM

-MATERIAL  = <FS_ALV>-MATNR.      GS_ITEM
-PLANT     = <FS_ALV>-WERKS.      GS_ITEM
-STORE_LOC = <FS_ALV>-LGORT.      GS_ITEM
-REQ_DATE  = <FS_ALV>-BDTER.      GS_ITEM
-UNIT      = <FS_ALV>-MEINS.      GS_ITEM
-QUANTITY  = <FS_ALV>-ERFMG.      GS_ITEM
-MOVEMENT  'X'.      
APPEND GS_ITEM TO GT_ITEM.      
CLEAR GS_ITEM.    
ENDLOOP.    

CLEAR L_RSNUM.    

CALL FUNCTION 'BAPI_RESERVATION_CREATE'      
EXPORTING        RESERVATION_HEADER 
= GS_HEADER
*       NO_COMMIT          =
*       MOVEMENT_AUTO      =      
IMPORTING        RESERVATION        
= L_RSNUM      
TABLES        RESERVATION_ITEMS  
= GT_ITEM        
RETURN             = GT_RETURN.    

LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE 'E'                                        
OR TYPE 'A'.      GS_ALV
-MESSAGE = GS_RETURN-MESSAGE.    
ENDLOOP.    

IF SY-SUBRC EQ 0.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      
LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BDTER = LS_ALV-BDTER                                          
AND BWART = LS_ALV-BWART                                          
AND UMLGO = LS_ALV-UMLGO                                          
AND KOSTL = LS_ALV-KOSTL                                          
AND AUFNR = LS_ALV-AUFNR                                          
AND  LGORT1 = LS_ALV-LGORT1.        <FS_ALV>
-MESSAGE = GS_RETURN-MESSAGE.        <FS_ALV>
-ICON    '@5C@'.      
ENDLOOP.    
ELSE.      
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'        
EXPORTING          
WAIT 'X'.      

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'        
EXPORTING          
INPUT  = L_RSNUM        
IMPORTING          
OUTPUT = L_RSNUM.      

LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BDTER = LS_ALV-BDTER                                          
AND BWART = LS_ALV-BWART                                          
AND UMLGO = LS_ALV-UMLGO                                          
AND KOSTL = LS_ALV-KOSTL                                          
AND AUFNR = LS_ALV-AUFNR                                          
AND  LGORT1 = LS_ALV-LGORT1.        <FS_ALV>
-MESSAGE = L_RSNUM && '创建成功'.        <FS_ALV>
-ICON    '@5B@'.        <FS_ALV>
-RSNUM   = L_RSNUM.      
ENDLOOP.    
ENDIF.  
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .  
SELECT RESB~RSNUM,         RESB
~RSPOS,         RESB
~BDTER,         RKPF
~BWART,         RKPF
~KOSTL,         RKPF
~UMLGO,         RKPF
~USNAM,         RESB
~MATNR,         RESB
~WERKS,         RESB
~LGORT,         RESB
~BDMNG AS ERFMG,         RESB
~MEINS,         RESB
~XLOEK,         MAKT
~MAKTX    
INTO CORRESPONDING FIELDS OF TABLE @GT_ALV    
FROM RESB   INNER 
JOIN RKPF ON RKPF~RSNUM = RESB~RSNUM    
LEFT JOIN MAKT ON MAKT~MATNR = RESB~MATNR                  
AND MAKT~SPRAS = @SY-LANGU   
WHERE RESB~WERKS IN @S_WERKS     
AND RESB~MATNR IN @S_MATNR     
AND RESB~BWART IN @S_BWART     
AND RESB~BDTER IN @S_BDTER     
AND RKPF~KOSTL IN @S_KOSTL     
AND RKPF~USNAM IN @S_USNAM     
AND RESB~LGORT IN @S_LGORT.  

SORT GT_ALV BY RSNUM RSPOS.  

LOOP AT GT_ALV ASSIGNING <FS_ALV>.    
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'      
EXPORTING        
INPUT  = <FS_ALV>-RSNUM      
IMPORTING        
OUTPUT = <FS_ALV>-RSNUM.  
ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_RESERVATION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DELETE_RESERVATION .  
DATA:LT_ALV TYPE TABLE OF TY_ALV,       LS_ALV 
LIKE LINE OF LT_ALV.  
DATA:IT_RESERVATIONITEMS_CHANGED  TYPE TABLE OF BAPI2093_RES_ITEM_CHANGE WITH HEADER LINE,       IT_RESERVATIONITEMS_CHANGEDX 
TYPE TABLE OF BAPI2093_RES_ITEM_CHANGEX WITH HEADER LINE,       IT_RETURN                    
TYPE TABLE OF BAPIRET2  WITH HEADER LINE.  LT_ALV[] 

= GT_ALV[].  
DELETE LT_ALV WHERE SEL ''.  
SORT LT_ALV BY RSNUM.  
DELETE ADJACENT DUPLICATES FROM LT_ALV COMPARING RSNUM.  

LOOP AT LT_ALV INTO LS_ALV.    
LOOP AT GT_ALV INTO GS_ALV WHERE SEL 'X' AND RSNUM = LS_ALV-RSNUM.      IT_RESERVATIONITEMS_CHANGED
-RES_ITEM = GS_ALV-RSPOS.      IT_RESERVATIONITEMS_CHANGED
-DELETE_IND 'X'.      
APPEND IT_RESERVATIONITEMS_CHANGED.      IT_RESERVATIONITEMS_CHANGEDX
-RES_ITEM = GS_ALV-RSPOS.      IT_RESERVATIONITEMS_CHANGEDX
-DELETE_IND 'X'.      
APPEND IT_RESERVATIONITEMS_CHANGEDX.      
CLEAR:IT_RESERVATIONITEMS_CHANGED,IT_RESERVATIONITEMS_CHANGEDX.    
ENDLOOP.    

CALL FUNCTION 'BAPI_RESERVATION_CHANGE'      
EXPORTING        RESERVATION               
= LS_ALV-RSNUM      
TABLES        RESERVATIONITEMS_CHANGED  
= IT_RESERVATIONITEMS_CHANGED        RESERVATIONITEMS_CHANGEDX 
= IT_RESERVATIONITEMS_CHANGEDX        
RETURN                    = IT_RETURN.    

LOOP AT IT_RETURN WHERE TYPE 'E' OR TYPE 'A'.      LS_ALV
-MESSAGE = IT_RETURN-MESSAGE.    
ENDLOOP.    

IF SY-SUBRC EQ 0.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      
LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE SEL 'X'                                          
AND RSNUM = LS_ALV-RSNUM.        <FS_ALV>
-MESSAGE '删除失败' && LS_ALV-MESSAGE.        <FS_ALV>
-ICON    '@5C@'.      
ENDLOOP.    
ELSE.      
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'        
EXPORTING          
WAIT 'X'.      

LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE SEL 'X'                                          
AND RSNUM = LS_ALV-RSNUM.        <FS_ALV>
-MESSAGE '删除成功'.        <FS_ALV>
-ICON    '@5B@'.      
ENDLOOP.    
ENDIF.  
ENDLOOP.

ENDFORM.
posted @   我肉山  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示