码迷,mamicode.com
首页 > 其他好文 > 详细

ABAP 内表的行列转换-发货通知单-打印到Excel里

时间:2016-02-20 11:55:19      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

需要传入数据到Excel里的模板如上图所示

 

 

 

*&---------------------------------------------------------------------*
*& Report  Z_TEST_COL_TO_ROW_02
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT z_test_col_to_row_02.
TABLES: vttp,lips,likp,kna1 ,vttk.
INCLUDE ole2incl.

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 .

DATA: excel     TYPE ole2_object,
      workbook  TYPE ole2_object,
      sheet     TYPE ole2_object,
      cell      TYPE ole2_object,
      row       TYPE ole2_object.

TYPESBEGIN OF ty_all,
      tknum LIKE vttk-tknum,"运单号
      vbeln LIKE lips-vbeln,"交货单号
      tplst LIKE vttk-tplst ,"装运点
      name1 LIKE  kna1-name1 ,"客户
      erdat LIKE vttk-erdat ,"创建日期
      tdlnr LIKE vttk-tdlnr ,"物流公司
      route LIKE vttk-route ,"线路
      distz LIKE vttk-distz ,"里程
      add01 LIKE vttk-add01 ,"车主
      exti1 LIKE vttk-exti1 ,"卸货点
      add02 LIKE vttk-add02 ,"司机
      bfart LIKE vttk-bfart ,"车厢类型
      matnr LIKE lips-matnr,"物料编码
      arktx LIKE lips-arktx,"物料描述
      brgew LIKE lips-brgew,"货物单项目毛重
      lfimg LIKE lips-lfimg,"单项目数量
      vrkme LIKE  lips-vrkme ,"单位
      gewei LIKE lips-gewei,"重量单位
      lgort LIKE lips-lgort,"库存地点
     beizhu(30TYPE c,"备注
END OF ty_all.

TYPES:BEGIN OF ty_header,
      tknum LIKE vttk-tknum,"运单号
      vbeln LIKE lips-vbeln,"交货单号
      name1 LIKE  kna1-name1 ,"客户
      tplst LIKE vttk-tplst ,"装运点
      erdat LIKE vttk-erdat ,"装运日期
      tdlnr LIKE vttk-tdlnr ,"物流公司
      route LIKE vttk-route ,"线路
      distz LIKE vttk-distz ,"里程
      add01 LIKE vttk-add01 ,"车主
      exti1 LIKE vttk-exti1 ,"卸货点
      add02 LIKE vttk-add02 ,"司机
      bfart LIKE vttk-bfart ,"车厢类型
      total_brgew LIKE lips-brgew,"一个交货单的总重量
      lgort LIKE lips-lgort,"库存地点
    END OF ty_header.
*单据抬头结束

*单据明细开始
TYPES:BEGIN OF ty_items,
     tknum LIKE vttk-tknum,"运单号
     vbeln LIKE lips-vbeln,"交货单号
     name1 LIKE  kna1-name1 ,"客户
     matnr LIKE lips-matnr,"物料编码
     arktx LIKE lips-arktx,"物料描述
     brgew LIKE lips-brgew,"单项目毛重
     gewei LIKE lips-gewei,"重量单位
     lfimg LIKE lips-lfimg,"单项目数量
     vrkme LIKE  lips-vrkme ,"单位
     lgort LIKE lips-lgort,"库存地点
     beizhu(30TYPE c,"备注
    END OF ty_items.
*单据明细结束

DATA:wa_all TYPE ty_all,
      gt_all TYPE ty_all OCCURS 0.
DATA : hs_all TYPE HASHED TABLE OF ty_all WITH UNIQUE KEY tknum name1 WITH HEADER LINE .


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.

DATA: gt_header_show TYPE ty_header OCCURS 0.
DATA: gt_items_show 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参数声明结束

TYPESBEGIN OF ty_sum ,
        matnr LIKE lips-matnr,"物料编码
        arktx LIKE lips-arktx,"物料描述
        lfimg LIKE lips-lfimg,"单项目数量
        vrkme LIKE  lips-vrkme ,"单位
       name1 LIKE  kna1-name1 ,"客户
        lgort LIKE lips-lgort,"库存地点
       brgew LIKE lips-brgew,"单项目毛重
END OF ty_sum.

DATA : itab TYPE  ty_sum OCCURS ."WITH HEADER LINE ."从数据库中取出的数放入的内表
DATA : hs_sum TYPE HASHED TABLE OF ty_sum WITH UNIQUE KEY matnr arktx vrkme lgort name1 WITH HEADER LINE .
DATA : itab_sum TYPE STANDARD TABLE OF ty_sum WITH HEADER LINE .

TYPESBEGIN OF itab_sum,"行列转换后的内表
        matnr LIKE lips-matnr,"物料编码
        arktx LIKE lips-arktx,"物料描述
        line_sum TYPE ,
        vrkme LIKE  lips-vrkme ,"单位
        lgort LIKE  lips-lgort,"库存地点
        01 TYPE ,
        02 TYPE ,
        03 TYPE ,
        04 TYPE ,
        05 TYPE ,
        06 TYPE ,
        07 TYPE ,
        08 TYPE ,
        09 TYPE ,
        10 TYPE ,
        11 TYPE ,
        12 TYPE ,
        13 TYPE ,         
14 TYPE ,         
15 TYPE ,         
16 TYPE ,         
17 TYPE ,         
18 TYPE ,         
19 TYPE ,         
20 TYPE ,         
21 TYPE ,         
22 TYPE ,         
23 TYPE ,         
24 TYPE ,         
25 TYPE ,         
26 TYPE ,                  brgew_sum 

LIKE lips-brgew,
END OF itab_sum.
DATA:itab_out TYPE itab_sum OCCURS WITH HEADER LINE .


TYPESBEGIN OF ty_col ,"存储动态显示列的内表结构       name1 
LIKE  kna1-name1 ,"客户
END OF ty_col.

DATA : hs_col TYPE HASHED TABLE OF ty_col WITH UNIQUE KEY name1 WITH HEADER LINE .
DATA : itab_col TYPE STANDARD TABLE OF ty_col WITH HEADER LINE .

FIELD-SYMBOLS: <f_fs1> ,                <f_fs2>
.

START-OF-SELECTION.   
SELECT-OPTIONS: p_erdat   FOR vttk-erdat ,                   p_tknum   
FOR vttk-tknum ,                   p_tdlnr   
FOR vttk-tdlnr ,                   p_tplst   
FOR vttk-tplst ,                   p_ernam   
FOR vttk-ernam ,                   p_route   
FOR vttk-route .

START-OF-SELECTION.   
PERFORM getdata.   
PERFORM fixdata.   
PERFORM outdata.   

"parameters: p_fname like RLGRAP-FILENAME  default ‘C:\Users\DONG\Desktop\model.xls‘.
FORM getdata.   

SELECT *       
FROM vttk AS vk       INNER 
JOIN vttp AS vp         
ON vk~tknum = vp~tknum       INNER 
JOIN lips AS l         
ON l~vbeln = vp~vbeln       INNER 
JOIN likp AS lp         
ON lp~vbeln = l~vbeln       INNER 
JOIN kna1 AS k         
ON k~kunnr = lp~kunag       
INTO CORRESPONDING FIELDS OF TABLE gt_all       
WHERE             vk

~tknum IN  p_tknum AND (             vk
~erdat IN  p_erdat AND             vk
~tdlnr IN  p_tdlnr AND             vk
~tplst IN  p_tplst AND             vk
~ernam IN  p_ernam AND             vk
~route IN  p_route .   
SORT gt_all ASCENDING BY tknum.   
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  .   


DATA :sum_weight LIKE lips-brgew VALUE 0.   

LOOP AT gt_header_show INTO wa_header.     

LOOP AT gt_items_show INTO wa_items.       
IF wa_header-tknum EQ wa_items-tknum.         sum_weight 
=  wa_items-brgew + sum_weight.       
ENDIF.     


ENDLOOP.     wa_header
-total_brgew = sum_weight.     
MODIFY TABLE gt_header_show FROM wa_header.     
CLEAR sum_weight.   

ENDLOOP.   
CLEAR wa_header.   
CLEAR wa_items.   
MOVE-CORRESPONDING gt_all TO itab.
ENDFORM" GETDATA
*&---------------------------------------------------------------------*
*& Form FIXDATA
*&---------------------------------------------------------------------*
FORM fixdata.   
DATAindex LIKE sy-tabix .   
DATA:wa_itab TYPE  ty_sum.   
LOOP AT itab INTO wa_itab.     hs_sum 
= wa_itab.     
COLLECT hs_sum.     hs_col 
= wa_itab-name1 .     
COLLECT hs_col.   
ENDLOOP.   

SORT hs_col.   itab_col[] 
= hs_col[].   itab_sum[] 
= hs_sum[].   
LOOP AT itab_sum.     itab_out
-matnr = itab_sum-matnr .     itab_out
-arktx = itab_sum-arktx .     itab_out
-vrkme = itab_sum-vrkme .     itab_out
-lgort = itab_sum-lgort.     
READ TABLE itab_col WITH KEY name1 = itab_sum-name1 .     
index = sy-tabix + 5."3这个数字代表有几列是固定不变的     
ASSIGN COMPONENT index OF STRUCTURE itab_out TO <f_fs1>.     <f_fs1> 
= itab_sum-lfimg.     itab_out
-line_sum = itab_sum-lfimg.     itab_out
-brgew_sum = itab_sum-brgew.     
COLLECT itab_out.     
CLEAR itab_out.   
ENDLOOP.
ENDFORM" FIXDATA

FORM frm_catlg_set USING p_field p_text  p_key p_edit p_no_out .   gs_fcat


-fieldname   = p_field.   gs_fcat
-reptext     = p_text.   gs_fcat
-key         = p_key.   gs_fcat
-edit        = p_edit.   gs_fcat
-no_out      = p_no_out.   

IF p_field ‘LINE_SUM‘.     gs_fcat
-emphasize ‘C700‘.   
ENDIF.   
APPEND gs_fcat TO gt_fcat .   
CLEAR gs_fcat .
ENDFORM"frm_catlg_set

FORM fieldcat_init .   
DATAc(2TYPE n ,   txt
(20TYPE .   
PERFORM frm_catlg_set USING:         

‘MATNR‘ ‘物料编码‘ ‘X‘ ‘‘ ‘‘  ,         
‘ARKTX‘ ‘物料描述‘ ‘X‘ ‘‘ ‘‘ ,         
‘VRKME‘ ‘单位‘     ‘X‘ ‘‘ ‘‘ ,         
‘LGORT‘ ‘库存地点‘     ‘X‘ ‘‘ ‘‘.   
LOOP AT hs_col .     
c + 1.     
CONCATENATE ‘‘ INTO txt.     
PERFORM frm_catlg_set USING: txt hs_col-name1 ‘‘ ‘‘ ‘‘  .   
ENDLOOP.   
PERFORM frm_catlg_set USING‘LINE_SUM‘ ‘数量合计‘ ‘‘ ‘‘ ‘‘ .   
PERFORM frm_catlg_set USING‘BRGEW_sum‘ ‘毛重‘ ‘‘ ‘‘ ‘‘ .   gs_layo

-zebra             ‘X‘.

ENDFORM"fieldcat_init

FORM outdata.   
PERFORM fieldcat_init .   
PERFORM show_alv  TABLES gt_fcat  itab_out[]                        
USING  gs_layo.

ENDFORM" outdata

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 user_command USING r_ucomm LIKE sy-ucomm       rs_selfield 
TYPE slis_selfield.   


CASE r_ucomm.     
WHEN ‘&DATA_SAVE‘.     
WHEN ‘&SAVE‘ .       
"PERFORM PRINT.       
PERFORM data_to_excel.     
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

FORM fill_cell USING i_row  i_col  p_value.   

CALL METHOD OF excel ‘CELLS‘ = cell   

EXPORTING #1 = i_row  #2 = i_col.   

SET PROPERTY OF cell ‘VALUE‘ = p_value.

ENDFORM"fill_cell


FORM data_to_excel.

*  Create an Excel object and start Excel.   
CREATE OBJECT excel ‘EXCEL.APPLICATION‘.   
IF sy-subrc <> 0.     
MESSAGE ‘The excel object can‘‘t be created‘ TYPE ‘I‘.   
ENDIF.


*  Create an Excel workbook Object.   
CALL METHOD OF excel ‘WORKBOOKS‘ = workbook .

*  Transfer the header line to Excel.   
CALL METHOD OF workbook ‘OPEN‘ EXPORTING #1 ‘C:\Users\DONG\Desktop\model.xls‘.   

READ TABLE gt_header_show INTO wa_header INDEX 1.   

DATA:txt(30).   
CONCATENATE ‘运单号:‘  wa_header-tknum INTO  txt.   
PERFORM fill_cell USING 1 txt.   
CLEAR txt.   

CONCATENATE ‘装运点:‘  wa_header-tplst INTO  txt.   
PERFORM fill_cell USING 3 txt.   
CLEAR txt.   

DATA: l_erdat TYPE char10.   l_erdat 
= wa_header-erdat(4) && ‘-‘ && wa_header-erdat+4(2) && ‘-‘ && wa_header-erdat+6(2).   

CONCATENATE ‘装运日期:‘  l_erdat INTO  txt.   
PERFORM fill_cell USING 8 txt.   
CLEAR txt.   

CONCATENATE ‘物流公司:‘  wa_header-tdlnr INTO  txt.   
PERFORM fill_cell USING 1 txt.   
CLEAR txt.   

CONCATENATE ‘线路:‘  wa_header-route INTO  txt.   
PERFORM fill_cell USING 3 txt.   
CLEAR txt.   

DATA: l_distz TYPE char13.   l_distz 
= wa_header-distz.   
CONCATENATE ‘里程:‘  l_distz INTO  txt.   
PERFORM fill_cell USING 8 txt.   
CLEAR txt.   

CONCATENATE ‘车主/车号:‘  wa_header-add01 INTO  txt.   
PERFORM fill_cell USING 1 txt.   
CLEAR txt.   

CONCATENATE ‘卸货点:‘  wa_header-exti1 INTO  txt.   
PERFORM fill_cell USING 3 txt.   
CLEAR txt.   

CONCATENATE ‘司机:‘  wa_header-add02 INTO  txt.   
PERFORM fill_cell USING 8 txt.   
CLEAR txt.   

DATA:l_total_brgew TYPE char13.   l_total_brgew 
= wa_header-total_brgew.   
CONCATENATE ‘重量:‘  l_total_brgew INTO  txt.   
PERFORM fill_cell USING 1 txt.   
CLEAR txt.      

CONCATENATE ‘库存地点:‘  wa_header-lgort INTO  txt.   
PERFORM fill_cell USING 3 txt.   
CLEAR txt.      

CONCATENATE ‘车厢类型:‘  wa_header-bfart INTO  txt.   
PERFORM fill_cell USING 8 txt.   
CLEAR txt.   

CLEAR wa_header.   

DATA:wa_sum TYPE itab_sum,        l_row 
TYPE sy-index.   


FIELD-SYMBOLS: <f>.   

LOOP AT itab_out INTO wa_sum.     
CALL METHOD OF excel ‘ROWS‘ = row EXPORTING #1 ‘11‘ .     
CALL METHOD OF row ‘INSERT‘.     

CLEAR: l_row.     

DO.       
ASSIGN COMPONENT sy-index OF STRUCTURE wa_sum TO <f>.       
IF sy-index GT 9.         
EXIT.       
ENDIF.       

ADD TO l_row.       

PERFORM fill_cell USING 11 l_row <f>"wa_sum-matnr.
*      PERFORM fill_cell USING 11 2 wa_sum-arktx.
*      PERFORM fill_cell USING 11 3 wa_sum-line_sum.
*      PERFORM fill_cell USING 11 4 wa_sum-vrkme.
*      PERFORM fill_cell USING 11 6 wa_sum-01.
*      PERFORM fill_cell USING 11 7 wa_sum-02.
*      PERFORM fill_cell USING 11 8 wa_sum-03.
*      PERFORM fill_cell USING 11 9 wa_sum-04.
*      PERFORM fill_cell USING 11 10 wa_sum-05.     

ENDDO.     
"  CONCATENATE ‘‘ wa_sum-LGORT   INTO TXT.     
"PERFORM fill_cell USING 11 5 TXT.     
CLEAR txt.   
ENDLOOP.

*客户名称填充开始   
DATAc(2.   
DATA:cols TYPE i.   
LOOP AT hs_col .     
c + 1.     cols 
c + 5.     
CONCATENATE ‘‘ INTO txt.     
PERFORM fill_cell USING 8 cols hs_col-name1 .   
ENDLOOP.
*客户名称填充结束   

GET PROPERTY OF excel ‘ACTIVEWORKBOOK‘ = workbook.
*  release and exit Excel.   
CALL METHOD OF workbook ‘SAVE‘.   

CALL METHOD OF excel ‘QUIT‘.

*  Free all objects   
FREE OBJECT cell.   
FREE OBJECT workbook.   
FREE OBJECT excel.   excel
-handle -1.   
FREE OBJECT row.
ENDFORM.

ABAP 内表的行列转换-发货通知单-打印到Excel里

标签:

原文地址:http://www.cnblogs.com/eagle-dtq/p/5202871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!