Alv 總結


目 錄

 

1.     將得到並整理好的數據以ALV的形式顯示出來    4

1.1.     在子FORM(這里如:F_FIELDS)指定需要顯示的字段    4

1.2.     在子FORM(這里如:F_BUILD_LAYOUT)里設置ALV的全局屬性    4

1.3.     在子FORM(這里如:F_DISPLAY)里將內表中的數據進行顯示    5

1.4.     為ALV程序添加表頭標題(這里以添加HTML表頭標題為主)    5

1.4.1.     在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加一個參數    5

1.4.2.     在子FORM(F_TOP_OF_PAGE)里定義好需要的變量    5

1.4.3.     准備好所需數據,如登錄用戶的描述、制表日期等    6

1.4.4.     將表頭數據輸出    6

2.     函數"REUSE_ALV_GRID_DISPLAY_LVC"中輸入參數的應用    7

2.1.     排序    7

2.1.1.     在顯示ALV的子FORM里定義排序用到的變量    7

2.1.2.     設置好需要排序的字段    8

2.1.3.     在顯示ALV的函數的輸入參數里添加排序的屬性    8

2.2.     隱藏不必要的標准按鈕    8

2.2.1.     先在顯示ALV的子FORM里定義隱藏按鈕用到的變量    8

2.2.2.     得到需要隱藏的標准按鈕的"FCODE"    8

2.3.     自定義"工具欄"    9

2.3.1.     在顯示ALV的函數的輸入參數里指定自定義按鈕的子FORM    9

3.     熱點鏈接、用戶動作的捕捉、調用其他程序或標准事務程序    11

3.1.    在顯示ALV的函數的輸入參數里指定捕捉用戶動作的子FORM    11

3.2.    在"字段和列名"的子FORM(F_FIELDS)里,對需要鏈接的列添加"熱點"屬性    11

3.3.     操作代碼    11

3.4.     顯示具體細節    12

3.5.     調用其他事務    14

3.6.     打開並選擇文件:    14

4.     關於設置字段和列名的子FORMF_FIELDS)的參數設置:    15

4.1.     單列優化寬度    15

4.2.     單列求和或者取消求和,添加屬性    15

4.3.     對其方式    15

4.4.     作為圖標輸出    16

4.5.     固定列和關鍵列    16

4.6.     列的字符寬度    16

5.     單元格的F1F4幫助:    17

5.1.     F1幫助:    17

5.2.     F4幫助:    17

6.     輸入並保存、回調修改內表(輸入時的小數位錯位的問題、指定數據類型、小說位數)    17

7.     界面顏色的更改    18

7.1.     更改單元格(字體)的前景、背景顏色    19

7.2.     更改行的顏色和列的顏色:    19

7.3.     利用設置字段和列名子的FORM(F_FIELDS)里來設置列的顏色    20

8.     ALV自帶的最左端復選框按鈕和自定義復選框按鈕    20

8.1.     ALV自帶的復選框按鈕:    20

8.2.     自定義復選框按鈕    20

9.     按照上傳的模板格式導出為本地文件    21

9.1.     定義導出為EXCEL用到的數據變量    21

9.2.     上傳模板    21

9.3.     代碼    22

10.     ALV標題添加圖片    26

10.1.     上傳圖片    26

10.2.     在子FORM(F_TOP_OF_PAGE2)里的代碼    27

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ALV:SAP LIST VIEW,一種比較美觀的報表顯示工具

ALV用到的函數,目前我們有2個:REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC;兩個函數都可以將數據用ALV的形式顯示出來,只是方在一些小的地方有些不同。

其中第兩個函數都用到的全局變量為:1個類型池SLIS和一個指定列數的變量

DATA: v_pos       TYPE i .  " 指定第幾列

第1個函數用到的全局變量如下:

DATA: wa_fieldcat TYPE slis_fieldcat_alv ,    " 相當於工作區
           i_fieldcat  
TYPE slis_t_fieldcat_alv ,  " 存放列名的捏表
           i_layout    
TYPE slis_layout_alv .      " 負責整個ALV的全局屬性

第2個函數用到的全局變量:

DATA: wa_fieldcat TYPE lvc_s_fcat , " 相當於工作區
           i_fieldcat  
TYPE lvc_t_fcat , " 存放列名的捏表
           i_layout    
TYPE lvc_s_layo . " 負責整個ALV的全局屬性
    

下面以第2個函數(REUSE_ALV_GRID_DISPLAY_LVC)來介紹ALV的用法;

1.        將得到並整理好的數據以ALV的形式顯示出來

1.1.        在子FORM(這里如:F_FIELDS)指定需要顯示的字段

  v_pos = v_pos + 1 .
  wa_fieldcat -col_pos       = v_pos .       
" 指定列數
  wa_fieldcat -fieldname     = 
'PSPID' .     " 需要輸出的內表的字段名
  wa_fieldcat -scrtext_l     = 
'項目定義 '.  " 字段的描述-長字段標簽
  wa_fieldcat scrtext_m      = 
'項目定義 '.  " 字段描述-中字段標簽
  wa_fieldcat -scrtext_s     = 
'項目定義 '.  " 字段描述-短字段標簽
  wa_fieldcat -fix_column    = 
'X' .         " 是否是固定列
  
APPEND wa_fieldcat TO i_fieldcat_lvc .
  
CLEAR  wa_fieldcat .

這樣逐步的將需要顯示的字段都添加到內表i_fieldcat中;

1.2.        在子FORM(這里如:F_BUILD_LAYOUT)里設置ALV的全局屬性

  i_layout_lvc-zebra        = 'X' .       " 使ALV界面呈現顏色交替
  i_layout_lvc-sel_mode     = 
'A' .       " 選擇模式,"A"在最左端有選擇按鈕
  i_layout_lvc-cwidth_opt   = 
'X' .       " 自動優化列寬
  i_layout_lvc-detailinit   = 
'X' .       " 是否出現細節屏幕
  i_layout_lvc-detailtitl   = 
'詳細內容' . " 細節屏幕標題

1.3.        在子FORM(這里如:F_DISPLAY)里將內表中的數據進行顯示

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    
EXPORTING
      i_callback_program          = sy-repid          
" 當前程序
      is_layout_lvc               = i_layout_lvc      
" 屬性內表
      it_fieldcat_lvc             = i_fieldcat_lvc[]  
" 列明內表
      i_save                      = 
'X'               " 是否保存布局
    
TABLES
      t_outtab                    = i_tab             
" 數據內表
    
EXCEPTIONS
      program_error               = 
1
      
OTHERS                      = 2.

通過這一步后,一個基本的ALV程序就完成了;下面是對ALV程序的優化和擴展。

1.4.        為ALV程序添加表頭標題(這里以添加HTML表頭標題為主)

1.4.1.        在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加一個參數

i_callback_html_top_of_page       = 'F_TOP_OF_PAGE'    

其中"F_TOP_OF_PAGE"是書寫ALV表頭標題的子FORM,只是在這里使用,沒有明顯的"PERFORM"調用,如下:

FORM f_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.

1.4.2.        在子FORM(F_TOP_OF_PAGE)里定義好需要的變量

  " 定義登錄用戶的描述
  
DATA: l_name TYPE string ,
        name_first 
LIKE adrp-name_first ,
        name_last  
LIKE adrp-name_last .
  
" 定義登錄日期
  
DATA: l_date TYPE string .
  
" 定義緩沖區變量
  
DATA: m_p TYPE i ,
        m_buffer 
TYPE string .

1.4.3.        准備好所需數據,如登錄用戶的描述、制表日期等

  " 得到登錄用戶的描述
  
SELECT SINGLE adrp~name_first
                adrp~name_last
   
INTO (name_first,name_last)
   
FROM adrp
         INNER 
JOIN usr21 ON adrp~persnumber = usr21~persnumber
  
WHERE usr21~bname = sy-uname .

  
IF sy-subrc = 0 .
    
CONCATENATE name_last name_first INTO l_name .
  
ELSE .
    l_name = sy-uname .
  
ENDIF.
  
CLEAR name_first .
  
CLEAR name_last .

  
" 拼接制表日期
  
CONCATENATE sy-datum+0(2'.'
              sy-datum+
4(2'.'
              sy-datum+
6(2'.'
         
INTO l_date .

1.4.4.        將表頭數據輸出

  " 開始輸出表頭標題
  m_buffer = 
'<HTML><CENTER><H1>ALV測試</H1></CENTER></HTML>' .
  
CALL METHOD p_cl_dd->html_insert
    
EXPORTING
      contents = m_buffer
    
CHANGING
      
position = m_p.

  
" 輸出制表人和制表日期
  
CONCATENATE '<P ALIGN = CENTER >出表人:' l_name
            
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
            
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
            
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
            
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
            
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
            
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
            
'出表日期:' l_date INTO m_buffer .
  
CALL METHOD p_cl_dd->html_insert
    
EXPORTING
      contents = m_buffer
    
CHANGING
      
position = m_p.

現將需要顯示的表頭數據放到變量"M_BUFFER"中,然后調用方法"P_CL_DD->HEML_INSERT"將數據插入到HTML頁面中顯示,至此顯示表頭數據完成;

2.        函數"REUSE_ALV_GRID_DISPLAY_LVC"中輸入參數的應用

2.1.        排序

排序之前,如果同一列有相同的數據,則排好序以后,在該列會自動將相同的數據合並為一行顯示,不再出現多行重復的情況(但是若該ALV中有字段設置了"可編輯",合並這一現象會失效),步驟如下:

2.1.1.        在顯示ALV的子FORM里定義排序用到的變量

 " 定義排序變量
  
DATA: wa_sort_lvc TYPE lvc_s_sort ,
        it_sort_lvc 
TYPE lvc_t_sort .

    

2.1.2.        設置好需要排序的字段

 " 設置排序參數
  wa_sort_lvc-spos        = 
1 .           " 排序順序
  wa_sort_lvc-fieldname   = 
'CITYFROM' .  " 排序字段
  wa_sort_lvc-
up          = 'X' .         " 升序
  
APPEND wa_sort_lvc TO it_sort_lvc .
  
CLEAR wa_sort_lvc .

  wa_sort_lvc-spos        = 
2 .           " 排序順序
  wa_sort_lvc-fieldname   = 
'CITYTO' .  " 排序字段
  wa_sort_lvc-
up          = 'X' .         " 升序
  
APPEND wa_sort_lvc TO it_sort_lvc .
  
CLEAR wa_sort_lvc .

2.1.3.        在顯示ALV的函數的輸入參數里添加排序的屬性

it_sort_lvc                       = it_sort_lvc

2.2.        隱藏不必要的標准按鈕

2.2.1.        先在顯示ALV的子FORM里定義隱藏按鈕用到的變量

  " 定義隱藏標准按鈕的變量
  
DATA: wa_excluding TYPE slis_t_extab ,
        it_excluding 
TYPE slis_extab .

2.2.2.        得到需要隱藏的標准按鈕的"FCODE"

首先用事務碼"SE24"進入SAP的"類別制作器",在"Object type"后面輸入ALV的類"CL_GUI_ALV_GRID",點擊"Display"進入顯示界面,點擊"Attributes"選項卡,找到自己需要的"屬性"和"初始值",這個初始值就是我們要找的標准按鈕的"FCODE"(注意:每一個標准按鈕代表的FCODE是靠經驗積累而 掌握的);

  1. 、    設將需要隱藏的標准按鈕的"FCODE"添加到內表IT_EXCLUDING中,代碼如下:

      " 設置要隱藏的按鈕的"FCODE"
      wa_excluding-fcode = 
    '&ABC' .
      
    APPEND wa_excluding TO it_excluding .

  2. 、    在顯示ALV的函數的輸入參數里添加隱藏按鈕的屬性參數:

    it_excluding                      = it_excluding

  1. ALV標題,定義標題變量並賦值,然后在顯示ALV的函數的輸入參數里添加"小標題"的參數,代碼如下:

      " 小標題
      
    DATA: i_grid_title TYPE lvc_title .
      i_grid_title = 
    '小標題' .

         **********************************

         i_grid_title                      = i_grid_title

2.3.        自定義"工具欄"

2.3.1.        在顯示ALV的函數的輸入參數里指定自定義按鈕的子FORM

i_callback_pf_status_set          = 'F_SET_STATUS'

當然該子FORM和產生表頭的子FORM一樣,也不顯式的調用,代碼如下:

FORM f_set_status USING p_extab TYPE slis_t_extab .
  
SET PF-STATUS 'Z_ALV_STATUS' .
ENDFORM.                    " f_set_status

     雙擊其中的"Z_ALV_STATUS",進入創建工具欄的界面,輸入名字后進入最終的界面在界面右側,

點擊"應用工具條"后面的展開符號,在"項目"后面的白色方框內輸入"自定義按鈕"的代碼后回車,選擇靜態文本回車,在"函數文本"后面輸入想要顯示的按鈕的名稱,在"圖標名稱"后面選擇相應的圖標(可選),回車在這一界面選擇一個"快捷鍵"(必填)后回車,這樣一個自定義按鈕就做好了,也可以修改,記住剛剛創建的按鈕的代碼,在下面的捕捉用戶的動作的自FORM(F_USER_COMMAND)會根據剛才的代碼來進行相應的操作;

  1. 點開"功能鍵"后面的展開符號,進入功能鍵的設置,下圖是各個動作對應的代碼:

     

  2. 沒有自定義按鈕時候,函數里的"i_callback_pf_status_set  = 'F_SET_STATUS'"這個參數可以不要,這時會顯示ALV標准的按鈕,當然這些按鈕可以部分隱藏(見三、2);
  3. 當我們使用自定義按鈕后,ALV自帶的標准按鈕,就會失效,這時我們需要將一些用戶要求我們必須顯示的按鈕一一地在"應用工具條"后面補上,如下圖:

     

    其中"分隔符"的插入方法為:在需要插入分隔符的方框內選擇菜單"Edit"à"Insert"à"Separator line"即可插入分隔符;

    下面是上圖中的標准工具的名稱、代碼、圖標名稱、快捷鍵

    名稱

    代碼

    圖標名稱

    快捷鍵

    刷新

    REFRESH

    ICON_REFRESH

    F8(可隨便更改)

    導出為EXCEL表格

    EXCEL

    Shift-F8(可隨便更改)

    ABC 分析

    &ABC

    ICON_ABC

    Ctrl-F1

    按升序排列

    &OUP

    ICON_SORT_UP

    Ctrl-F4

    設置過濾器

    &ILT

    ICON_FILTER

    Ctrl-F5

    總計

    &UMC

    ICON_SUM

    Ctrl-F6

    郵件查收件

    %SL

    ICON_MAIL

    Ctrl-F7

    更改布局…

    &OL0

    ICON_ALV_VARIANTS

    Ctrl-F8

    選擇布局…

    &OAD

    ICON_ALV_VARIANT_CHOOSE

    Ctrl-F9

    保存布局…

    &AVE

    ICON_ALV_VARIANT_SAVE

    Ctrl-F10

    信息

    &INFO

    ICON_INFORMATION

    Ctrl-F12

    明細

    &ETA

    ICON_SELECT_DETAIL

    Ctrl-Shift-F3

    按降序排列

    &ODN

    ICON_SORT_DOWN

    Ctrl-Shift-F4

    刪除過濾器

    &ILD

    ICON_FILTER_UNDO

    Ctrl-Shift-F5

    小計…

    &SUM

    ICON_INTERMEDIATE_SUM

    Ctrl-Shift-F6

    Microsof

    &VEXCEL

    ICON_XLS

    Ctrl-Shift-F7

    字處理

    &AQW

    ICON_WORD_PROCESSING

    Ctrl-Shift-F8

    本地文件

    %PC

    ICON_EXPORT

    Ctrl-Shift-F9

    打印預覽

    &RNT_PREV

    ICON_LAYOUT_CONTROL

    Ctrl-Shift-F10

    圖形

    &GRAPH

    ICON_GRAPHICS

    Ctrl-Shift-F11

    上表中紅色的屬於自定義按鈕,自定義按鈕可以使用標准的圖標名稱,也可以不適用圖標;

3.        熱點鏈接、用戶動作的捕捉、調用其他程序或標准事務程序

3.1.    在顯示ALV的函數的輸入參數里指定捕捉用戶動作的子FORM

FORM f_user_command USING p_ucomm TYPE sy-ucomm
                          p_rs_selfield 
TYPE slis_selfield .

當然該子FORM和產生表頭的子FORM一樣,也不顯式的調用;

3.2.    在"字段和列名"的子FORM(F_FIELDS)里,對需要鏈接的列添加"熱點"屬性

  v_pos = v_pos + 1 .
  wa_fieldcat-col_pos       = v_pos .
  wa_fieldcat-fieldname     = 
'CITYFROM' .
  wa_fieldcat-scrtext_l     = 
'起飛城市' .
  wa_fieldcat-fix_column    = 
'X' .
  wa_fieldcat-
hotspot       = 'X' .     " 熱點,鏈接用
  
APPEND wa_fieldcat TO i_fieldcat .
  
CLEAR wa_fieldcat .

這樣在顯式界面上"起飛城市"所代表的字段"CITYFROM"的下面就會出現一條下划線,同時當鼠標移動到該列時,就會變成"等待"的手勢,當用戶單擊每一條時,就會觸動子FORM(F_USER_COMMAND)中的動作,進而引起某些操作;

3.3.        操作代碼

對於熱點鏈接,所對應的動作碼為"&IC1",在子FORM(F_USER_COMMAND)中捕捉用戶的動作,並進行相應的操作,代碼如下:

  FORM f_user_command USING p_ucomm TYPE sy-ucomm
                          p_rs_selfield 
TYPE slis_selfield .
  
CASE p_ucomm.
    
WHEN '&IC1' .   " 判斷用戶的動作
      
" 讀取用戶點擊的當前行的一行內容
      
READ TABLE i_tab INTO wa_tab INDEX p_rs_selfield-tabindex .
      
IF p_rs_selfield-fieldname EQ 'CITYFROM'.   " 判斷用戶點擊的是哪一列
        
IF NOT wa_tab-cityfrom IS INITIAL .
          
PERFORM f_show_detail USING p_rs_selfield .   " 顯示具體細節
        
ENDIF.
      
ELSEIF p_rs_selfield-fieldname EQ 'TCODE' .
        
IF NOT wa_tab-tcode IS INITIAL .
          
PERFORM f_call_tran USING p_rs_selfield .     " 調用其他事務
        
ENDIF .
      
ELSEIF p_rs_selfield-fieldname EQ 'ICON_FOLDER' .
        
PERFORM f_open_folder USING p_rs_selfield .     " 打開文件
      
ENDIF.
      
CLEAR wa_tab .
    
WHEN '&SAVE_DATA' .
      
PERFORM f_save_data .                             " 保存數據
    
WHEN 'PRINT' .
      
PERFORM f_print_data.                             " 打印數據
    
WHEN 'EXCEL' .
      
PERFORM f_export .                                " 導出數據
  
ENDCASE.

  p_rs_selfield-
refresh = 'X' .   " 當用戶在顯式界面上對數據進行修改時,同時內表中的數據也隨之刷新
ENDFORM.                    " f_user_command

3.4.        顯示具體細節

  1. 、    先定義一個存放具體內容的內表並整理好相關數據;
  2. 、    調用 一個指定大小的屏幕來顯示具體的內容,代碼如下:

    CALL SCREEN 0100 STARTING AT 12 12 ENDING AT 137 24 .

  3. 、    雙擊該屏幕號碼"0100"創建該屏幕,在"屬性"卡輸入該屏幕的描述,在"邏輯流"卡里將系統默認注釋掉的PBO、PAI事件的模塊取消注釋並產生這兩個模塊(雙擊並確定);
  4. 、    在"屏幕制作器"界面點擊進入"屏幕制作器"的圖形界面,開始繪制我們需要的屏幕元素,這里我們需要一個"表控制"(最左邊從下數第四個元素),該表格的屬性設置為:

    名稱:

    起始行列和高寬

     

    上圖表示"列標題"為"具體內容",可以水平或垂直的調節大小,有水平和垂直的分隔符,只能同時選中一行一列,帶選擇列(DE_BOX),最左端兩列固定不滾動;

  5. 、    接下來給單元格和列標題名稱並給單元格指定內表的字段,
  6. 、    屏幕的PBO、PAI事件的代碼如下:

    PROCESS BEFORE OUTPUT.
      
    MODULE status_0100.
      
    LOOP AT i_detail INTO wa_detail
            
    WITH CONTROL vs_detail CURSOR i_detail-current_line .
      
    ENDLOOP.
    *
    PROCESS AFTER INPUT.
      
    LOOP AT i_detail .
      
    ENDLOOP.
      
    MODULE user_command_0100.

  7. 、    需要在定義變量的時候聲明一下表控制和動作的接受者(OK_CODE)如下:

    * 表控制IS_MATNR
    CONTROLS vs_detail TYPE TABLEVIEW USING SCREEN 0100 .

     

    " 利用同名傳遞原理,來接受細節屏幕上的元素"ok_code"的值
    DATA: ok_code TYPE sy-ucomm .

  8. "MODULE status_0100."的代碼如下:

    MODULE status_0100 OUTPUT.
      
    SET PF-STATUS '0100' .
      
    DESCRIBE TABLE i_detail LINES vs_detail-current_line .
    ENDMODULE.                 " status_0100  OUTPUT

    在"0100"的工具欄里,只設置即可滿足需求;

    "MODULE user_command_0100."的代碼如下:

    MODULE user_command_0100 INPUT.
      
    CASE ok_code.
        
    WHEN 'BACK' .
          
    SET SCREEN 0 .    " 返回主屏幕
      
    ENDCASE.
    ENDMODULE.                 " user_command_0100  INPUT

    完成調用細節屏幕;

注意:在顯示細節屏幕的字段的類型上,當內表中有數據為貨幣類型的時候,要在"格式"里指明該字段是貨幣類型的數據,如下圖:

 

3.5.        調用其他事務

FORM f_call_tran USING p_rs_selfield TYPE slis_selfield  .
  
SET PARAMETER ID 'LIB' FIELD p_rs_selfield-value .
  
CALL TRANSACTION 'SE37' ."AND SKIP FIRST SCREEN .
ENDFORM.                    " f_call_tran

"LIB"是指參數ID,查找方法:用一個事務碼進入事務界面,在輸入框內按F1,在彈出來的界面中點擊,新界面中的就是參數ID;

"SE37"是指我們要調用的事務代碼,"AND SKIP FIRST SCREEN"表示跳過第一屏屏幕;

3.6.        打開並選擇文件:

  1. 、現則內表中定義好存放文件路徑的字段(這里是FILE_PATH),當用戶點擊界面上設置好的打開文件圖標時,就會觸發子FORM(F_USER_COMMAND)里的打開文件的子FORM(F_OPEN_FOLDER);
  2. 子FORM(F_OPEN_FOLDER)的代碼如下:

    FORM f_open_folder USING p_rs_selfield TYPE slis_selfield .
      
    DATA: l_file_path LIKE rlgrap-filename .

      
    CALL FUNCTION 'WS_FILENAME_GET'
        
    EXPORTING
          mode             = 
    'O'
          title            = 
    '選擇文件'
        
    IMPORTING
          filename         = l_file_path
        
    EXCEPTIONS
          inv_winsys       = 
    1
          no_batch         = 
    2
          selection_cancel = 
    3
          selection_error  = 
    4
          
    OTHERS           = 5.

      
    IF sy-subrc = 0.
        wa_tab-file_path = l_file_path . 
    " 將得到的文件的路徑賦給當前行的路徑
        
    MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING file_path .
        
    CLEAR l_file_path .
      
    ELSE .
        
    MESSAGE s000 WITH '沒有選擇文件' .
      
    ENDIF.
    ENDFORM.                    " f_open_folder

4.        關於設置字段和列名的子FORM(F_FIELDS)的參數設置:

4.1.        單列優化寬度

當在子FORM(F_BUILD_LAYOUT)里沒有指明全局優化列寬的時候,在需要指定優化的字段的屬性里指定下列屬性就可以單列優化了,

wa_fieldcat-col_opt       = 'X' .

4.2.        單列求和或者取消求和,添加屬性

wa_fieldcat-do_sum        = 'X' .   " 求和
wa_fieldcat-no_sum        = 
'X' .   " 取消求和

如果此時在子FORM(F_BUILD_LAYOUT)里添加下列屬性,則求和后的行就會在第一行出現:

i_layout-totals_bef      = 'X' .

4.3.        對其方式

wa_fieldcat-just          = 'L' .   " 左對齊
wa_fieldcat-just          = 
'C' .   " 居中對齊
wa_fieldcat-just          = 
'R' .   " 右對齊

當然,在不指明對其方式的前提下,ABAP的各種數據類型優默認的對其方式,其中字符串是默認為左對齊,而貨幣、數量默認為右對齊;

4.4.        作為圖標輸出

  1. 、首先在開始包含進一個包括,如下:

    " 包含圖標等在內的一些信息
    INCLUDE <list> .

  2. 、然后在內表中定義一個代表圖標的字段(這里如ICON_FOLDER),在整理數據的時候,需要將代表圖標的代碼賦給給字段,如下

        " 圖標
        wa_banfn-icon_folder = icon_object_folder .

  3. 、接着在子FORM(F_FIELDS)里給需要圖標顯示的列添加下列屬性:

      v_pos = v_pos + 1 .
      wa_fieldcat-col_pos       = v_pos .
      wa_fieldcat-fieldname     = 
    'ICON_FOLDER'   .
      wa_fieldcat-scrtext_l     = 
    'ICON' .
      wa_fieldcat-
    icon          = 'X' .   " 圖標
      wa_fieldcat-
    hotspot       = 'X' .
      
    APPEND wa_fieldcat TO i_fieldcat .
      
    CLEAR wa_fieldcat .

    這樣圖標就可以在ALV界面中顯示了,其中添加"熱點"的目的是為了當用戶點擊該圖標的時候,可以觸發一系列的操作,如文件的選擇等等;

    注意:圖標的名稱用事務碼"ICON"進入后左邊第二列就是圖標代碼,根據需要進行選擇;

4.5.        固定列和關鍵列

兩者都可以使具有該屬性的列固定不滾動,但是前者不改變該列的顏色,而后者會將該列的顏色弄成一色,不容易確認,但它具有其他的功能,代碼如下:

wa_fieldcat-fix_column    = 'X' .   " 固定列

wa_fieldcat-key           = 'X' .   " 關鍵列

4.6.        列的字符寬度

可以明顯地指明該列的輸出寬度,屬性代碼如下:

wa_fieldcat-outputlen        = 10 .     " 輸出寬度

列抬頭的工具提示,在列的屬性添加下列參數,當用戶將鼠標放到列名上時,可以顯示"提示"2字,代碼如下:

wa_fieldcat-tooltip       = '提示' .

5.        單元格的F1、F4幫助:

5.1.        F1幫助:

  1. 、在子FORM(F_FIELDS)里列的屬性添加"數據元素"這一屬性,代碼如下:

    wa_fieldcat-rollname      = 'PS_PSPID' .    " 指定數據元素

    就可以在ALV的顯示界面將鼠標放到該字段的位置后按F1會彈出該字段的說明;

  2. 、指定數據元素之后,可以不指明字段的描述(如SCRTEXT_L、SCRTEXT_M、SCRTEXT_S),函數會自動將字段的描述顯示,但是沒有自己指定的靈活

5.2.        F4幫助:

  1. 、在子FORM(F_FIELDS)里列的屬性添加下列屬性,代碼如下:

      wa_fieldcat-ref_field     = 'PSPID' .
      wa_fieldcat-ref_table     = 
    'PROJ' .

    這樣在ALV的顯示界面,在該字段處就可以按F4來查看相關的內容了;

6.        輸入並保存、回調修改內表(輸入時的小數位錯位的問題、指定數據類型、小說位數)

  1. 首先在顯示ALV的子FORM(F_DISPLAY)里定義"回調"的變量,如下:

      " 回調變量
      
    DATA: i_grid_settings TYPE  lvc_s_glay .
      i_grid_settings-edt_cll_cb  = 
    'X' .

  2. 在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加輸入參數如,下:

    i_grid_settings                   = i_grid_settings

    這時只要在顯示界面可編輯字段上修改了數據,回車后就會立即將內表的數據也修改了;

  3. 對於貨幣字段,要在其設置字段和列名的屬性中再添加一個"指定數據類型"的屬性,如下:

    wa_fieldcat-datatype      = 'CURR' .     " 指定數據類型

    這樣在修改數據並保存時,才能將數據保持原樣,否則輸入的數據會自動將小數點提前2位;

  4. 對於數量字段,也要添加一個"指定數據類型"的屬性,才能保持數據的正確性,如下:

      wa_fieldcat-datatype      = 'QUAN' .  " 指定數據類型
      wa_fieldcat-inttype       = 
    'C' .

  5. 將界面數據保存到數據庫表中,觸發事件見子FORM中的F_SAVE_DATA,代碼如下:

    FORM f_save_date .
      
    DATA: i_spfli LIKE TABLE OF spfli WITH HEADER LINE .

      
    DATA: l_error TYPE REF TO cx_sy_open_sql_db ,
            l_error2 
    TYPE REF TO cx_sy_arithmetic_overflow ,
            l_error_text 
    TYPE string .

      
    " 將界面上的數據轉接到和被修改的數據庫表的結構一樣的內表中
      
    LOOP AT i_tab INTO wa_tab .
        i_spfli-carrid = 
    'ZZ' .
        i_spfli-connid = sy-tabix .
        i_spfli-cityfrom = wa_tab-cityfrom .
        i_spfli-airpfrom = wa_tab-airpfrom .
        i_spfli-cityto = wa_tab-cityto .
        i_spfli-airpto = wa_tab-airpto .
        i_spfli-distance  = wa_tab-distance .
        
    APPEND i_spfli .
        
    CLEAR i_spfli .
      
    ENDLOOP.

      
    " 保存到數據庫
      
    TRY .
          
    DELETE spfli FROM TABLE i_spfli .
          
    INSERT spfli FROM TABLE i_spfli .
        
    CATCH cx_sy_open_sql_db INTO l_error .
          l_error_text = l_error->get_text( ) .
          sy-subrc = 
    1 .
      
    ENDTRY .

      
    IF sy-subrc NE 0 .
        
    ROLLBACK WORK .
        
    MESSAGE e000 WITH l_error_text .
        
    CLEAR l_error_text .
      
    ELSE .
        
    MESSAGE s000 WITH '數據保存成功!' .
      
    ENDIF.

      
    CLEAR   i_spfli .
      
    REFRESH i_spfli .
    ENDFORM.                    " f_save_date

7.            界面顏色的更改

ALV中的顏色代碼共有4位,其中C是固定的第一位(代表COLOR),第二位代表是顏色編碼(1到7),第三位是加強顏色的設置(1表示打開,0表示關閉),第四位是減弱顏色(1表示打開,0表示關閉),個人理解,在強化關閉的情況下,相反的作用是背景和字體的變化

7.1.        更改單元格(字體)的前景、背景顏色

  1. 、在定義內表的時候定義一個代表單元格顏色的字段,如下:

    cell_color TYPE slis_t_specialcol_alv 

  2. 、在子FORM(F_BUILD_LAYOUT)里,要指明代表單元格顏色的字段的名稱,如下:

    i_layout-ctab_fname   = 'CELL_COLOR'.   " 單元格顏色設置

  3. 、在子FORM(F_CELL_COLOR)里給代表單元格顏色的字段賦值,如下:

    FORM f_cell_color .
      
    " 單元格顏色
      
    DATA: l_cellcolor TYPE slis_specialcol_alv .

      
    LOOP AT i_tab INTO wa_tab .
        
    IF wa_tab-price > 500 .
          l_cellcolor-fieldname = 
    'PRICE' . " 要修改顏色的字段名
          l_cellcolor-
    color-col = 6 .                           " 顏色(1-7)
          l_cellcolor-
    color-inv = 1 .       " 前景字體(int代表背景顏色)
          
    APPEND l_cellcolor TO wa_tab-cell_color .

          
    CLEAR l_cellcolor .
        
    ENDIF.

       
    MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING cell_color .
        
    CLEAR wa_tab .
      
    ENDLOOP.
    ENDFORM.                    " f_cell_color

7.2.        更改行的顏色和列的顏色

  1. 、在定義內表的時候定義一個代表行列顏色的字段,如下:

            line_color(4TYPE c

  2. 、在子FORM(F_BUILD_LAYOUT)里,要指明代表行列顏色的字段的名稱,如下:

    i_layout-info_fname   = 'LINE_COLOR'  . " 行列顏色

  3. 、在子FORM(F_LINE_COLOR)里給代表行列顏色的字段賦值,如下:

    FORM f_line_color .
      
    DATA: l_i TYPE i .

      
    LOOP AT i_tab INTO wa_tab .

        l_i = sy-tabix 
    MOD 2 .

        
    IF l_i = 0 .
          wa_tab-line_color = 
    'C311' .
       
    MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING line_color .
          
    CLEAR wa_tab .
        
    ENDIF.
      
    ENDLOOP.
    ENDFORM.                    " f_line_color

7.3.        利用設置字段和列名子的FORM(F_FIELDS)里來設置列的顏色

wa_fieldcat-emphasize     = 'C711' .

注意: 顏色設置中有優先級順序,他們是單元格-->行-->列,即若同時使用了上述3中更改顏色的方法,則列的顏色會被行的顏色覆蓋掉,而行的顏色又會背單元格的顏色覆蓋掉,最終只會顯示出單元格的顏色.

8.        ALV自帶的最左端復選框按鈕和自定義復選框按鈕

8.1.        ALV自帶的復選框按鈕:

在定義內表時,需要指明代表復選框的字段,這里如:BOX_NAME,然后在定義ALV全局屬性的子FORM(F_BUILD_LAYOUT)里指明代表復選框的字段,如下:

i_layout-box_fname        = box_fname .

8.2.        自定義復選框按鈕

需要在子FORM(F_FIELDS)里添加下列如下語句:

  wa_fieldcat-col_pos     = v_pos .     
  wa_fieldcat-fieldname   = 
'CHECKBOX' .
  wa_fieldcat-scrtext_m   = 
'復選框' .
  wa_fieldcat-
checkbox    = 'X' .
  wa_fieldcat-
edit        = 'X' .
  wa_fieldcat-just        = 
'C' .
  wa_fieldcat-
fix_column   = 'X' .
  
APPEND wa_fieldcat TO i_fieldcat .
  
CLEAR wa_fieldcat .

該功能必須在在顯示ALV的函數的子FORM(F_DISPLAY)里添加"回調"的輸入參數,這樣當用

戶點擊復選框后才能將改變寫回到內表中,代碼如下

DATA: l_grid_settings TYPE lvc_s_glay  .
  l_grid_settings-edt_cll_cb = 
'X'  .

 

i_grid_settings          = l_grid_settings

9.            按照上傳的模板格式導出為本地文件

9.1.        定義導出為EXCEL用到的數據變量

TYPE-POOLS ole2 .
DATA: v_excel TYPE ole2_object,
      v_sheet 
TYPE ole2_object,
      v_book  
TYPE ole2_object,
      v_rows  
TYPE ole2_object,
      v_cell  
TYPE ole2_object,
      v_sheet_number 
TYPE i .

9.2.        上傳模板

需要用事務碼"SMW0"先上傳一個EXCEL模板,步驟:

  1. 、SMW0進入界面,選擇"WebRFC應用程序的二進制數據",點擊進入現已界面;
  2. 、在"包"后面輸入一個包名后點擊或者按F8進入上傳模板的主界面,如下圖:

     

  3. 、在上圖中點擊或者按F5新建一個模板,彈出下圖:

     

    輸入"對象名稱"(一般用程序名+。xls)和"描述"后,點擊或者按"Shift + F6"找到自己存放模板的路徑雙擊上傳即可完成模板的上傳(名稱為Z_ALV.XLS);

9.3.        代碼

當用戶觸動子FORM(F_USER_COMMAND)里的導出程序時,就會觸動下列代碼,現將模板現在下來,

進而根據模板將數據導出到EXCEL表格中,代碼中的許多部分都是固定的,其中的紅色底色部分

為需要自己填寫代碼如下:

*&---------------------------------------------------------------------*
*&      Form  f_export
*&---------------------------------------------------------------------*
*       導出數據
*----------------------------------------------------------------------*
FORM f_export .
  
DATA: l_name LIKE wwwdatatab,
         l_mine 
LIKE w3mime OCCURS 10,

         l_title 
TYPE string,
         l_filename 
TYPE string,
         l_path 
TYPE string,
         l_fullpath 
TYPE string.

  l_name-relid = 
'MI'.
  l_name-objid = 
'Z_ALV.XLS'.
  l_name-
text = sy-title.

  
CONCATENATE 'Z_ALV測試_' sy-uname '_' sy-datum '_' sy-uzeit INTO l_title .
*模板下載
  
CALL FUNCTION 'WWWDATA_IMPORT'
    
EXPORTING
      
key               = l_name
    
TABLES
      mime              = l_mine
    
EXCEPTIONS
      wrong_object_type = 
1
      import_error      = 
2
      
OTHERS            = 3.

  
CALL METHOD cl_gui_frontend_services=>file_save_dialog
    
EXPORTING
      window_title         = l_title
      default_extension    = 
'xls'
      default_file_name    = l_title
      file_filter          = 
'(電子表格EXCEL)'
    
CHANGING
      filename             = l_filename
      path                 = l_path
      fullpath             = l_fullpath
    
EXCEPTIONS
      cntl_error           = 
1
      error_no_gui         = 
2
      not_supported_by_gui = 
3
      
OTHERS               = 4.
  
IF sy-subrc <> 0.
    
STOP.
  
ENDIF.

  
IF l_filename = ''.
    
MESSAGE e000 WITH '已取消導出!' .
  
ENDIF.

  
CALL FUNCTION 'GUI_DOWNLOAD'
    
EXPORTING
      filename = l_fullpath
      filetype = 
'BIN'
    
TABLES
      data_tab = l_mine.

*--打開excel模板
  
PERFORM f_open_excel USING l_fullpath.

*--向excel寫數據
  
PERFORM f_write_excel_sheet.

*--設置excel可見
  
CALL METHOD OF v_excel 'Worksheets' = v_sheet
    
EXPORTING
    #
1 = 1.
  
CALL METHOD OF v_sheet 'Activate'.
  
SET PROPERTY OF v_excel 'Visible' = 1.

* 關閉EXCEL並保存
  
PERFORM f_save_excel USING l_fullpath.
ENDFORM.                    " f_export
*&---------------------------------------------------------------------*
*&      Form  f_OPEN_EXCEL
*&---------------------------------------------------------------------*
*      根據本地excel路徑,打開excel應用
*----------------------------------------------------------------------*
FORM f_open_excel  USING   pa_path.
  
CREATE OBJECT v_excel 'Excel.Application'.

  
CALL METHOD OF v_excel 'Workbooks' = v_book.

  
CALL METHOD OF v_book 'Open' = v_book
    
EXPORTING
    #
1 = pa_path.

  
CALL METHOD OF v_book 'Sheets' = v_sheet
    
EXPORTING
    #
1 = 1.
ENDFORM.                    " f_OPEN_EXCEL
*&---------------------------------------------------------------------*
*&      Form  f_WRITE_EXCEL_SHEET1
*&---------------------------------------------------------------------*
*       向excel寫入數據
*----------------------------------------------------------------------*
FORM f_write_excel_sheet.

  
TYPESBEGIN OF typ_name ,
            name_first(
40TYPE c ,
            name_last(
40)  TYPE c ,
         
END OF typ_name .

  
DATA: i_name TYPE TABLE OF typ_name WITH HEADER LINE .
  
DATA: l_name(40TYPE c .

  
SELECT adrp~name_first
         adrp~name_last
    
INTO CORRESPONDING FIELDS OF TABLE i_name
    
FROM adrp
            INNER 
JOIN usr21 ON adrp~persnumber = usr21~persnumber
   
WHERE usr21~bname = sy-uname .

  
LOOP AT i_name .
    
CONCATENATE i_name-name_last i_name-name_first INTO l_name .
  
ENDLOOP.

  
DATA: l_chars(50TYPE c,
        l_lines 
TYPE i ,
        l_num 
TYPE i VALUE 4"行變化,從第幾行開始導入

*寫入表頭
  
PERFORM f_write_cell USING 1 1 'Z_ALV測試'.

  
CONCATENATE '制表日期:' sy-datum+0(4'年' sy-datum+4(2)  '月'  sy-datum+6(2'日' INTO l_chars.
  
CONDENSE l_chars NO-GAPS .
  
PERFORM f_write_cell USING 2 1 l_chars.

  
CONCATENATE '制表人:' l_name INTO l_name .
  
CONDENSE l_name NO-GAPS .
  
PERFORM f_write_cell USING 2 5 l_name.

  
"通過行列的方式把數據寫入到Excel中
  
LOOP AT i_tab INTO wa_tab .

    
PERFORM f_write_cell USING l_num 1 wa_tab-numer .
    
PERFORM f_write_cell USING l_num 2 wa_tab-cityfrom.
    
PERFORM f_write_cell USING l_num 3 wa_tab-airpfrom.
    
PERFORM f_write_cell USING l_num 4 wa_tab-cityto.
    
PERFORM f_write_cell USING l_num 5 wa_tab-airpto.
    
PERFORM f_write_cell USING l_num 6 wa_tab-distance.
    
PERFORM f_write_cell USING l_num 7 wa_tab-price.
    
PERFORM f_write_cell USING l_num 8 wa_tab-tcode.
    
PERFORM f_write_cell USING l_num 9 wa_tab-file_path.

    l_num = l_num + 
1 .
    
CLEAR wa_tab .
  
ENDLOOP.
ENDFORM.                    " f_WRITE_EXCEL_SHEET1
*&---------------------------------------------------------------------*
*&      Form  f_SAVE_EXCEL
*&---------------------------------------------------------------------*
*      保存excel文檔
*----------------------------------------------------------------------*
*      -->P_L_FULLPATH  text
*----------------------------------------------------------------------*
FORM f_save_excel USING  pa_fullpath.
  
SET PROPERTY OF v_excel 'DisplayAlerts' = 0.
  
CALL METHOD OF v_book 'SAVEAS'
    
EXPORTING
    #
1 = pa_fullpath.

  
CALL METHOD OF v_book 'Exit' = v_book.
  
FREE OBJECT v_excel.
ENDFORM.                    " f_SAVE_EXCEL
*&---------------------------------------------------------------------*
*&      Form  f_WRITE_CELL
*&---------------------------------------------------------------------*
*  向excel指定cell寫入數據
*----------------------------------------------------------------------*
FORM f_write_cell  USING  pa_row
                            pa_col
                            pa_val.
  
CALL METHOD OF v_sheet 'Cells' = v_cell
    
EXPORTING
    #
1 = pa_row
    #
2 = pa_col.
  
SET PROPERTY OF v_cell 'Value' = pa_val.
ENDFORM.                    " f_WRITE_CELL

10.        為ALV標題添加圖片

要使用圖片,顯示ALV的函數的輸入參數中的HTML表頭必須換成一般表頭,即:

i_callback_html_top_of_page       = 'F_TOP_OF_PAGE1

必須換成

I_CALLBACK_TOP_OF_PAGE            = 'F_TOP_OF_PAGE2'

10.1.        上傳圖片

OAER進入參數界面,在"Class name"后面輸入"PICTURES",在"Class Type"后面輸入"OT",在"Object ID"后面輸入一個名字,用來標記上傳的圖片,點擊或按F8進入上傳圖片的主界面,點擊下面的鄂"Create"展開"Standard.Doc.Types"雙擊"屏幕"上傳自己的圖片,指定好"Description"和"KeyWord"方便以后查找,完成圖片的上傳,幾下"Object ID",后面的程序中要用到;

10.2.        在子FORM(F_TOP_OF_PAGE2)里的代碼

*&---------------------------------------------------------------------*
*&      Form  f_top_of_page2
*&---------------------------------------------------------------------*
*       ALV表頭標題
*----------------------------------------------------------------------*
FORM f_top_of_page2 .
  
DATA: i_header  TYPE slis_t_listheader,
        wa_header 
TYPE slis_listheader.

  
" 定義登錄用戶的描述
  
DATA: l_name TYPE string ,
        name_first 
LIKE adrp-name_first ,
        name_last  
LIKE adrp-name_last .

  
" 定義登錄日期
  
DATA: l_date TYPE string .

  
" 得到登錄用戶的描述
  
SELECT SINGLE adrp~name_first
                adrp~name_last
   
INTO (name_first,name_last)
   
FROM adrp
           INNER 
JOIN usr21 ON adrp~persnumber = usr21~persnumber
  
WHERE usr21~bname = sy-uname .

  
IF sy-subrc = 0 .
    
CONCATENATE name_last name_first INTO l_name .
  
ELSE .
    l_name = sy-uname .
  
ENDIF.
  
CLEAR name_first .
  
CLEAR name_last .

  
" 拼接制表日期
  
CONCATENATE sy-datum+0(4'.'
              sy-datum+
4(2'.'
              sy-datum+
6(2INTO l_date .

  
" Image
  wa_header-typ  = 
'H'.
  wa_header-info = 
'Z_ALV測試' .
  
APPEND wa_header TO i_header .
  
CLEAR  wa_header .

  
CONCATENATE '制表人:' l_name INTO l_name .
  
CONCATENATE '制表日期:' l_date INTO l_date .
  wa_header-typ  = 
'S'.
  wa_header-
key  = l_name .
  wa_header-info = l_date .
  
APPEND wa_header TO i_header .
  
CLEAR  wa_header .

  
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    
EXPORTING
      i_logo             = 
'BEPC'   " OAER中的Object ID
      it_list_commentary = i_header
      i_alv_form         = 
'X'.
ENDFORM.                    " f_top_of_page2

效果如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM