SAP打印出库单 新需求

*&---------------------------------------------------------------------*
*& Report  Z_SD_CKD
*&
*&---------------------------------------------------------------------*
*&产品出库单
*&
*&---------------------------------------------------------------------*

REPORT ZSDF002.
INCLUDE ZSDF002_INC.
*INCLUDE Z_SD_CKD_INC.
TYPE-POOLS: slis.
TABLES:LIKP, KNA1, LIPS ,MKPF ,MSEG.


TYPESBEGIN OF TY_ALL,

        VBELV        LIKE  VBFA-VBELV ,  "销售订单号
        VBELN_IM     LIKE  MSEG-VBELN_IM ,"交货单号
        NAME1        LIKE  KNA1-NAME1 ,"客户
        KUNNR        LIKE  MSEG-KUNNR ,"送达方
        STRAS        LIKE  KNA1-STRAS ,"客户地址
        BUDAT_MKPF   LIKE  MSEG-BUDAT_MKPF ,"出库时间
        TELFX        LIKE  KNA1-TELFX ,"电话
        USNAM_MKPF   LIKE  MSEG-USNAM_MKPF ,"经办人
        MATNR        LIKE  MSEG-MATNR ,"物料编码
        ARKTX        LIKE  LIPS-ARKTX ,"物料描述
        LGORT        LIKE  MSEG-LGORT ,"库存地点
        MENGE        LIKE  MSEG-MENGE ,"数量
        VRKME        LIKE  LIPS-VRKME ,"单位
        CHARG        LIKE  MSEG-CHARG ,"批次
        VBELP_IM     LIKE  MSEG-VBELP_IM ,"项目
        BOLNR        LIKE  LIKP-BOLNR ,"物流单号
        BRGEW        LIKE  LIPS-BRGEW,"单项目毛重
        BEIZHU(20)   TYPE ,"备注
  END OF TY_ALL.

  TYPES:BEGIN OF TY_HEADER,
        VBELV        LIKE  VBFA-VBELV ,  "销售订单号
        VBELN_IM     LIKE  MSEG-VBELN_IM ,"交货单号
        NAME1        LIKE  KNA1-NAME1 ,"客户
        KUNNR        LIKE  MSEG-KUNNR ,"送达方
        STRAS        LIKE  KNA1-STRAS ,"客户地址
        BUDAT_MKPF   LIKE  MSEG-BUDAT_MKPF ,"出库时间
        TELFX        LIKE  KNA1-TELFX ,"电话
        USNAM_MKPF   LIKE  MSEG-USNAM_MKPF ,"经办人
       TOTAL_BRGEW   LIKE LIPS-BRGEW,"项目总毛重
       BOLNR         LIKE LIKP-BOLNR,"物流单号
    END OF TY_HEADER.

  TYPES:BEGIN OF TY_ITEMS,
        VBELN_IM     LIKE  MSEG-VBELN_IM ,"交货单号
       MATNR        LIKE  MSEG-MATNR ,"物料编码
        ARKTX        LIKE  LIPS-ARKTX ,"物料描述
        LGORT        LIKE  MSEG-LGORT ,"库存地点
        MENGE        LIKE  MSEG-MENGE ,"数量
        VRKME        LIKE  LIPS-VRKME ,"单位
        CHARG        LIKE  MSEG-CHARG ,"批次
        VBELP_IM     LIKE  MSEG-VBELP_IM ,"项目
        BRGEW        LIKE  LIPS-BRGEW,"单项目毛重
        BOLNR        LIKE  LIKP-BOLNR ,"物流单号
        BEIZHU(20)   TYPE ,"备注
    END OF TY_ITEMS.

 DATA:WA_ALL TYPE TY_ALL,
      GT_ALL TYPE TY_ALL OCCURS 0.

 DATA:WA_HEADER TYPE TY_HEADER,
      GT_HEADER TYPE TY_HEADER OCCURS 0  .

 DATA:WA_ITEMS TYPE TY_ITEMS,
      GT_ITEMS TYPE TY_ITEMS OCCURS 0.


*定义传入到smartforms的变量开始
DATA:fm_name TYPE rs38l_fnam.
DATA:itemsname(32TYPE c.
DATA:headername(32TYPE c.
*定义传入到smartforms的变量结束


*定义存储ALV向smartforms传入数据的内表开始
DATA:GT_HEADER_TEMP TYPE TY_HEADER OCCURS 0.
DATA:GT_ITEMS_TEMP TYPE TY_ITEMS OCCURS 0.
DATA:GT_ALL_TEMP TYPE TY_ALL OCCURS 0.
*定义存储ALV向smartforms传入数据的内表结束

"控制smartforms参数声明开始
DATA :control_parameters TYPE ssfctrlop.
"控制smartforms参数声明结束


DATA: gs_fcat TYPE lvc_s_fcat,
      gt_fcat TYPE lvc_t_fcat,
      gs_layo TYPE lvc_s_layo,
      gs_grid TYPE lvc_s_glay.
DATA: gt_event TYPE slis_t_event WITH HEADER LINE,
      gt_event_exit TYPE slis_t_event_exit WITH HEADER LINE.

DATA:  ref_grid TYPE REF TO cl_gui_alv_grid .

START-OF-SELECTION.
SELECT-OPTIONS: P_VBELN    FOR MSEG-VBELN_IM"交货单号
                P_WERKS    FOR MSEG-WERKS "工厂 ,
                P_LGORT    FOR MSEG-LGORT  ,"库存地点
                P_BUDAT    FOR MKPF-BUDAT,"过账日期
                P_USNAM    FOR MKPF-USNAM."创建者
                "P_TPLST   FOR VTTK-TPLST ,
                "P_ERNAM   FOR VTTK-ERNAM ,
                "P_ROUTE   FOR VTTK-ROUTE .
PERFORM FRM_GET_DATA.
PERFORM display_data .

END-OF-SELECTION.

"当屏幕失去焦点时,自动刷新声明类开始
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_modify
    FOR EVENT data_changed_finished OF cl_gui_alv_grid
    IMPORTING e_modified et_good_cells.
ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
*    PERFORM refresh.

    DATA stbl TYPE lvc_s_stbl.

    stbl-row 'X'." 基于行的稳定刷新
    stbl-col 'X'." 基于列稳定刷新
    CALL METHOD ref_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "HANDLE_MODIFY
ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .
"当屏幕失去焦点时,自动刷新声明类结束

FORM FRM_GET_DATA .
      SELECT VA~VBELV  M~VBELN_IM K~NAME1 M~KUNNR K~STRAS M~BUDAT_MKPF
             K~TELFX  M~USNAM_MKPF M~MATNR   LS~ARKTX M~LGORT  M~MENGE
             LS~VRKME  M~CHARG  M~VBELP_IM  LP~BOLNR LS~BRGEW
         INTO CORRESPONDING FIELDS OF TABLE GT_ALL
      FROM   MSEG AS M

      INNER JOIN MKPF AS MF
      ON M~MBLNR = MF~MBLNR AND MF~MJAHR M~MJAHR
      INNER JOIN  LIPS AS LS
      ON M~VBELN_IM = LS~VBELN AND M~VBELP_IM = LS~POSNR
      INNER JOIN LIKP AS LP
      ON LP~VBELN  = LS~VBELN
      INNER JOIN KNA1 AS K
      ON K~KUNNR = LP~KUNNR
      INNER JOIN VBFA AS VA
      ON VA~VBELN = LS~VBELN AND VA~POSNN = LS~POSNR

      WHERE M~VBELN_IM IN  P_VBELN   AND
            M~WERKS    IN  P_WERKS     AND
            M~LGORT    IN   P_LGORT AND
            MF~BUDAT   IN  P_BUDAT    AND
            MF~USNAM   IN  P_USNAM  .

"DELETE ADJACENT DUPLICATES FROM GT_ALL.

 ENDFORM.


FORM display_data .
  PERFORM set_fcat.
  PERFORM set_layout.

  PERFORM show_alv  TABLES gt_fcat  GT_ALL[]
                     USING  gs_layo.
ENDFORM.                    " DISPLAY_DATA

*&---------------------------------------------------------------------*
FORM set_fcat .   
PERFORM csalv_set_fcat USING:

" 'Field' 'Text' 'Edit' 'Zero' 'Type' 'Qfieldname' 'Key' 'Hostspot' 'Emphasize' 'Checkbox'             
'VBELV'  '销售订单号' '' ''  ''  ''  ''   ''  ''  '' '' '',             
'VBELN_IM' '交货单号'   ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'NAME1' '客户'       ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'KUNNR' '送达方'     ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'VBELP_IM' '项目'    '' ''  ''  ''  ''  ''  ''  '' ''   '',             
'MATNR'  '物料编码'  ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'ARKTX'  '物料描述'  ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'VRKME'  '单位'      ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'MENGE'   '数量'     ''  ''  ''  ''  ''  ''  ''  '' ''  '0',             
'BRGEW'     '毛重'     ''  ''  ''  ''  ''  ''  ''  '' ''  '0',             
'LGORT'   '库存地点' ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'USNAM_MKPF'  '经办人'    ''  ''  ''  ''  ''  ''  ''  '' ''  '',             
'BEIZHU'  '备注'     'X'  ''  ''  ''  ''  ''  ''  '' '' ''.            


" 'zsel'   '是否打印 ' 'X' ''  ''  ''  ''  ''  ''  'X' ''.

ENDFORM.                    " SET_FCAT
*&---------------------------------------------------------------------*
FORM set_layout .   gs_layo
-zebra             'X'.
*  gs_layout-stylefname     = 'FIELD_STYLE'.
*  gs_layo-CWIDTH_OPT        =  'X'.
ENDFORM.                    " SET_LAYOUT
*&---------------------------------------------------------------------*
FORM csalv_set_fcat USING       p_name       p_text       p_edit       p_zero       p_type       p_qfieldname       p_key       p_hotspot       p_emphasize       p_checkbox       P_DO_SUM       P_decimals_out











.   gs_fcat
-fieldname   =  p_name.
*  gs_fcat-reptext_l   =
*  gs_fcat-selddictxt   =   gs_fcat
-reptext     =  p_text.   gs_fcat
-edit        =  p_edit.   gs_fcat
-no_zero     =  p_zero.   gs_fcat
-datatype    =  p_type.   gs_fcat
-qfieldname  =  p_qfieldname.   gs_fcat
-key         =  p_key.   gs_fcat
-hotspot     =  p_hotspot.   gs_fcat
-emphasize   =  p_emphasize.   gs_fcat
-checkbox    =   p_checkbox.   gs_fcat
-DO_SUM      =  P_DO_SUM.   gs_fcat
-decimals_o  =  P_decimals_out.   
APPEND gs_fcat TO  gt_fcat.
ENDFORM.                    "csalv_set_fcat

*&---------------------------------------------------------------------*

FORM show_alv TABLES  pt_fcat                       pt_tab               

USING   ps_layout.   gs_grid


-edt_cll_cb 'X'."当屏幕失去焦点时,自动刷新   gt_event

-name 'CALLER_EXIT'.   "slis_ev_caller_exit_at_start事件   gt_event
-FORM 'FM_BUTTON'.   
APPEND gt_event .   

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'   
EXPORTING     i_callback_program                  
= sy-repid     i_callback_user_command            
'USER_COMMAND'     i_grid_settings                    
= gs_grid     i_callback_pf_status_set            
'SET_PF_STATUS'     is_layout_lvc                       
= gs_layo     it_fieldcat_lvc                     
= pt_fcat[]      it_events                          
= gt_event[]
*     it_event_exit                     = gt_event_exit[]   
TABLES     t_outtab                            
= pt_tab    
EXCEPTIONS      PROGRAM_ERROR                     
1      
OTHERS                            2     
.
ENDFORM.                    "csalv_set_fcat




FORM PRINT.

DATA:PTR_COUNT(10TYPE C.
DATAlines TYPE I."获取往smartforms传入的要打印的行数目
DATA: insertRows TYPE i."需要再插入多少空行
DATAROWS TYPE VALUE 16."一页要打印的行数

CLEAR GT_ALL_TEMP.
CLEAR GT_HEADER_TEMP.
CLEAR GT_ITEMS_TEMP.   

DATA COUNT LIKE LIPS-BRGEW VALUE 0.   
DATA:ls_row      TYPE lvc_s_row,        lt_rows     
type lvc_t_row.        
"CLEAR GT_HEADER.       
"CLEAR GT_ITEMS.       
CALL METHOD ref_grid->get_selected_rows     
IMPORTING       et_index_rows 
= lt_rows
*      et_row_no     =       
.       



LOOP AT lt_rows INTO ls_row.         
READ TABLE GT_ALL INTO WA_ALL INDEX ls_row-index.         
APPEND WA_ALL TO GT_ALL_TEMP.
*        APPEND WA_ITEMS TO GT_ITEMS_TEMP.
*         COUNT = WA_ITEMS-BRGEW + COUNT.        
ENDLOOP.       
MOVE-CORRESPONDING GT_ALL_TEMP TO GT_HEADER.       
MOVE-CORRESPONDING GT_ALL_TEMP TO GT_ITEMS.       
DELETE ADJACENT DUPLICATES FROM GT_HEADER.
*      LOOP AT GT_ITEMS INTO WA_ITEMS.       
CLEAR: CONTROL_PARAMETERS.       CONTROL_PARAMETERS
-PREVIEW   'X'.       CONTROL_PARAMETERS
-NO_OPEN   'X'.       CONTROL_PARAMETERS
-NO_CLOSE  'X'.


CALL FUNCTION 'SSF_OPEN'     
EXPORTING       CONTROL_PARAMETERS 
= CONTROL_PARAMETERS     
EXCEPTIONS       FORMATTING_ERROR   
1       INTERNAL_ERROR     
2       SEND_ERROR         
3       USER_CANCELED      
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.     
EXIT.   
ENDIF.     


LOOP AT GT_HEADER INTO WA_HEADER.           

APPEND WA_HEADER TO GT_HEADER_TEMP.           
LOOP AT GT_ITEMS INTO WA_ITEMS.                 
IF ( WA_ITEMS-VBELN_IM EQ WA_HEADER-VBELN_IM .                       
APPEND WA_ITEMS TO GT_ITEMS_TEMP.                       
COUNT = WA_ITEMS-BRGEW + COUNT.                 
ENDIF.           
ENDLOOP.           WA_HEADER
-TOTAL_BRGEW COUNT.     
MODIFY TABLE GT_HEADER_TEMP FROM WA_HEADER.       
CLEAR WA_ITEMS.       
CLEAR WA_HEADER.       
CLEAR COUNT.            
IF GT_ITEMS_TEMP IS INITIAL.                 
MESSAGE i000(0kWITH  '请选中要打印的内容!'.                 
EXIT .             
ENDIF.             

call function 'SSF_FUNCTION_MODULE_NAME'             
EXPORTING               formname 
'ZSDSF002'               
IMPORTING                 fm_name 
= fm_name                 
EXCEPTIONS                   no_form 
1                   no_function_module 
2                   
OTHERS 3.            
"SET HANDLER   gt_event_receiver->handle_modify FOR ref_grid.            
DESCRIBE TABLE GT_ITEMS_TEMP LINES lines.            insertRows 
=   lines mod ROWS .            insertRows 
ROWS - insertRows.            
DO insertRows TIMES.               
APPEND WA_ITEMS TO GT_ITEMS_TEMP.           
ENDDO.            
PERFORM FRM_PRINT_DATA.     
ENDLOOP.     

CALL FUNCTION 'SSF_CLOSE'     
EXCEPTIONS       FORMATTING_ERROR 
1       INTERNAL_ERROR   
2       SEND_ERROR       
3       
OTHERS           4.   

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 FRM_PRINT_DATA.



CONCATENATE 'ZDDITEMMM' SY-UZEIT INTO itemsname.
CONCATENATE 'ZDDHEADER' SY-UZEIT INTO headername.  savebuffer GT_ITEMS_TEMP itemsname

.  savebuffer GT_HEADER_TEMP headername
.
*  PTR_COUNT =  GV_COUNT .
*调用 smartForms  
call function fm_name  
EXPORTING    control_parameters 
= CONTROL_PARAMETERS    PTR_ITEMS 
= itemsname    PTR_HEADER 
= headername
*   PTR_TOTAL = GV_COUNT  
EXCEPTIONS    formatting_error 
1    internal_error 
2    send_error 
3    user_canceled 
4.  clearbuffer itemsname
.  clearbuffer headername
.
CLEAR GT_HEADER_TEMP.
CLEAR GT_ITEMS_TEMP.
ENDFORM.



*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM      text
*      -->PS_SELFIELD  text
*----------------------------------------------------------------------*

FORM user_command USING r_ucomm LIKE sy-ucomm       rs_selfield 
TYPE slis_selfield.   


CASE r_ucomm.     
WHEN '&DATA_SAVE'.     
WHEN '&PRINT'.           
PERFORM PRINT.     
WHEN OTHERS.           

LEAVE TO SCREEN 0.   
ENDCASE.

ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab..   
SET PF-STATUS 'STANDARD'.
ENDFORM.                    "SET_PF_STATUS
*&---------------------------------------------------------------------*
*&      Form  fm_button
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->E_GRID     text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.   

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*   EXPORTING
*     IR_SALV_FULLSCREEN_ADAPTER       =   
IMPORTING
*     ET_EXCLUDING                     =
*     E_REPID                          =
*     E_CALLBACK_PROGRAM               =
*     E_CALLBACK_ROUTINE               =     e_grid                           
= ref_grid
*     ET_FIELDCAT_LVC                  =
*     ER_TRACE                         =
*     E_FLG_NO_HTML                    =
*     ES_LAYOUT_KKBLO                  =
*     ES_SEL_HIDE                      =
*     ET_EVENT_EXIT                    =
*     ER_FORM_TOL                      =
*     ER_FORM_EOL                      =     
.

*   CALL METHOD ref_grid->check_changed_data.
* 设置enter事件   
CALL METHOD ref_grid->register_edit_event     
EXPORTING       i_event_id 
= cl_gui_alv_grid=>mc_evt_enter     
EXCEPTIONS       error      
1       
OTHERS     2.   


CREATE OBJECT gt_event_receiver.   
SET HANDLER   gt_event_receiver->handle_modify FOR ref_grid.
ENDFORM.                    "FM_BUTTON

原文地址:https://www.cnblogs.com/eagle-dtq/p/5178130.html