快速开始系列-(报表)分发程序推送模板

REPORT ZFIR0412.

TABLES: EKPO.
TYPE-POOLS: SLISICON.

TYPESBEGIN OF TY_ALV,
         WERKS        TYPE EKPO-WERKS" 材料价格  工厂  EWERK
         MATNR        TYPE EKPO-MATNR" 物料  MATNR
         MAKTX        TYPE MAKT-MAKTX"物料描述 MAKTX
         WBS_ID       TYPE EKPO-WBS_ID"工作号  ZPS_POSID
         AEDAT        TYPE EKPO-AEDAT"日期 PAEDT
         ZYEAR(4)     TYPE C"  年份  ZYEAR
         ZMONTH(2)    TYPE C"月份  ZMONTH
         NETPR        TYPE EKPO-NETPR"材料价格 BPREI
         ADDITIONAL1  TYPE STRING"预留字段1  ADDITIONAL1
         ADDITIONAL2  TYPE STRING"预留字段2  ADDITIONAL2
         ADDITIONAL3  TYPE STRING"预留字段3  ADDITIONAL3
         ADDITIONAL4  TYPE STRING"预留字段4  ADDITIONAL4
         ADDITIONAL5  TYPE STRING"预留字段5  ADDITIONAL5
         ADDITIONAL6  TYPE STRING"预留字段6  ADDITIONAL6
         ADDITIONAL7  TYPE STRING"预留字段7  ADDITIONAL7
         ADDITIONAL8  TYPE STRING"预留字段8  ADDITIONAL8
         ADDITIONAL9  TYPE STRING"预留字段9  ADDITIONAL9
         ADDITIONAL10 TYPE STRING"预留字段10 ADDITIONAL10
         VPRSV        TYPE QBEW-VPRSV,
         VERPR        TYPE QBEW-VERPR,
         STPRS        TYPE QBEW-STPRS,
         ICON(4)      TYPE C,
         ZMSG         TYPE CHAR100,
         CHK          TYPE C,
       END OF TY_ALV.

TYPES:BEGIN OF TY_MBEW,
        MATNR TYPE MBEW-MATNR,
        VPRSV TYPE  MBEW-VPRSV,
        VERPR TYPE MBEW-VERPR,
        STPRS TYPE MBEW-STPRS,
      END OF TY_MBEW.

DATA: GT_SEL TYPE STANDARD TABLE OF TY_ALV.
*      GS_SEL TYPE TY_ALV.

DATA: GT_ALV      TYPE  TABLE OF TY_ALV,
      GS_ALV      TYPE TY_ALV,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GT_FIELDCAT TYPE LVC_T_FCAT,
      GS_LAYOUT   TYPE LVC_S_LAYO.

*----------------- 宏定义 -----------------------------
DEFINE FIELDCATSET.
  gs_fieldcat-fieldname = &1."内表字段名
  gs_fieldcat-coltext   = &2."报表输出名
  gs_fieldcat-ref_table = &3."参考表名
  gs_fieldcat-ref_field = &4."参考字段名
  gs_fieldcat-hotspot   = &5."单击响应
  gs_fieldcat-checkbox  = &6."复选框
  gs_fieldcat-edit      = &7."编辑
  gs_fieldcat-icon      = &8"显示为图标
  gs_fieldcat-no_out    = &9"不显示
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR  gs_fieldcat.
END-OF-DEFINITION.

SELECTION-SCREEN BEGIN OF BLOCK B2 .
SELECT-OPTIONS: S_WERKS FOR  EKPO-WERKS,
            S_MATNR FOR EKPO-MATNR.
PARAMETERS P_NUM   TYPE DEFAULT 1000.
PARAMETERS C_CHK AS CHECKBOX.
PARAMETERS P_LFGJA TYPE MBEW-LFGJA DEFAULT '2022 '.
PARAMETERS P_LFMON TYPE MBEW-LFMON DEFAULT '03'.
SELECTION-SCREEN END OF BLOCK B2.

START-OF-SELECTION.

*  IF RB_LOG IS NOT INITIAL.
*    PERFORM FRM_GET_LOG_DATA.
*  ELSE.
  IF C_CHK 'X'.
    PERFORM FRM_GET_ALL_DATA.
  ELSE.
    PERFORM FRM_GET_DATA.
  ENDIF.

  PERFORM FRM_DEAL_DATA.
  IF SY-BATCH IS NOT INITIAL.
    PERFORM FRM_SEND_DATA.
  ENDIF.

  PERFORM FRM_SET_LAYOUT.
  PERFORM FRM_SET_FIELDCAT.
  PERFORM FRM_SET_OUTPUT.
*  PERFORM FRM_PROCESS_DATA.
*  ENDIF.

*----------------------------------------------------------------------*
* End-of-selection/结束选择事件
*----------------------------------------------------------------------*
END-OF-SELECTION.
  CLEAR:GT_SEL.
*  IF RB_SEND IS NOT INITIAL.
*    PERFORM FRM_GET_SELECTED_ROWS USING space.
*    PERFORM FRM_SEND_DATA.
*  ELSE.

*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA.
  DATA:LV_START TYPE SY-DATUM.
  DATA:LV_END TYPE SY-DATUM.

  LV_START = SY-DATUM.

  CONCATENATE LV_START+0(6'01' INTO LV_START.

  CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
    EXPORTING
      DAY_IN            = LV_START
    IMPORTING
      LAST_DAY_OF_MONTH = LV_END.


  SELECT
    EKPO~WERKS,
    EKPO~MATNR,
    AEDAT,
    WBS_ID,
    NETPR
    FROM EKPO
    INTO CORRESPONDING FIELDS OF TABLE @GT_ALV  ##DB_FEATURE_MODE[TABLE_LEN_MAX1]  ##TOO_MANY_ITAB_FIELDS
     WHERE ELIKZ  'X'
       AND AEDAT >= @LV_START
       AND AEDAT <= @LV_END
       AND WERKS IN @S_WERKS
     AND MATNR IN @S_MATNR.


  SORT GT_ALV BY WERKS MATNR WBS_ID AEDAT DESCENDING.
  DELETE ADJACENT DUPLICATES FROM GT_ALV COMPARING WERKS MATNR WBS_ID.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
  CLEAR GS_LAYOUT.
  GS_LAYOUT-ZEBRA        'X' .       " 使ALV界面呈现颜色交替
  GS_LAYOUT-CWIDTH_OPT   'X' .       " 自动优化列宽
  GS_LAYOUT-BOX_FNAME 'CHK'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
  CLEAR GT_FIELDCAT.
  FIELDCATSET'ICON' '状态' '' '' '' '' '' '' ''  .
  FIELDCATSET'ZMSG' '状态消息' '' '' '' '' '' '' ''  .
  FIELDCATSET'WERKS' '工厂' '' '' '' '' '' '' '' .
  FIELDCATSET'MATNR' '物料' 'MARA' 'MATNR' '' '' '' '' '' .
  FIELDCATSET'MAKTX' '物料描述' '' '' '' '' '' '' '' .
  FIELDCATSET'AEDAT' '日期' '' '' '' '' '' '' '' .
*  FIELDCATSET: 'ZYEAR' '' '' '' '' '' '' '' '' .
  FIELDCATSET'ZYEAR' '年份' '' '' '' '' '' '' '' .
  FIELDCATSET'ZMONTH' '月份' '' '' '' '' '' '' '' .
  FIELDCATSET'WBS_ID' '工作号' '' '' '' '' '' '' ''  .  FIELDCATSET
'NETPR' '材料价格' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL1' '预留字段1' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL2' '预留字段2' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL3' '预留字段3' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL4' '预留字段4' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL5' '预留字段5' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL6' '预留字段6' '' '' '' '' '' '' ''  .
*  FIELDCATSET: '' '创建人' ' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL7' '预留字段7' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL8' '预留字段8' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL9' '预留字段9' '' '' '' '' '' '' ''  .  FIELDCATSET
'ADDITIONAL10' '预留字段10' '' '' '' '' '' '' ''  .

*  LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>).
*    IF <fs_fieldcat>-fieldname = 'ZFYCYE'.
*      <fs_fieldcat>-datatype = 'CURR'.
*    ENDIF.
*  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_output
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_OUTPUT .  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    
EXPORTING      I_INTERFACE_CHECK        
' '      I_CALLBACK_PROGRAM       
= SY-REPID      I_CALLBACK_PF_STATUS_SET 
'FRM_SET_STATUS'      I_CALLBACK_USER_COMMAND  
'FRM_USER_COMMAND'
*     i_default                = 'X'
*     i_save                   = 'U'      I_SAVE                   
'A'
*     i_structure_name         = 'ZSDT009'      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.##NEEDED ##CALLED 
FORM FRM_SET_STATUS USING P_EXTAB TYPE SLIS_T_EXTAB .
*  DATA: BEGIN OF ex_tab OCCURS 0,
*          fcode LIKE sy-ucomm,
*        END OF ex_tab.
*
*  REFRESH ex_tab.
*      ex_tab-fcode = 'UPLOAD'.
*      APPEND ex_tab.

*  SET PF-STATUS 'STATUS' EXCLUDING ex_tab.  
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.                    "F_SET_STATUS
FORM FRM_USER_COMMAND USING P_UCOMM TYPE SY-UCOMM ##CALLED                          P_RS_SELFIELD 
TYPE SLIS_SELFIELD .  
DATA: LR_GRID  TYPE REF TO CL_GUI_ALV_GRID.  


CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      E_GRID 
= LR_GRID.  
CALL METHOD LR_GRID->CHECK_CHANGED_DATA.  P_RS_SELFIELD
-REFRESH 'X'.  "自动刷新  

CASE P_UCOMM.    
WHEN '&SEND'.  "下发      
PERFORM FRM_GET_SELECTED_ROWS USING LR_GRID.      
PERFORM FRM_SEND_DATA.  
ENDCASE.  

FREE LR_GRID.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_selected_rows
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LR_GRID
*&---------------------------------------------------------------------*
FORM FRM_GET_SELECTED_ROWS USING P_LR_FRID TYPE REF TO CL_GUI_ALV_GRID.  
DATA : LS_ROWS TYPE LVC_S_ROW,         LT_ROWS 
TYPE LVC_T_ROW.  
IF P_LR_FRID IS INITIAL.    
LOOP AT GT_ALV INTO GS_ALV.      
APPEND GS_ALV TO GT_SEL.    
ENDLOOP.  
ELSE.    
CALL METHOD P_LR_FRID->GET_SELECTED_ROWS      
IMPORTING        ET_INDEX_ROWS 
= LT_ROWS[].    

CLEAR: LS_ROWS, GT_SEL.    
LOOP AT  LT_ROWS INTO LS_ROWS.      
READ TABLE GT_ALV INTO DATA(LS_ALVINDEX LS_ROWS-INDEX.      
IF SY-SUBRC 0.        
"只处理ALV状态为空(未发送)或者发送失败了的数据
*        IF LS_ALV-LIGHT IS INITIAL OR LS_ALV-LIGHT = ICON_RED_LIGHT.        
APPEND LS_ALV TO GT_SEL.        
CLEAR: LS_ALV.
*        ENDIF.      
ENDIF.    
ENDLOOP.    

CLEAR GT_ALV.    
APPEND LINES OF GT_SEL TO GT_ALV.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_send_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SEND_DATA .  

CONSTANTS:" GC_MSGTY_SUCCESS  TYPE C VALUE 'S',
"             GC_MSGTY_ERROR    TYPE C VALUE 'E',
"             GC_SIGN_INCLUDE   TYPE C VALUE 'I',
"             GC_OPTION_EQUAL   TYPE TEXT2 VALUE 'EQ',             GC_INIF_ID
(6)     TYPE VALUE 'ZFI412'"接口编号             GC_SRC_SYSTEM
(3)  TYPE VALUE 'SAP'"源系统             GC_DEST_SYSTEM
(3TYPE VALUE 'X5'.    "目标系统  
DATA: LO_CLIENTPROXY       TYPE REF TO ZPO_CO_SI_FICO412_ERP_SENDER,
*          ls_output            TYPE zpo_api_return1,
*          ls_input             TYPE zpo_api_return_response1,        LO_SYSTEM_FAULT      
TYPE REF TO CX_AI_SYSTEM_FAULT,        LV_ERROR             
TYPE C,##NEEDED        LV_MSGTY             
TYPE SY-MSGTY,        LO_ASYNC_MESSAGING   
TYPE REF TO IF_WSPROTOCOL_ASYNC_MESSAGING,
"        LO_MSG_ID_PROTOCOL   TYPE REF TO IF_WSPROTOCOL_MESSAGE_ID,
"        LO_ACK_STATUS_SIMPLE TYPE PRX_ACK_STATUS,
"        LO_ACK_STATUS_DETAIL TYPE PRX_ACK_STATUS_DETAIL_TABLE,        LO_ACK_REQUEST       
TYPE PRX_ACK_REQUEST_DETAILS,        LV_MSG               
TYPE STRING.  
DATA:LS_OUT  TYPE ZPO_MT_FICO412,
*       LS_IN   TYPE ZPO_MT_MM427_RET,       LS_LINE 
TYPE ZPO_DT_FICO412_LINE_OF_DOCS,       LT_LINE 
TYPE ZPO_DT_FICO412_LINE_OF_DOC_TAB.
*  DATA:LS_ZTMM427A TYPE ZTMM427A.
"  DATA:LV_WERKS TYPE T001L-WERKS.  
DATA: LV_INTF_ID  TYPE ZIFEID,        LV_ERR_INFO 
TYPE BAPI_MSG.

* &---------------------------------------------------------------------*
* 1实例化发送proxy
*&---------------------------------------------------------------------*  
TRY.      
CREATE OBJECT LO_CLIENTPROXY.      LO_ASYNC_MESSAGING ?= LO_CLIENTPROXY
->GET_PROTOCOL( IF_WSPROTOCOL=>ASYNC_MESSAGING ).      
CLEAR LO_ACK_REQUEST.      LO_ACK_REQUEST 
= IF_WSPROTOCOL_ASYNC_MESSAGING=>CO_TRANSPORT_ACKNOWLEDGMENT.      LO_ASYNC_MESSAGING
->SET_ACKNOWLEDGMENT_REQUESTED( LO_ACK_REQUEST ).    
CATCH CX_AI_SYSTEM_FAULT INTO LO_SYSTEM_FAULT.      LV_MSG   
= LO_SYSTEM_FAULT->GET_TEXT).      LV_MSGTY 
'E'.      LV_ERROR 
= ABAP_TRUE.  
ENDTRY.  

"先更新状态再发送  
LOOP AT GT_ALV INTO GS_ALV WHERE CHK 'X'.   ##ENH_OK  
MOVE-CORRESPONDING GS_ALV TO LS_LINE.    
IF LS_LINE-AEDAT IS INITIAL OR LS_LINE-AEDAT '00000000'.      
CLEAR LS_LINE-AEDAT.    
ENDIF.    
APPEND LS_LINE TO LT_LINE.    

IF LINES( LT_LINE = P_NUM."分批推送      
IF LT_LINE IS INITIAL.        
MESSAGE TEXT-004 TYPE 'E'."请选择已保存的数据进行下发      
ELSE.        LS_OUT
-MT_FICO412-CONTROL-INTF_ID = GC_INIF_ID.        LS_OUT
-MT_FICO412-CONTROL-SRC_SYSTEM = GC_SRC_SYSTEM.        LS_OUT

-MT_FICO412-CONTROL-DEST_SYSTEM = GC_DEST_SYSTEM.        LS_OUT
-MT_FICO412-CONTROL-COMPANY_CODE ''.        LS_OUT
-MT_FICO412-CONTROL-SEND_TIME = SY-UZEIT.
*    LS_OUT-MT_FICO412-WERKS = LV_WERKS.        LS_OUT
-MT_FICO412-LINE_OF_DOCS = LT_LINE.        LV_INTF_ID 
= GC_INIF_ID.
*&---------------------------------------------------------------------*
* 2. 检查接口开关状态
*&---------------------------------------------------------------------*        
CALL FUNCTION 'ZFM_PI_CHECK_INTERFACE_STATUS'          
EXPORTING            IV_INTERFACE_ID 
= LV_INTF_ID          
IMPORTING            EV_ERROR_INFO   
= LV_ERR_INFO.        
IF LV_ERR_INFO IS INITIAL.
**&---------------------------------------------------------------------*
*** 3数据发送
***&---------------------------------------------------------------------*          
TRY.              
CALL METHOD LO_CLIENTPROXY->SI_FICO412_ERP_SENDER                       "调用数据接口数据传输方法                
EXPORTING                  
OUTPUT = LS_OUT.            
CATCH CX_AI_SYSTEM_FAULT INTO LO_SYSTEM_FAULT.              LV_MSG   
= LO_SYSTEM_FAULT->GET_TEXT).              LV_ERROR 
= ABAP_TRUE.              LV_MSGTY 
'E'.          
ENDTRY.          
COMMIT WORK.          
IF LV_ERROR IS NOT INITIAL.            
MESSAGE '发送失败' TYPE 'S' DISPLAY LIKE 'E'."            GS_ALV
-ZMSG = LV_MSG  && '推送失败!'.            GS_ALV
-ICON = ICON_RED_LIGHT.            
MODIFY GT_ALV FROM GS_ALV TRANSPORTING ZMSG ICON WHERE CHK 'X' .          
ELSE.            
MESSAGE '推送完成' TYPE 'S'."            GS_ALV
-ZMSG = LV_MSG && '推送完成!'.            GS_ALV
-ICON = ICON_GREEN_LIGHT.            
MODIFY GT_ALV FROM GS_ALV TRANSPORTING ZMSG ICON WHERE CHK 'X' .          
ENDIF.        
ELSE.          
MESSAGE '接口未启用' TYPE 'S' DISPLAY LIKE 'E'."请选择已保存的数据进行下发        
ENDIF.      
ENDIF.      
CLEAR:LT_LINE.    
ENDIF.  

ENDLOOP.  

IF LT_LINE IS INITIAL.    
MESSAGE TEXT-004 TYPE 'E'."请选择已保存的数据进行下发  
ELSE.    LS_OUT
-MT_FICO412-CONTROL-INTF_ID = GC_INIF_ID.    LS_OUT
-MT_FICO412-CONTROL-SRC_SYSTEM = GC_SRC_SYSTEM.    LS_OUT

-MT_FICO412-CONTROL-DEST_SYSTEM = GC_DEST_SYSTEM.    LS_OUT
-MT_FICO412-CONTROL-COMPANY_CODE ''.    LS_OUT
-MT_FICO412-CONTROL-SEND_TIME = SY-UZEIT.
*    LS_OUT-MT_FICO412-WERKS = LV_WERKS.    LS_OUT
-MT_FICO412-LINE_OF_DOCS = LT_LINE.    LV_INTF_ID 
= GC_INIF_ID.
*&---------------------------------------------------------------------*
* 2. 检查接口开关状态
*&---------------------------------------------------------------------*    
CALL FUNCTION 'ZFM_PI_CHECK_INTERFACE_STATUS'      
EXPORTING        IV_INTERFACE_ID 
= LV_INTF_ID      
IMPORTING        EV_ERROR_INFO   
= LV_ERR_INFO.    
IF LV_ERR_INFO IS INITIAL.
**&---------------------------------------------------------------------*
*** 3数据发送
***&---------------------------------------------------------------------*      
TRY.          
CALL METHOD LO_CLIENTPROXY->SI_FICO412_ERP_SENDER                       "调用数据接口数据传输方法            
EXPORTING              
OUTPUT = LS_OUT.        
CATCH CX_AI_SYSTEM_FAULT INTO LO_SYSTEM_FAULT.          LV_MSG   
= LO_SYSTEM_FAULT->GET_TEXT).          LV_ERROR 
= ABAP_TRUE.          LV_MSGTY 
'E'.      
ENDTRY.      
COMMIT WORK.      
IF LV_ERROR IS NOT INITIAL.        
MESSAGE '发送失败' TYPE 'S' DISPLAY LIKE 'E'."        GS_ALV
-ZMSG = LV_MSG   && '推送失败!'.        GS_ALV
-ICON = ICON_RED_LIGHT.        
MODIFY GT_ALV FROM GS_ALV TRANSPORTING ZMSG ICON WHERE CHK 'X' .      
ELSE.        
MESSAGE '推送完成' TYPE 'S' DISPLAY LIKE 'E'."        GS_ALV
-ZMSG = LV_MSG  && '推送完成!'.        GS_ALV
-ICON = ICON_GREEN_LIGHT.        
MODIFY GT_ALV FROM GS_ALV TRANSPORTING ZMSG ICON WHERE CHK 'X' .      
ENDIF.    
ELSE.      
MESSAGE '接口未启用' TYPE 'S' DISPLAY LIKE 'E'."    
ENDIF.  
ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_log_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_ALL_DATA ."第一次全量推送时  
DATA:LT_MBEW TYPE TABLE OF TY_MBEW.
"       LS_MBEW TYPE TY_MBEW.  

"期初全量时  
"带工作号  
SELECT   
" EKPO~WERKS,    QBEW
~MATNR,   
" AEDAT,   PRPS
~POSID AS  WBS_ID,    VPRSV
,    VERPR
,    STPRS
,    LFGJA 
AS ZYEAR,    LFMON  
AS ZMONTH    
FROM QBEW    
LEFT JOIN PRPS ON PRPS~PSPNR = QBEW~PSPNR    
INTO CORRESPONDING FIELDS OF TABLE @GT_ALV  ##TOO_MANY_ITAB_FIELDS    
WHERE WERKS IN @S_WERKS    
AND QBEW~MATNR IN @S_MATNR      
AND QBEW~BWKEY '2031'                   
AND QBEW~LFGJA = @P_LFGJA                   
AND QBEW~LFMON = @P_LFMON.  


"不带工作号
*  WITH +DATA AS ( SELECT DISTINCT MATNR FROM @GT_ALV AS LT_DATA )  
SELECT    MBEW
~MATNR,    VPRSV
,  VERPR
,  STPRS
,    LFGJA 
AS ZYEAR,    LFMON  
AS ZMONTH    
FROM MBEW    
APPENDING CORRESPONDING FIELDS OF TABLE @GT_ALV   ##TOO_MANY_ITAB_FIELDS   
WHERE MBEW~BWKEY IN @S_WERKS    
AND MBEW~MATNR IN @S_MATNR    
AND  MBEW~BWKEY '2031'     
AND MBEW~LFGJA = @P_LFGJA     
AND MBEW~LFMON = @P_LFMON.  

SORT LT_MBEW BY MATNR.  

LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<LINE>).    
IF <LINE>-VPRSV 'V' .      <LINE>
-NETPR = <LINE>-VERPR.    
ELSEIF  <LINE>-VPRSV 'S' .      <LINE>
-NETPR = <LINE>-STPRS.    
ENDIF.  
ENDLOOP.  

SORT GT_ALV BY WERKS MATNR.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DEAL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DEAL_DATA .  
TYPES:BEGIN OF TY_MAKT,          MATNR 
TYPE MAKT-MATNR,          MAKTX 
TYPE MAKT-MAKTX,        
END OF TY_MAKT.  
DATA:LT_MAKT TYPE TABLE OF TY_MAKT.  

WITH +DATA AS SELECT DISTINCT MATNR FROM @GT_ALV AS LT_DATA )  ##DB_FEATURE_MODE[ITABS_IN_FROM_CLAUSE]  ##ITAB_KEY_IN_SELECT  
SELECT    MAKT
~MATNR,    MAKTX  

FROM MAKT  INNER 
JOIN +DATA ON +DATA~MATNR = MAKT~MATNR                  
AND MAKT~SPRAS '1'  
INTO TABLE @LT_MAKT.  
SORT LT_MAKT BY MATNR.  

DATA:LV_START TYPE SY-DATUM,       LV_END   
TYPE SY-DATUM.  

LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<LINE>).    
READ TABLE LT_MAKT INTO DATA(LS_MAKTWITH KEY MATNR = <LINE>-MATNR BINARY SEARCH.    
IF SY-SUBRC 0.      <LINE>
-MAKTX = LS_MAKT-MAKTX.    
ENDIF.    

IF <LINE>-AEDAT IS NOT INITIAL.      <LINE>
-ZYEAR = <LINE>-AEDAT+0(4).      <LINE>
-ZMONTH = <LINE>-AEDAT+4(2).    
ENDIF.    
IF SY-BATCH IS NOT INITIAL ."后台作业时选中全部数据      <LINE>
-CHK 'X'.    
ENDIF.    

IF <LINE>-WBS_ID IS NOT INITIAL.      
CALL FUNCTION 'PSPNUM_EXTERN_TO_INTERN_CONV'        
EXPORTING          EXT_NUM 
= <LINE>-WBS_ID        
IMPORTING          INT_NUM 
= <LINE>-WBS_ID.    
ENDIF.    

IF C_CHK IS NOT INITIAL AND ( <LINE>-AEDAT IS INITIAL OR <LINE>-AEDAT '00000000' )"全量推送时 当日期为空时      
CLEAR:LV_START,LV_END.      
CONCATENATE <LINE>-ZYEAR <LINE>-ZMONTH  '01' INTO LV_START."第一天      
CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'        
EXPORTING          I_DATE 
= LV_START        
IMPORTING          E_DATE 
= LV_END"最后一天      <LINE>
-AEDAT = LV_END.    
ENDIF.  
ENDLOOP.

ENDFORM.
posted @ 2022-05-24 15:25  别忘了带红领巾  阅读(52)  评论(5)    收藏  举报