REUSE_ALV_GRID_DISPLAY_LVC詳解


ALV開發流程:

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

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

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

1.3.  在子FORM(這里如:F_DISPLAY)里將內表中的數據進行顯示   51.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.      關於設置字段和列名的子FORM(F_FIELDS)的參數設置: 15

4.1.  單列優化寬度       15

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

4.3.  對其方式       15

4.4.  作為圖標輸出       16

4.5.  固定列和關鍵列  16

4.6.  列的字符寬度       16

5.      單元格的F1、F4幫助:      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)里的代碼      

 

 

 

 

 

 

 

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

REUSE_ALV_LIST_DISPLAY

Grid的是Excel單元格的格式,而list不是

REUSE_ALV_GRID_DISPLAY 可以控制某一行 某一列,甚至某一格(CELL)的讀寫

 

 

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

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

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

第1個函數用到的全局變量如下:都是slis類型池中的類型,結尾都是alv(表示他們用於alv)

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_lvc  TYPE lvc_t_fcat , " 存放列名的內表

             i_layout_lvc    TYPE lvc_s_layo . " 負責整個ALV的全局屬性     

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

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

1.1.           在子FORM(這里如:F_FIELDS)指定需要顯示的字段    wa_fieldcat 工作區,可以賦值

  v_pos = v_pos + 1 . 初始值是零

  wa_fieldcat-col_pos     = v_pos .       " 指定列數

  wa_fieldcat-fieldname    = 'PSPID' .     " 需要輸出的內表的字段名

  wa_fieldcat-scrtext_l     = '項目定義 '.  " 字段的描述-長字段標簽 screen  text long

  wa_fieldcat-scrtext_m      = '項目定義 '.  " 字段描述-中字段標簽

  wa_fieldcat-scrtext_s     = '項目定義 '.  " 字段描述-短字段標簽

  wa_fieldcat-fix_column    = 'X' .         " 是否是固定列 column ['kɔləm]列

  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(4) '.'

              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'出表日期:' 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 , struture

     it_sort_lvc TYPE lvc_t_sort .    table

        

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(4) TYPE 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.

 

  TYPES: BEGIN OF typ_name ,

            name_first(40) TYPE c ,

            name_last(40)  TYPE c ,

         END OF typ_name .

 

  DATA: i_name TYPE TABLE OF typ_name WITH HEADER LINE .

  DATA: l_name(40) TYPE 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(50) TYPE 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(2) INTO 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

效果如下圖:

 

雖然可以傳圖片,但是靈活度沒有F_TOP_OF_PAGE1高;

 

注意,全部代碼:


免責聲明!

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



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