ALV报表——基础(一)

一、ALV简介

The ALV Grid Control (ALV = SAP List Viewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允许你可以在大型的应用程序中使用。在SAP的开发项目中,ALV GRID也可以作为修改和创建数据的一种工具。它包括3大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏。

二、程序实现

2.1、实现步骤

①定义类型池:TYPE-POOLS:SLIS.

②定义数据:结构体、内表、变量

③定义选择屏幕

④SQL抓取数据并做数据处理

⑤控制Layout显示样式和Fieldcat显示栏位清单

⑥调用ALV函数显示报表内容

2.2、代码示例

用REUSE_ALV_GRID_DISPLAY实现

************************************************************************
* 程 序 名:ZMMR001
* 程序描述:物料查询报表
* 事务代码:ZMM001
************************************************************************
* 修改日志
************************************************************************
* 日期     版本 修改人       描述
* -------- ---- ------------ -------------------------------------------
* 20171223 1.0  Amell        创建程序
*
************************************************************************
REPORT zmmr001.

************************************************************************
* Type Pools Definitions          定义类型池
************************************************************************
TYPE-POOLS slis.

************************************************************************
* Tables Definitions
************************************************************************
TABLES: marc.
************************************************************************
* Data Definitions                定义数据
************************************************************************
TYPES: BEGIN OF  ty_data,
         matnr LIKE mara-matnr,       "物料號碼
         maktx LIKE makt-maktx,       "物料说明
         groes LIKE mara-groes,       "规格
       END OF ty_data.

DATA: gt_data TYPE TABLE OF ty_data.

DATA: gs_layout   TYPE slis_layout_alv,     "布局
      gt_fieldcat TYPE slis_t_fieldcat_alv. "字段

************************************************************************
* Includes Module                 包含模块
************************************************************************

************************************************************************
* Selection Screen                选择屏幕
************************************************************************
PARAMETERS: p_werks LIKE marc-werks DEFAULT '2000' OBLIGATORY.

SELECT-OPTIONS: s_matnr FOR marc-matnr.

************************************************************************
* Initialization                  初始化事件
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen             PAI事件
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output      PBO事件
************************************************************************
AT SELECTION-SCREEN OUTPUT.

************************************************************************
* Report Format                   报表格式
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.

************************************************************************
* Main Process                    主要逻辑
************************************************************************
START-OF-SELECTION.

  "获取数据
  PERFORM frm_get_data.
  "显示数据
  PERFORM frm_display_data.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

  DATA: lt_makt TYPE TABLE OF makt,
        ls_makt LIKE LINE OF lt_makt,
        ls_data LIKE LINE OF gt_data.

  SELECT marc~matnr "料号
         mara~groes "规格
         INTO CORRESPONDING FIELDS OF TABLE gt_data
         FROM marc
         INNER JOIN mara ON marc~matnr EQ mara~matnr
         WHERE marc~matnr IN s_matnr "料号
         AND marc~werks EQ p_werks.  "工厂

  SELECT * INTO TABLE lt_makt
         FROM makt
         WHERE matnr IN s_matnr
         AND spras = sy-langu. "当前登陆语言

  SORT: gt_data BY matnr,
        lt_makt BY matnr.

  LOOP AT gt_data INTO ls_data.

    READ TABLE lt_makt INTO ls_makt WITH KEY
         matnr = ls_data-matnr
         BINARY SEARCH.
    IF sy-subrc = 0.
      ls_data-maktx = ls_makt-maktx.
    ENDIF.

    MODIFY gt_data FROM ls_data.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  "栏位最适宽度
  gs_layout-colwidth_optimize = 'X'.

  "ALV条纹
  gs_layout-zebra = 'X'.

  "构建ALV的栏位
  PERFORM frm_create_field.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid       "当前程序名
      is_layout          = gs_layout      "Layout
      it_fieldcat        = gt_fieldcat[]  "Fieldcat
      i_save             = 'A'
    TABLES
      t_outtab           = gt_data
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_field .

  DATA: ls_fieldcat TYPE slis_fieldcat_alv,
        lv_count    TYPE i.

  DEFINE fieldcat.
    ADD 1 TO lv_count.

    "栏位显示顺序
    ls_fieldcat-col_pos    = lv_count.
    "内表栏位
    ls_fieldcat-fieldname  = &1.
    "参考栏位
    ls_fieldcat-ref_fieldname = &2.
    "参考表
    ls_fieldcat-ref_tabname = &3.
    "单位
    ls_fieldcat-qfieldname = &4.
    "栏位标题(长文或中等文或短文)
    ls_fieldcat-seltext_s = ls_fieldcat-seltext_m =
    ls_fieldcat-seltext_l = &5.
    "显示长文或中等文或短文
    ls_fieldcat-ddictxt = &6.

    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  fieldcat 'MATNR' 'MATNR' 'MARC' '' '' ''.
  fieldcat 'MAKTX' 'MAKTX' 'MAKT' '' '品名' 'L'.
  fieldcat 'GROES' 'GROES' 'MARA' '' '' ''.

ENDFORM.
View Code

用REUSE_ALV_GRID_DISPLAY_LVC实现

************************************************************************
* 程 序 名:ZMMR001
* 程序描述:物料查询报表
* 事务代码:ZMM001
************************************************************************
* 修改日志
************************************************************************
* 日期     版本 修改人       描述
* -------- ---- ------------ -------------------------------------------
* 20171223 1.0  Amell        创建程序
*
************************************************************************
REPORT zmmr001.

************************************************************************
* Type Pools Definitions          定义类型池
************************************************************************
TYPE-POOLS slis.

************************************************************************
* Tables Definitions
************************************************************************
TABLES: marc.
************************************************************************
* Data Definitions                定义数据
************************************************************************
TYPES: BEGIN OF  ty_data,
         matnr LIKE mara-matnr,       "物料號碼
         maktx LIKE makt-maktx,       "物料说明
         groes LIKE mara-groes,       "规格
       END OF ty_data.

DATA: gt_data TYPE TABLE OF ty_data.

DATA: gs_layout   TYPE lvc_s_layo, "布局
      gt_fieldcat TYPE lvc_t_fcat. "字段

************************************************************************
* Includes Module                 包含模块
************************************************************************

************************************************************************
* Selection Screen                选择屏幕
************************************************************************
PARAMETERS: p_werks LIKE marc-werks DEFAULT '2000' OBLIGATORY.

SELECT-OPTIONS: s_matnr FOR marc-matnr.

************************************************************************
* Initialization                  初始化事件
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen             PAI事件
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output      PBO事件
************************************************************************
AT SELECTION-SCREEN OUTPUT.

************************************************************************
* Report Format                   报表格式
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.

************************************************************************
* Main Process                    主要逻辑
************************************************************************
START-OF-SELECTION.

  "获取数据
  PERFORM frm_get_data.
  "显示数据
  PERFORM frm_display_data.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

  DATA: lt_makt TYPE TABLE OF makt,
        ls_makt LIKE LINE OF lt_makt,
        ls_data LIKE LINE OF gt_data.

  SELECT marc~matnr "料号
         mara~groes "规格
         INTO CORRESPONDING FIELDS OF TABLE gt_data
         FROM marc
         INNER JOIN mara ON marc~matnr EQ mara~matnr
         WHERE marc~matnr IN s_matnr "料号
         AND marc~werks EQ p_werks.  "工厂

  SELECT * INTO TABLE lt_makt
         FROM makt
         WHERE matnr IN s_matnr
         AND spras = sy-langu. "当前登陆语言

  SORT: gt_data BY matnr,
        lt_makt BY matnr.

  LOOP AT gt_data INTO ls_data.

    READ TABLE lt_makt INTO ls_makt WITH KEY
         matnr = ls_data-matnr
         BINARY SEARCH.
    IF sy-subrc = 0.
      ls_data-maktx = ls_makt-maktx.
    ENDIF.

    MODIFY gt_data FROM ls_data.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  "栏位最适宽度
  gs_layout-cwidth_opt = 'X'.

  "ALV条纹
  gs_layout-zebra = 'X'.

  "构建ALV的栏位
  PERFORM frm_create_field.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid       "当前程序名
      is_layout_lvc      = gs_layout      "Layout
      it_fieldcat_lvc    = gt_fieldcat    "Fieldcat
      i_save             = 'A'
    TABLES
      t_outtab           = gt_data
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_field .

  DATA: ls_fieldcat TYPE lvc_s_fcat,
        lv_count    TYPE i.

  DEFINE fieldcat.
    ADD 1 TO lv_count.

    "栏位显示顺序
    ls_fieldcat-col_pos    = lv_count.
    "内表栏位
    ls_fieldcat-fieldname  = &1.
    "参考栏位
    ls_fieldcat-ref_field = &2.
    "参考表
    ls_fieldcat-ref_table = &3.
    "单位
    ls_fieldcat-qfieldname = &4.
    "栏位标题(长文或中等文或短文)
    ls_fieldcat-scrtext_s = ls_fieldcat-scrtext_m =
    ls_fieldcat-scrtext_l = &5.
    "显示长文或中等文或短文
    ls_fieldcat-colddictxt = &6.

    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  fieldcat 'MATNR' 'MATNR' 'MARC' '' '' ''.
  fieldcat 'MAKTX' 'MAKTX' 'MAKT' '' '品名' 'L'.
  fieldcat 'GROES' 'GROES' 'MARA' '' '' ''.

ENDFORM.
View Code

运行效果:

三、Layout、Fieldcat相关属性

3.1、Layout相关属性

主要用于设定 ALV 的输出格式,为 ALV 输出的可选项

①公共部分

字段名称 描述 输入值 备注
 no_colhead(1)  不显示标题  X-不显示,space-显示  
 no_hotspot(1)  标题不设热点  X-没有,space-有  
 zebra(1)  使ALV表格按斑马线间隔条码方式显示  X-有,space-没有  
 no_vline(1)  设置列间竖线  X-不显示,space-显示  
 no_hline(1)  设置行间隔线  X-不显示,space-显示  
 cell_merge(1)  设置是否压域复制  X-可复制,space-不可复制  
 edit(1)  设置所有单元格可编辑  X-可编辑,space-不可编辑  
 edit_mode(1)  编辑模式    
 numc_sum(1)  设置仅NUMC类型字段进行总计  X-仅Numc类型,space-不仅Numc类型  
 no_input(1)  不允许输入,用于显示状态  X-不允许,space-允许  
 f2code  设置触发弹出详细信息窗口的功能码  sy-ucomm    '&ETA' – 双击  
 no_keyfix (1)  关键字不固定,可以随滚动条滚动  X-不固定,space-固定  
 expand_all (1)  展开所有的node    
 no_author (1)  设置是否需要系统标准权限检查  X-不需要,space-需要  

②ALV菜单栏

字段名称 描述 输入值 备注
 def_status (1)  默认菜单状态  A显示,space不显示  'A' – 为显示所有标准菜单
 item_text (20)  菜单按钮文本    
 countfname (1)    lvc_fname  


③显示选项

字段名称 描述 输入值 备注
 colwidth_optimize(1)  优化列宽设置  X-优化  默认:space
 no_min_linesize(1)  设置不允许最小宽度  X-不允许,space-允许  默认:space
 min_linesize  ALV列表的最小宽度  sy-linsz,取值10到250  可选参数
 max_linesize  ALV列表的最大宽度  sy-linsz,可取值80-1020  默认值250
 window_titlebar  窗口标题  sy-title  
 no_uline_hs(1)  输出ALV表不显示水平格线  X-不显示,space-显示  

 

④红路灯显示异常

字段名称 描述 输入值 备注
 lights_fieldname  输出内表中定义的字段名,该字段用来显示状态灯   1:red,2:yellow,3:green   
 lights_tabname  输出字段的参考内表名称    
 lights_rollname  数据元素的名称,在灯字段按F1触发    
 lights_condense  对输出的内表分类汇总的时候,小计行显示状态灯  x  

 

⑤汇总合计

字段名称 描述 输入值 备注
 no_sumchoice (1)  不能进行选择总计    
 no_totalline (1)  不能总计,但可以小计    
 no_subchoice (1)  不能选择小计,但可以总计    
 no_subtotals (1)  不能小计,但可以总计    
 no_unit_splitting  有单位字段,不进行总计    
 totals_before_items  总行将会显示在最前面    
 totals_only (1)  仅显示合计    
 totals_text (60)  合计,第一列显示的文本    
 subtotals_text (60)  总计和小计行,第一列显示的文本    

 

⑥交互

字段名称 描述 输入值 备注
 box_fieldname  设置ALV表格是否显示选择按钮栏位    
 box_tabname  box_fieldname 参考内表名称    
 box_rollname  下拉框按钮名称    
 expand_fieldname  '展开'字段名称    
 hotspot_fieldname  热点字段    
 confirmation_prompt  退出ALV列表的确认对话框    
 key_hotspot (1)  关键字段作为热点    
 flexible_key (1)  关键字段可以移动    
 group_buttons (1)  COL1 – COL5 按钮组    
 get_selinfos (1)  获取选择屏幕    
 group_change_edit (1)  设置用户新的按钮组    
 no_scrolling(1)  滚动条无效,清单不随其滚动    仅list_alv有效

 

⑦明细窗口

字段名称 描述 输入值 备注
 detail_popup (1)  行项目明细弹窗形式  X-显示,space-不显示  对list_alv有效
 detail_initial_lines(1)  明细中同时显示初始化行  X-同时显示,space-不显示  
 detail_titlebar  明细窗口标题文本  sy-title  

 

⑧显示变式

字段名称 描述 输入值 备注
 header_text  表头按钮    
 default_item (1)  列表明细作为默认值  X-激活,space-不激活  

 

⑨颜色

字段名称 描述 输入值 备注
 info_fieldname 用于设置ALV输出报表每一行的颜色,其参数为输出内表的栏位名称  C000~C999 倘若其数据输出内表名为LT_OUT,则需要在改内表增加一个栏位“COLOR”,并为内表每行赋值,LT_OUT-COLOR = ‘C500’
 coltab_fieldname  颜色值    

 

⑩其他

字段名称 描述 输入值 备注
 list_append  设置是否Call屏幕    
 xifunckey  eXtended interaction(SAPQuery)    
 xidirect  eXtended INTeraction(SAPQuery)    
 dtc_layout  设置Tabstip的布局格式配置  DTC_S_LAYO  
 allow_switch_to_list  设置从Grid模式转换为List模式    

 

3.2、Fieldcat相关属性

主要用于ALV的结构定义,包括具体的栏位及名称、类型、格式等属性,为 ALV 输出的必选项

 

字段名称 描述 输入值 备注
row_pos 输出行位置 1…n  
col_pos 输出列位置 1…n  
fieldname 字段名称    
tabname fieldname字段对应的内表名称    
currency 货币单位    
cfieldname 当前输出内表中的货币单位字段的字段名称    
ctabname Cfieldname字段值对应的内表名称    
ifieldname      
quantity 计量单位    
qfieldname 参考计量单位的字段名称    
qtabname Qfieldname  对应的输出内表名    
round 四舍五入保留位数    
exponent 流动表示的指数    
key(1) 将栏位设置为Key值    
icon(1) 将定义栏位以ICON的形式显示    
symbol(1) 作为Symbol符号输出,在ALV输出内表中的字段值可以是ABAP名称    
checkbox(1) 作为复选框输出    
just(1) 定义栏位对齐方式  (R)Right (L)Left (C)Center  
lzero(1) 输出前置零    
no_sign(1) 不输出正负号+、-    
no_zero(1) 如果取值为零,则为空,既不输出零    
no_convext(1)      
edit_mask 输出编辑掩码, 同write语句中的edit mas格式是一样的   一般用来格式化时间和日期等
emphasize(4) 设置栏位的颜色    
fix_column(1) 固定列    
do_sum(1) 对当前列输出时自动求和    
no_out(1) 当前列隐藏输出    
tech(1) 技术字段,设置’X’后,该字段不会显示,也不能输出,如同MANDT字段一样的效果    
outputlen 列的字符宽度    
offset 偏移量    
seltext_l / scrtext_l 长文本    
seltext_m / scrtext_m 中文本    
seltext_s / scrtext_s 短文本    
ddictxt(1) 列标题描述格式 (S)hort (M)iddle (L)ong  
rollname      
datatype 数据类型    
inttype 整型    
intlen 整型长度    
lowercase 是否允许小写字母    
decfloat_style 浮点格式    
ref_fieldname 参考字段名称,配合ref_tabname一起使用,一般用来使单元格生成F4帮助    
ref_tabname 参考表名称,配合ref_fieldname使用    
roundfieldname 四舍五入字段名称    
roundtabname 四舍五入内表名称    
decimalsfieldname 小数点字段名称    
decimalstabname 小数点内表名称    
decimals_out(6) 控制小数点的位数    
text_fieldname 文本字段名称    
reptext_ddic 与数据元素的主标题类似    
ddic_outputlen 数据字典输出长度    
key_sel(1) 这个参数只和设置了Key的字段相关,和Key一起使用,可以交互式的隐藏设置为Key的字段(alv_list有效)    
no_sum(1) 不自动汇总    
sp_group(4) 分组需求    
reprep(1) selection for rep/rep    
input(1) 输入    
edit(1) 编辑    
hotspot(1) 设置栏位是否有热点(热点栏位显示有下划线)    

 

3.3、ALV输出函数

使用ALV函数REUSE_ALV_GRID_DISPLAY输出,可以直接参考数据字典中的现有透明表,也可以自定义Fieldcat来输出字段;

如若使用数据字典中的透明表或视图时,需要调用REUSE_ALV_FIELDCATALOG_MERGE函数来对相应的Fieldcat 进行匹配;

另外,必须保证该结构或内表中的每个字段都参考数据字典中的Data Element,否则无法获取字段的相关信息.

posted @ 2017-12-23 11:56  鲸与海  阅读(6083)  评论(0编辑  收藏  举报