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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP 内表的行列转换-发货通知单-打印到Excel里相关的知识,希望对你有一定的参考价值。

技术分享

 

需要传入数据到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 

以上是关于ABAP 内表的行列转换-发货通知单-打印到Excel里的主要内容,如果未能解决你的问题,请参考以下文章

abap怎么把字段类型不一样的一个内表的数据填充到另外一个内表中。

XML文件与ABAP结构/内表的转换

XML文件和ABAP内表数据的相互转换(基础篇)

ABAP 中内表的复制

ABAP 内表数据类型转换

abap 内表的结构体比数据库的结构体少一个client字段,怎么把内表的数据添加到数据库中?