SAP:ALV 总结

16 篇文章 0 订阅

   

 

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.         在子FORMF_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        在“字段和列名”的子FORMF_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.       利用设置字段和列名子的FORMF_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.     在子FORMF_TOP_OF_PAGE2)里的代码.... 27 

ALVSAP 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.       在子FORMF_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”,进入创建工具栏的界面,输入名字后进入最终的界面在界面右侧,

点击“应用工具条”后面的展开符号,在“项目”后面的白色方框内输入“自定义按钮”的代码后回车,选择静态文本回车,在“函数文本”后面输入想要显示的按钮的名称,在“图标名称”后面选择相应的图标(可选),回车在这一界面选择一个“快捷键”(必填)后回车,这样一个自定义按钮就做好了,也可以修改,记住刚刚创建的按钮的代码,在下面的捕捉用户的动作的自FORMF_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 在“字段和列名”的子FORMF_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”的下面就会出现一条下划线,同时当鼠标移动到该列时,就会变成“等待”的手势,当用户单击每一条时,就会触动子FORMF_USER_COMMAND)中的动作,进而引起某些操作;

3.3.          操作代码

对于热点链接,所对应的动作码为“&IC1”,在子FORMF_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),当用户点击界面上设置好的打开文件图标时,就会触发子FORMF_USER_COMMAND)里的打开文件的子FORMF_OPEN_FOLDER);

2>      FORMF_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.     关于设置字段和列名的子FORMF_FIELDS)的参数设置:

4.1.          单列优化宽度

当在子FORMF_BUILD_LAYOUT)里没有指明全局优化列宽的时候,在需要指定优化的字段的属性里指定下列属性就可以单列优化了,

wa_fieldcat-col_opt       = 'X' .

4.2.          单列求和或者取消求和,添加属性

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

如果此时在子FORMF_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>      、接着在子FORMF_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.     单元格的F1F4帮助:

5.1.          F1帮助:

1>      、在子FORMF_FIELDS)里列的属性添加“数据元素”这一属性,代码如下:

wa_fieldcat-rollname      = 'PS_PSPID' .    " 指定数据元素

就可以在ALV的显示界面将鼠标放到该字段的位置后按F1会弹出该字段的说明;

2>      、指定数据元素之后,可以不指明字段的描述(如SCRTEXT_L、SCRTEXT_M、SCRTEXT_S),函数会自动将字段的描述显示,但是没有自己指定的灵活

5.2.          F4帮助:

1>      、在子FORMF_FIELDS)里列的属性添加下列属性,代码如下:

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

这样在ALV的显示界面,在该字段处就可以按F4来查看相关的内容了;

6.     输入并保存、回调修改内表(输入时的小数位错位的问题、指定数据类型、小说位数)

1、       首先在显示ALV的子FORMF_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>      、在子FORMF_BUILD_LAYOUT)里,要指明代表单元格颜色的字段的名称,如下:

i_layout-ctab_fname   = 'CELL_COLOR'.   " 单元格颜色设置

3>      、在子FORMF_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>      、在子FORMF_BUILD_LAYOUT)里,要指明代表行列颜色的字段的名称,如下:

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

3>      、在子FORMF_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.          利用设置字段和列名子的FORMF_FIELDS)里来设置列的颜色

wa_fieldcat-emphasize     = 'C711' .

注意: 颜色设置中有优先级顺序,他们是单元格-->行-->列,即若同时使用了上述3中更改颜色的方法,则列的颜色会被行的颜色覆盖掉,而行的颜色又会背单元格的颜色覆盖掉,最终只会显示出单元格的颜色.

8.     ALV自带的最左端复选框按钮和自定义复选框按钮

8.1.          ALV自带的复选框按钮:

在定义内表时,需要指明代表复选框的字段,这里如:BOX_NAME,然后在定义ALV全局属性的子FORMF_BUILD_LAYOUT)里指明代表复选框的字段,如下:

i_layout-box_fname      =  box_fname .

8.2.          自定义复选框按钮

需要在子FORMF_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的函数的子FORMF_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       代码

当用户触动子FORMF_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.        在子FORMF_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

效果如下图:

虽然可以传图片,但是灵活度没有F_TOP_OF_PAGE1高;

 

注意,全部代码:

  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值