ABAP 承运路单

*&---------------------------------------------------------------------*
*& Report  ZSDR010
*&
*&---------------------------------------------------------------------*
*&程序名称:承运路单
*&事物代码:ZSD030
*&导入模板:无
*&作者:
*&时间:2016/3/2
*&更新时间:2016/3/2
*&--------------------------------------------------------------------

REPORT zsdr010.
INCLUDE zsdr010_inc.

TYPE-POOLS: slis.
TABLES:likp, kna1, lips ,vttp ,vttk.


TYPESBEGIN OF ty_all,
         tknum      LIKE  vttk-tknum"运单号
         tplst      LIKE  vttk-tplst"装运点
         tdlnr      LIKE  vttk-tdlnr"物流公司
         erdat      LIKE  vttk-erdat"装运日期
         route      LIKE  vttk-route"路线
         distz      LIKE  vttk-distz"里程
         add01      LIKE  vttk-add01"车主、车号
         add02      LIKE  vttk-add02"司机
         bfart      LIKE  vttk-bfart"车型
         ernam      LIKE  vttk-ernam"创建者
         shtyp      LIKE  vttk-shtyp"装运类型
         btgew_sum  LIKE likp-btgew"总重量

         tpnum      LIKE  vttp-tpnum"项目号
         vbeln      LIKE  vttp-vbeln"交货单号
         kunnr      LIKE  likp-kunnr"客户代码
         name1      LIKE  kna1-name1"客户名称
         btgew      LIKE  likp-btgew"重量
         gewei      LIKE  likp-gewei"重量单位
         volum      LIKE  likp-volum"体积
         voleh      LIKE  likp-voleh"体积单位


         beizhu(20TYPE "备注
       END OF ty_all.

TYPES:BEGIN OF ty_header,
        tknum      LIKE  vttk-tknum"运单号
        tplst      LIKE  vttk-tplst"装运点
        tplst_text LIKE  ttdst-bezei,"装运点描述
        tdlnr      LIKE  vttk-tdlnr"物流公司
        tdlnr_text LIKE  lfa1-name1"物流公司描述
        erdat      LIKE  vttk-erdat"装运日期
        route      LIKE  vttk-route"路线
        route_text LIKE  tvrot-bezei,"路线描述
        distz      LIKE  vttk-distz"里程
        add01      LIKE  vttk-add01"车主、车号
        add02      LIKE  vttk-add02"司机
        bfart      LIKE  vttk-bfart"车型
        ernam      LIKE  vttk-ernam"创建者
        shtyp      LIKE  vttk-shtyp"装运类型
        btgew_sum  LIKE likp-btgew"总重量
        beizhu(20TYPE "备注
      END OF ty_header.

TYPES:BEGIN OF ty_items,
        tknum      LIKE  vttk-tknum"运单号
        tpnum      LIKE  vttp-tpnum"项目号
        vbeln      LIKE  vttp-vbeln"交货单号
        kunnr      LIKE  likp-kunnr"客户代码
        name1      LIKE  kna1-name1"客户名称
        btgew      LIKE  likp-btgew"重量
        gewei      LIKE  likp-gewei"重量单位
        volum      LIKE  likp-volum"体积
        voleh      LIKE  likp-voleh"体积单位


        beizhu(20TYPE "备注
      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传入数据的内表结束

*ALV显示头数据开始
DATA:gt_header_show TYPE ty_header OCCURS 0.
DATA:gt_items_show TYPE ty_items OCCURS 0.
*ALV显示头数据结束


"控制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_tknum    FOR vttk-tknum  "运单号
                  p_shtyp    FOR vttk-shtyp,"装运类型
                  p_tdlnr    FOR vttk-tdlnr   ,"服务代理
                  p_route    FOR vttk-route,"装运线路
                  p_ernam    FOR vttk-ernam,"创建者
                  p_erdat    FOR vttk-erdat  "装运日期
  "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 .
  TYPESBEGIN OF ty_tknum ,"存储动态显示列的内表结构
           tknum LIKE  vttk-tknum "运单号
           btgew LIKE  likp-btgew"一个运单对应的重量
         END OF ty_tknum.

  DATA : hs_tknum TYPE HASHED TABLE OF ty_tknum WITH UNIQUE KEY tknum WITH HEADER LINE .

  SELECT vk~tknum vk~tplst vk~tdlnr vk~erdat vk~route vk~distz
         vk~add01 vk~add02 vk~bfart vk~ernam vk~shtyp
         vp~tpnum vp~vbeln lp~kunnr k~name1  lp~btgew lp~gewei
         lp~volum lp~voleh
    FROM vttk AS vk
    INNER JOIN vttp AS vp
    ON vk~tknum = vp~tknum
    INNER JOIN likp AS lp     
ON vp~vbeln = lp~vbeln     INNER 
JOIN kna1 AS k     
ON k~kunnr = lp~kunnr     
INTO CORRESPONDING FIELDS OF TABLE gt_all     

WHERE ( vk~tknum IN p_tknum       
AND vk~erdat IN p_erdat       
AND vk~route IN p_route       
AND vk~tdlnr IN p_tdlnr       
AND vk~ernam IN p_ernam       
AND vk~shtyp IN p_shtyp ).   

LOOP AT gt_all INTO wa_all.     
IF wa_all-gewei NE  'KG'.       

CALL FUNCTION 'UNIT_CONVERSION_SIMPLE'         
EXPORTING           
input                = wa_all-btgew           round_sign           
'X'           unit_in              
'G'           unit_out             
'KG'         
IMPORTING           
output               = wa_all-btgew         
EXCEPTIONS           conversion_not_found 
01           division_by_zero     
02           input_invalid        
03.     
ENDIF.     hs_tknum

-tknum = wa_all-tknum.     hs_tknum
-btgew = wa_all-btgew.     
COLLECT hs_tknum.   
ENDLOOP.   

SORT gt_all ASCENDING BY tknum  ."BUDAT_MKPF CPUTM_MKPF.   

MOVE-CORRESPONDING gt_all TO gt_header_show.   
MOVE-CORRESPONDING gt_all TO gt_items_show.   

DELETE ADJACENT DUPLICATES FROM gt_header_show COMPARING tknum.   
SORT gt_items_show BY tknum tpnum.   
CLEAR wa_header.   
LOOP AT gt_header_show INTO wa_header.     
READ TABLE hs_tknum WITH KEY tknum = wa_header-tknum.     wa_header
-btgew_sum = hs_tknum-btgew.     

SELECT SINGLE bezei FROM ttdst INTO wa_header-tplst_text       
WHERE tplst eq wa_header-tplst.      
SELECT SINGLE bezei FROM tvrot INTO wa_header-route_text        
WHERE route eq wa_header-route.      
SELECT SINGLE name1 FROM lfa1 INTO wa_header-tdlnr_text        
WHERE lifnr eq wa_header-tdlnr.     
MODIFY gt_header_show FROM wa_header.     
CLEAR wa_header.   
ENDLOOP.

ENDFORM.


FORM display_data .   
PERFORM set_fcat.   
PERFORM set_layout.   

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

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

" 'Field' 'Text' 'Edit' 'Zero' 'Type' 'Qfieldname' 'Key' 'Hostspot' 'Emphasize' 'Checkbox'             
'TKNUM'  '运单号' '' ''  ''  ''  ''   ''  ''  '' '' '' '' '10',             
'TPLST' '装运点'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '5',             
'TPLST_TEXT' '装运点名称'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '30',             
'TDLNR' '物流公司代码'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '15',             
'TDLNR_TEXT' '物流公司'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '30',             
'ERDAT' '装运日期'  ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '10',             
'ROUTE' '装运线路'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '10',             
'ROUTE_TEXT' '装运线路描述'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '30',             
'SHTYP'  '装运类型'      ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '5',             
'BTGEW_SUM' '总重量(KG)'   ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '10',             
'DISTZ' '里程'       ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '10',             
'ADD02'     '司机' ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '10',             
'BFART'   '车型' ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '5',             
'ERNAM'  '创建者'    ''  ''  ''  ''  ''  ''  ''  '' ''  '' '' '20',             

'BEIZHU'  '备注'     '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       p_no_out       p_outputlen













.   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.   gs_fcat
-no_out      =  p_no_out.   gs_fcat
-outputlen   =  p_outputlen.   
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[]       i_save                   
'X'
*     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 22."一页要打印的行数   

CLEAR gt_all_temp.   
CLEAR gt_header.   
CLEAR gt_items.   
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_header_show INTO wa_header INDEX ls_row-index.     
APPEND wa_header TO gt_header.     
LOOP AT gt_items_show INTO wa_items.       
IF ( wa_header-tknum EQ wa_items-tknum ).         
APPEND wa_items TO gt_items.       
ENDIF.     
ENDLOOP.   

ENDLOOP.   

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_header-tknum EQ wa_items-tknum  .         
APPEND wa_items TO gt_items_temp.       

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           
'ZSDSF003'       
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."每一个表头数据向smartforms传入数据   
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' OR '&PRT'.       
PERFORM print.     
WHEN OTHERS.       

LEAVE PROGRAM.   
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/5244310.html