WM 311移库

*&---------------------------------------------------------------------*
*& Report ZPPXCE024
*&---------------------------------------------------------------------*
*&创建日期:2022-10-19
*&创建人:  JIATAI_LCX
*&程序功能:3PL自动补货
*&相关函数:
*&---------------------------------------------------------------------*
*&                    变更记录
*&--------------------------------------------------------------------*
*& 修改日期     修改人     需求号        描述
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
REPORT ZWMXCR024.

TABLES:MARA,MARD,MKPF.
DATA:GT_ZXCWMT005 TYPE TABLE OF ZXCWMT005.

TYPE-POOLS: SLIS, ABAP, SSCR.
TABLES:SSCRFIELDS,ZXCPPT007,AUFK.
DATA: GT_FIELDCAT   TYPE LVC_T_FCAT,
      GS_FIELDCAT   TYPE LVC_S_FCAT,
      GS_LAYOUT_LVC TYPE LVC_S_LAYO.

DEFINE MCR_APPEND_FIELD.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname   = &1.
  gs_fieldcat-scrtext_s   = &2.
  gs_fieldcat-scrtext_m   = &2.
  gs_fieldcat-scrtext_l   = &2.
  gs_fieldcat-colddictxt  'L'.
  gs_fieldcat-fix_column  = &3.
  gs_fieldcat-key         = &3.
  gs_fieldcat-no_sign     ''.
  gs_fieldcat-checkbox    = &4.
  gs_fieldcat-edit        = &5.
  gs_fieldcat-outputlen   = &6.
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

DATA: D_REF      TYPE REF TO DATA,
      LT_ALV_CAT TYPE TABLE OF LVC_S_FCAT,
      LS_ALV_CAT LIKE LINE OF LT_ALV_CAT.

DATA: LT_TABLE LIKE TABLE OF DNTAB.
DATA: LS_TABLE TYPE DNTAB.
DATA: DYN_TABLE TYPE REF TO DATA.
DATA: DYN_WA TYPE REF TO DATA.

SELECTION-SCREENBEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:S_MATNR FOR MARA-MATNR,
                                S_BUDAT FOR MKPF-BUDAT DEFAULT SY-DATUM.
PARAMETERS: P_WERKS  TYPE MARD-WERKS DEFAULT '1124' OBLIGATORY,
            P_LGORTO TYPE ZXCWMS016-LGORT_O DEFAULT 'EPW2' OBLIGATORY,
            P_LGORTI TYPE ZXCWMS016-LGORT_I DEFAULT 'EPW1' OBLIGATORY.
PARAMETERS:P_PROCE RADIOBUTTON GROUP G1 USER-COMMAND C1 DEFAULT 'X' ,     "补库存
           P_HILOG RADIOBUTTON GROUP G1.                                  "查询
SELECTION-SCREENEND OF BLOCK BLK1.

INITIALIZATION.




AT SELECTION-SCREEN OUTPUT.

  PERFORM FRM_CHANGE_SCREEN.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.


START-OF-SELECTION.
  IF P_PROCE 'X'.
    PERFORM FRM_GET_DATA.
  ENDIF.


  IF P_HILOG 'X'.
    PERFORM FRM_GET_LOG.
  ENDIF.


  PERFORM FRM_SHOW_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_GET_LOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .

  DATA:
    LV_MESSAGE          TYPE STRING,
    LT_SPLIT_TABLE      TYPE TABLE OF STRING,
    LS_SPLIT_TABLE      TYPE STRING,

    LS_GOODSMVT_HEADER  TYPE BAPI2017_GM_HEAD_01,
    LV_GOODSMVT_CODE    TYPE BAPI2017_GM_CODE,
    LT_GOODSMVT_ITEM    TYPE TABLE OF BAPI2017_GM_ITEM_CREATE,
    LS_GOODSMVT_ITEM    TYPE BAPI2017_GM_ITEM_CREATE,
    LV_MATERIALDOCUMENT TYPE BAPI2017_GM_HEAD_RET-MAT_DOC,
    LV_MATDOCUMENTYEAR  TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
    LT_RETURN           TYPE TABLE OF BAPIRET2,
    LS_RETURN           TYPE BAPIRET2.


  RANGES:LR_LGORT FOR MARD-LGORT.
  LR_LGORT-SIGN 'I'.
  LR_LGORT-OPTION 'EQ'.
  LR_LGORT-LOW = P_LGORTI.
  APPEND LR_LGORT.

  LR_LGORT-SIGN 'I'.
  LR_LGORT-OPTION 'EQ'.
  LR_LGORT-LOW = P_LGORTO.
  APPEND LR_LGORT.

***********获取接收库最大库存
  SELECT
    WERKS,
    MATNR,
    LGORT,
    ZEISBE,
    ZMABST
    INTO TABLE @DATA(LT_WMT004)
    FROM ZXCWMT004
    WHERE MATNR IN @S_MATNR
      AND WERKS = @P_WERKS
      AND LGORT = @P_LGORTI.
****获取接受库当前库存
  SELECT MATNR,
     LGORT,
    LABST
    INTO TABLE @DATA(LT_MARD)
    FROM MARD
    WHERE MATNR IN @S_MATNR
      AND WERKS = @P_WERKS
    "  AND LGORT = @P_LGORTI
    .
************
  SELECT WERKS,LGORT,LGNUM
     INTO TABLE @DATA(LT_T320)
    FROM T320
    WHERE WERKS = @P_WERKS
        AND LGORT IN @LR_LGORT.

***获取物料SU  如果没有SU则随意数量移库
  SORT LT_T320 BY LGNUM.

  DELETE ADJACENT DUPLICATES FROM LT_T320[] .

  IF LT_T320[] IS NOT INITIAL.

*    SELECT MATNR,
*                LGNUM,
*                LHMG1
*                INTO TABLE @DATA(LT_LHMG1)
*      FROM MLGN
*      FOR ALL ENTRIES IN @LT_T320
*      WHERE MATNR IN @S_MATNR
*        AND LGNUM = @LT_T320-LGNUM
    .

    SELECT  *
            INTO TABLE @DATA(LT_MLGN)
       FROM MLGN
      FOR ALL ENTRIES IN @LT_T320
      WHERE MATNR IN @S_MATNR
        AND LGNUM = @LT_T320-LGNUM
.


  ENDIF.

****获取物料清单

  SELECT MATNR
    INTO TABLE @DATA(LT_MARA)
    FROM MARA
    WHERE MATNR IN @S_MATNR.
***去除不在配置表中的数据
  LOOP AT LT_MARA INTO DATA(LS_MARA1).

    READ TABLE LT_WMT004 INTO DATA(LS_004WITH KEY MATNR = LS_MARA1-MATNR.
    IF SY-SUBRC NE 0.

      DELETE TABLE LT_MARA FROM  LS_MARA1.

    ENDIF.
  ENDLOOP.

  DATA:LS_WMT005 TYPE ZXCWMT005.
  DATA:LV_MARK TYPE CHAR1.

  "break-POINT.

  DELETE LT_MLGN WHERE LHMG1 0.

  LOOP AT LT_MARA INTO DATA(LS_MARA).

    CLEAR LV_MARK.


***计算本次移动数量
    READ TABLE LT_WMT004 INTO DATA(LS_WM004WITH KEY MATNR = LS_MARA-MATNR
                                                                                                               WERKS = P_WERKS
                                                                                                               LGORT = P_LGORTI .
    IF SY-SUBRC EQ 0.
      READ TABLE LT_MARD INTO DATA(LS_MARD1WITH KEY MATNR = LS_MARA-MATNR
                                                                                       LGORT  = P_LGORTI.
      IF SY-SUBRC  EQ 0.
***移库数量
        DATA(LV_YK= LS_WM004-ZMABST - LS_MARD1-LABST.
      ENDIF.
**出库位置库存
      READ TABLE LT_MARD INTO DATA(LS_MARD2WITH KEY MATNR = LS_MARA-MATNR
                                                                                LGORT  = P_LGORTO.
      IF SY-SUBRC EQ 0.        

IF LV_YK < LS_MARD2-LABST.          
" 如果移库数量小于库存不动        
ELSE.  "移库数量大于等于库存则取出库库存          LV_YK 
= LS_MARD2-LABST.        
ENDIF.      
ENDIF.    
ELSE.      LV_MARK 

'X'.    
ENDIF.    

READ TABLE LT_T320 INTO DATA(LS_T320WITH KEY WERKS = P_WERKS LGORT = P_LGORTO.    
IF SY-SUBRC EQ 0.      
READ TABLE LT_MLGN INTO DATA(LS_MLGNWITH KEY MATNR = LS_MARA-MATNR LGNUM = LS_T320-LGNUM.      
IF SY-SUBRC EQ 0.        

IF LV_YK  MOD LS_MLGN-LHMG1 <> 0.          
DATA(LV_MOD= LV_YK  MOD LS_MLGN-LHMG1.          LV_YK 

= LV_YK  - LV_MOD.        

ENDIF.      
ENDIF.    
ENDIF.    

IF LV_YK <= 0.      LV_MARK 

'X'.    

ENDIF.    

CHECK LV_MARK IS INITIAL.
***移库数量    LV_GOODSMVT_CODE 
'04'.    LS_GOODSMVT_HEADER

-PSTNG_DATE = SY-DATUM.    LS_GOODSMVT_HEADER
-DOC_DATE   = SY-DATUM.    LS_GOODSMVT_HEADER
-PR_UNAME   = SY-UNAME.    LS_GOODSMVT_ITEM

-MATERIAL     = LS_MARA-MATNR.    LS_GOODSMVT_ITEM
-PLANT        = P_WERKS.    LS_GOODSMVT_ITEM
-STGE_LOC     = P_LGORTO.    "源库位    LS_GOODSMVT_ITEM

-MOVE_TYPE    '311' .    LS_GOODSMVT_ITEM

-ENTRY_QNT    = LV_YK .    

"ls_goodsmvt_item-move_plant = '1124'.    LS_GOODSMVT_ITEM
-MOVE_STLOC = P_LGORTI.    LS_GOODSMVT_ITEM
-ORDER_ITNO '0001'.    

APPEND LS_GOODSMVT_ITEM TO LT_GOODSMVT_ITEM.    
CLEAR LS_GOODSMVT_ITEM.    

CALL FUNCTION 'BAPI_GOODSMVT_CREATE'      
EXPORTING        GOODSMVT_HEADER  
= LS_GOODSMVT_HEADER        GOODSMVT_CODE    
= LV_GOODSMVT_CODE      
IMPORTING        MATERIALDOCUMENT 
= LV_MATERIALDOCUMENT        MATDOCUMENTYEAR  
= LV_MATDOCUMENTYEAR      
TABLES        GOODSMVT_ITEM    
= LT_GOODSMVT_ITEM      
" goodsmvt_serialnumber = lt_serialnumber        
RETURN           = LT_RETURN.    

CLEAR LS_RETURN.    
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE CA 'AEX'.      LV_MESSAGE 
= LV_MESSAGE && LS_RETURN-MESSAGE.      
CLEAR LS_RETURN.    
ENDLOOP.    

"break-POINT .    

IF SY-SUBRC 0.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      

MESSAGE LV_MESSAGE TYPE 'E' DISPLAY LIKE 'S'.    

ELSE.      
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'        
EXPORTING          
WAIT 'X'.      LV_MESSAGE 

TEXT-003 && LV_MATERIALDOCUMENT.      
MESSAGE LV_MESSAGE TYPE 'S'.      

CLEAR LS_WMT005-BUDAT .      
SELECT SINGLE BUDAT         
INTO LS_WMT005-BUDAT        
FROM MKPF        
WHERE MBLNR  = LV_MATDOCUMENTYEAR           
AND MJAHR  = LV_MATERIALDOCUMENT.      LS_WMT005


-WERKS      = P_WERKS.      LS_WMT005
-MATNR     = LS_MARA.      LS_WMT005
-LGORT_O = P_LGORTO.      LS_WMT005
-LGORT_I    = P_LGORTI.      LS_WMT005
-MJAHR  = LV_MATDOCUMENTYEAR.      LS_WMT005
-MBLNR  = LV_MATERIALDOCUMENT.      LS_WMT005
-ZEILE       '0001'.      LS_WMT005
-MENGE   = LV_YK .      LS_WMT005
-BUDAT    = LS_WMT005-BUDAT.      
APPEND LS_WMT005 TO GT_ZXCWMT005.    

ENDIF.    

CLEAR LV_MARK.  


ENDLOOP.  

IF GT_ZXCWMT005 IS NOT INITIAL.    
MODIFY ZXCWMT005  FROM TABLE GT_ZXCWMT005 .    
COMMIT WORK AND WAIT.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_LOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SHOW_DATA .  
REFRESH GT_FIELDCAT.  MCR_APPEND_FIELD 
'TANUMO'           '下架TO'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'QDATUO'           '下架TO确认日期'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'QZEITO'             '下架TO确认时间'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'TANUMI'           '上架TO'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'QDATUI'           '上架TO确认日期'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'QZEITI'             '上架TO确认时间'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'WERKS'          '工厂'                         '' '' '' ''.  MCR_APPEND_FIELD 
'MATNR'            '料号'                         '' '' '' '40'.  MCR_APPEND_FIELD 
'LGORT_O'            '出库库位'                         '' '' '' '10'.  MCR_APPEND_FIELD 
'LGORT_I'            '入库库位'                         '' '' '' '10'.  MCR_APPEND_FIELD 
'MJAHR'            '物料凭证年度'                         '' '' '' '10'.  MCR_APPEND_FIELD 
'MBLNR'            '物料凭证'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'ZEILE'            '物料凭证行'                         '' '' '' '10'.  MCR_APPEND_FIELD 
'BUDAT'          '过账日期'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'MENGE'           '物料凭证数量'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'MENGE1'           'TO数量'                         '' '' '' '20'.  MCR_APPEND_FIELD 
'LENUM'           '仓储单位'                         '' '' '' '20'.  GS_LAYOUT_LVC

-CWIDTH_OPT  'X'.  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    
EXPORTING      I_CALLBACK_PROGRAM 
= SY-REPID
*     i_callback_pf_status_set = 'FRM_PF_STATUS_SET_ALV'
*     i_callback_user_command  = 'FRM_USER_COMMAND'      IT_FIELDCAT_LVC    
= GT_FIELDCAT      IS_LAYOUT_LVC      
= GS_LAYOUT_LVC      I_SAVE             
'A'    
TABLES      T_OUTTAB           
= GT_ZXCWMT005    
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.  
ELSE.  
ENDIF.



ENDFORM.
*&---------------------------------------------------------------------*
*&    Form  frm_pf_status_set
*&---------------------------------------------------------------------*
*     Set the status of the ALV
*----------------------------------------------------------------------*
FORM FRM_PF_STATUS_SET_ALV  USING UT_EXTAB TYPE SLIS_T_EXTAB.  
SET PF-STATUS 'STANDARD' EXCLUDING UT_EXTAB.
ENDFORM.                    " FRM_PF_STATUS_SET

*&---------------------------------------------------------------------*
*&    Form  frm_user_command
*&---------------------------------------------------------------------*
*     Fix the Error by the ALV enent
*----------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING UV_UCOMM    TYPE SY-UCOMM                            US_SELFIELD 
TYPE SLIS_SELFIELD.  
DATA: LO_GUID TYPE REF TO CL_GUI_ALV_GRID.  

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      E_GRID 
= LO_GUID.  
CALL METHOD LO_GUID->CHECK_CHANGED_DATA.  US_SELFIELD
-REFRESH 'X'.
ENDFORM.                    "frm_user_command
*&---------------------------------------------------------------------*
*& Form FRM_GET_LOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_LOG .  
RANGES:LR_LGORT FOR MARD-LGORT.  LR_LGORT
-SIGN 'I'.  LR_LGORT
-OPTION 'EQ'.  LR_LGORT
-LOW = P_LGORTI.  
APPEND LR_LGORT.  LR_LGORT

-SIGN 'I'.  LR_LGORT
-OPTION 'EQ'.  LR_LGORT
-LOW = P_LGORTO.  
APPEND LR_LGORT.  

SELECT *    
INTO CORRESPONDING FIELDS OF TABLE GT_ZXCWMT005    
FROM ZXCWMT005    

WHERE MATNR IN S_MATNR       
"AND BUDAT IN S_BUDAT       
AND WERKS = P_WERKS       
AND LGORT_I = P_LGORTI.  

SELECT WERKS,LGORT,LGNUM     
INTO TABLE @DATA(LT_T320)    
FROM T320    
WHERE WERKS = @P_WERKS        
AND LGORT IN @LR_LGORT.  


SORT GT_ZXCWMT005 BY MBLNR MJAHR.  
IF GT_ZXCWMT005[] IS NOT INITIAL.    
SELECT MBLNR,MJAHR,BUDAT      
FROM MKPF      
INTO TABLE @DATA(LT_MKPF)      
FOR ALL ENTRIES IN  @GT_ZXCWMT005      
WHERE MBLNR = @GT_ZXCWMT005-MBLNR        
AND BUDAT IN @S_BUDAT        
AND MJAHR = @GT_ZXCWMT005-MJAHR.    

SORT GT_ZXCWMT005 BY TANUMO.    

SELECT TANUM,      LGNUM
,      QDATU
,      QZEIT
,      VSOLM      

INTO TABLE @DATA(LT_LTAP_O)      
FROM LTAP        
FOR ALL ENTRIES IN @GT_ZXCWMT005      
WHERE TANUM = @GT_ZXCWMT005-TANUMO.    

SORT GT_ZXCWMT005 BY TANUMI.    

SELECT TANUM,      LGNUM
,      QDATU
,      QZEIT
,      VSOLM      

INTO TABLE @DATA(LT_LTAP_I)      
FROM LTAP        
FOR ALL ENTRIES IN @GT_ZXCWMT005      
WHERE TANUM = @GT_ZXCWMT005-TANUMI.  


ENDIF .  




LOOP AT GT_ZXCWMT005 ASSIGNING FIELD-SYMBOL(<FS01>).    

IF <FS01>-BUDAT IS INITIAL.      
READ TABLE LT_MKPF INTO DATA(LS_MKPFWITH KEY MBLNR = <FS01>-MBLNR MJAHR = <FS01>-MJAHR.      
IF SY-SUBRC EQ 0.        <FS01>
-BUDAT = LS_MKPF-BUDAT.      
ENDIF.    
ENDIF.    

READ TABLE LT_T320 INTO DATA(LS_T320WITH KEY WERKS = <FS01>-WERKS LGORT = <FS01>-LGORT_O.    
IF SY-SUBRC EQ 0.      

READ TABLE LT_LTAP_O INTO DATA(LS_LTAP_OWITH KEY TANUM = <FS01>-TANUMO LGNUM = LS_T320-LGNUM.      
IF SY-SUBRC EQ .        <FS01>
-QDATUO = LS_LTAP_O-QDATU.        <FS01>
-QZEITO    = LS_LTAP_O-QZEIT.        <FS01>
-MENGE1  = LS_LTAP_O-VSOLM.      
ENDIF.    
ENDIF.    

CLEAR LS_T320.    
READ TABLE LT_T320 INTO LS_T320 WITH KEY WERKS = <FS01>-WERKS LGORT = <FS01>-LGORT_I.    
IF SY-SUBRC EQ  0.      

READ TABLE LT_LTAP_I INTO DATA(LS_LTAP_IWITH KEY TANUM = <FS01>-TANUMI LGNUM = LS_T320-LGNUM.      
IF SY-SUBRC EQ .        <FS01>
-QDATUI = LS_LTAP_I-QDATU.        <FS01>
-QZEITI    = LS_LTAP_I-QZEIT.      
ENDIF.    
ENDIF.  



ENDLOOP.  

DELETE GT_ZXCWMT005 WHERE BUDAT IS INITIAL.  

SORT  GT_ZXCWMT005 BY MBLNR.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHANGE_SCREEN .  
DATA:LV_STR  TYPE STRING.  

LOOP AT SCREEN.    LV_STR 
SCREEN-NAME.    
SEARCH LV_STR FOR 'S_BUDAT'.    
IF SY-SUBRC 0.      
IF P_HILOG ''.        
SCREEN-ACTIVE    0.        
SCREEN-INVISIBLE 1.        
MODIFY SCREEN.      
ENDIF.    
ENDIF.  
ENDLOOP.

ENDFORM.
posted @ 2022-12-06 13:24  我肉山  阅读(42)  评论(0)    收藏  举报