iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
佛心分享-IT 人自學之術

從0開始的ABAP之旅 系列 第 22

Day 22 將報表輸出為EXCEL並存在指定路徑

  • 分享至 

  • xImage
  •  

Hi 大家好
今天來介紹如何將ALV報表下載為EXCEL檔並存放在指定路徑,
一般如果想將ALV下載成EXCEL用ALV提供的標準EXPORT功能就好,
這個方法的限制是必須先執行報表等資料顯示出來後再下載,
但是如果報表的資料量非常大,
那執行程式的時間也會很久,
所以我們可以透過程式讓報表改為背景下載的方式並存放到我們要的路徑

前台先指定下載路徑

selection-screen begin of block b1 with frame title text-001. 
parameters:rb_down type c radiobutton group g1 user-command com. "radio buttom讓user決定要下載還是顯示報表
parameter: p_path like rlgrap-filename obligatory default '/sapmnt/PD1/' modif id z1,
           rb_alv type c radiobutton group g1 default 'X'.   "p_path用來指定路徑
selection-screen end of block b1.

這邊要留意後台下載是用sap application server 去跑所以只能指定到server的路徑,
如果server是linux環境就要用linux的路徑不能用windows

at selection-screen output.
  case 'X'.
    when rb_down.

    when rb_alv.
      perform hide_para using 'Z1'.
  endcase.
form hide_para  using    p_grp.
  loop at screen.
    screen-input = '1'.    "預設啟用
    if screen-group1 = p_grp.
      screen-input = '0'.
    endif.
    modify screen.
  endloop.
endform.      

這邊做個小功能,
當user選擇顯示ALV時將路徑的欄位反灰

處理下載功能

data: mess type string.
        
"宣告 path_ov 用來儲存文件路徑與檔名,v_line 用來儲存每一行要寫入文件的資料,l_date 用來儲存日期。
data:path_ov type rlgrap-filename,
       v_line type string,
       l_date(10) type c. 
field-symbols: <v_fd> type any.
  
concatenate p_path  p_budat '_'  sy-datum  '.xls' into path_ov."產生輸出文件的路徑和檔名

"嘗試以輸出模式打開檔案,如果打開失敗,錯誤訊息會儲存在 mess 中 
open dataset path_ov for output in text mode encoding default message mess.
  
  if sy-subrc = 0. "如果開啟成功
  
 組合欄位名稱,這些欄位名稱代表的是內表的欄位名稱。使用水平制表符(cl_abap_char_utilities=>horizontal_tab)作為分隔符來將欄位名稱拼接成一行,並寫入到文件中。
    concatenate 'Material' 'Plant' 'Desc.' 'Total Stock' 'Stock Value'  into v_line separated by
cl_abap_char_utilities=>horizontal_tab.


    transfer v_line to path_ov.

    field-symbols: <l_tab> type any.
    data: t type string,
          lv_descr type ref to cl_abap_typedescr.

"這段程式會循環遍歷內表 i_itab,並將每一行的數據寫入到檔案中
    loop at i_itab assigning <l_tab> .
      do.
        clear: lv_descr.
        assign component sy-index of structure <l_tab> to <v_fd>.

        if sy-subrc = 0.
          lv_descr ?= cl_abap_datadescr=>describe_by_data( <v_fd> ).
          if lv_descr->get_relative_name( ) = 'LVC_T_STYL'.
            continue.
          endif.
          if sy-index = 1.
            v_line = <v_fd>.
          else.
            t = <v_fd>.
            concatenate v_line t into v_line separated by cl_abap_char_utilities=>horizontal_tab.
          endif.
        else.

          exit.
        endif.
      enddo.

      transfer v_line to path_ov.
    endloop.

  else.
    message mess type 'S' display like 'E'.
  endif.

以上就是今天的分享,
當我們的報表有大量資料時就可以透過背景下載的方式,
避免程式卡住執行太久,
也可以配合排程做成每周或每月自動下載到指定路徑。


上一篇
Day21 非不得已不要用的技巧-直接修改TABLE
下一篇
Day23 ABAP規格書撰寫 ( 所有程式都適用)
系列文
從0開始的ABAP之旅 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言