您的位置:首页 > Web前端 > CSS

SAP Function ALV 01(样式、排序、筛选、事件)

2016-07-13 13:40 736 查看
ALV全称SAP List View,是SAP提供的一个强大的数据报表显示工具。

相比write输出:提供了更优质的与用户交互的功能。

实现方式:

- 调用标准函数

- 优化接口:用户可以实现对字段的排序、筛选及统计等功能。

显示方式:

-List:类似于write语句输出的表单形式

-Grid: 每个输出字段提供按钮,用户可以自行设定,操作更为灵活

运用Function ALV之前需要了解的大概内容

1.类型池:SLIS(类型池其实是特殊的程序)

2.Fieldcat TYPE slis_t_fieldcat_alv(每列的设置)

-列格式设置(表单)

-字段名称,列是否可修改,列宽度等

3.Layout TYPE slis_layout_alv(整个的设置)

- 全局格式设置(结构)

- 整表字段是否可修改,是否以斑马线输出,是否显示选择按钮字段等

4.函数:REUSE_ALV_FIELDCATALOG_MERGE

-根据内表结构返回FIELDCAT字段结构信息

5.函数:REUSE_ALV_GRID_DISPLAY / REUSE_ALV_LIST_DISPLAY

-使用GRID/LIST模式输出ALV报表

在程序中常用的架构:

START-OF-SELECTION

-数据表单数据选取(取数逻辑)

注意:为空就不走下面程序了。

END-OF-SELECTION

-对FIELDCAT赋值:设置每列格式

-对LAYOUT赋值:设置表单格式(可选)

-对SORT表等赋值:设置排序内容等(可选)

-给EVENT表等赋值:增加程序交互事件(可选)

-调用函数,输出ALV

创建Fieldcat

先声明:

DATA GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

DATA GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.



eg:在合计的时候,可以根据单位的不同分类合计:

GS_FIELDCAT-QFIELDNAME = ‘单位字段名’.

GS_FIELDCAT-CFIELDNAME = ‘货币单位名’。

创建LAYOUT

先声明:

DATA GS_LAYOUT TYPE SLIS_LAYOUT_ALV.



-BOX_FIELDNAME:

1.在内表中增加一列,字段名为BOX。

2.在layout赋值之后,表单显示时为可选择按钮。

-DETAIL_XX:标准按钮

点击时触发的详细清单相应的的设置。

“详细清单属性

GS_LAYOUT-DETAIL_INITIAL_LINES = ‘X’. “是否显示值为空的字段

GS_LAYOUT-DETAIL_TITLEBAR = ‘Detail Information’ .”对话框标题

创建SORT表:进行排序

先声明:

DATA:GT_SORT TYPE SLIS_T_SORTINFO_ALV,

GS_SORT TYPE SLIS_SORTINFO_ALV.

SORT表为一个内表,将需要排序的字段信息增加到sort表中,在ALV输出按照顺序排序输出。



创建FILTER表:进行筛选

DATA :GT_FILTER TYPE SLIS_T_FILTER_ALV,

GS_FILTER TYPE SLIS_FILTER_ALV.



创建EVENT表:进行筛选

DATA:GT_EVENT TYPE SLIS_T_EVENT, “ALV事件

GS_EVENT TYPE SLIS_ALV_EVENT.



注意:

ALV中CHAR类型默认输出后左对齐,数字类型默认右对齐。

fieldcat是一张内表,记录的是ALV输出时每列的属性信息。

layout是一个结构,存储的整个表单的全局设置。

添加图标:Tcode:ICON查看,需要用时直接复制icon名。



单击的前提是要设置热点

单击和双击虽然都是‘&IC1’,但是一般来说单击是真的某个单元格,双击则是某一行

附上相关代码:

*&---------------------------------------------------------------------*
*& Report  Z9617_OLE_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z9617_F_ALV01.

TABLES: MARA,MARD,MAKT.
TYPE-POOLS SLIS.

DATA : BEGIN OF GT_MARA OCCURS 0,
MATNR TYPE MARA-MATNR,
NTGEW TYPE MARA-NTGEW,
END OF GT_MARA.

DATA : BEGIN OF GT_MAKT OCCURS 0,
MATNR TYPE MAKT-MATNR,
SPRAS TYPE MAKT-SPRAS,
MAKTX TYPE MAKT-MAKTX,
END OF GT_MAKT.

DATA : BEGIN OF GT_TOTAL OCCURS 0,
MATNR TYPE MARD-MATNR,
WERKS TYPE MARD-WERKS,
LGORT TYPE MARD-LGORT,
LABST TYPE MARD-LABST,
SPRAS TYPE MAKT-SPRAS,
NTGEW TYPE MARA-NTGEW,
MAKTX TYPE MAKT-MAKTX,
BOX   TYPE C,
ICON  TYPE C LENGTH 4,  "增加ICON图标列
CHECK TYPE C LENGTH 1,  "增加复选框
END OF GT_TOTAL.

*Function ALV
DATA GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV. "属性列
DATA GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.

DATA GS_LAYOUT TYPE SLIS_LAYOUT_ALV.

DATA:GT_SORT TYPE SLIS_T_SORTINFO_ALV,    "排序
GS_SORT TYPE SLIS_SORTINFO_ALV.

DATA :GT_FILTER TYPE SLIS_T_FILTER_ALV,   "筛选
GS_FILTER TYPE SLIS_FILTER_ALV.

DATA:GT_EVENT TYPE SLIS_T_EVENT,       "ALV事件
GS_EVENT TYPE SLIS_ALV_EVENT.

DEFINE %%APPEND_FIELDCAT.  "定义宏
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = &1.
GS_FIELDCAT-fieldname = &2.
GS_FIELDCAT-outputlen = &3.
GS_FIELDCAT-seltext_m = &4.

CASE  &2.
WHEN  'MATNR'.
GS_FIELDCAT-KEY = 'X'.  "底纹颜色变化了。
WHEN 'ICON'.
GS_FIELDCAT-ICON = 'X'. "定义ICON 的属性
WHEN 'CHECK'.
GS_FIELDCAT-CHECKBOX = 'X'. "定义复选框属性
WHEN 'NTGEW'.
GS_FIELDCAT-DO_SUM = 'X'. "给数量类型添加合计属性
"  GS_FIELDCAT-QFIELDNAME = ''."内表中标明当前熟知的单的的字段,这样可以根据单位分开合计。
GS_FIELDCAT-HOTSPOT = 'X'. "fieid 中热点设置,可以指定任意字段 。
ENDCASE.

APPEND GS_FIELDCAT TO GT_FIELDCAT.
END-OF-DEFINITION.

SELECT-OPTIONS: P_MATNR FOR MARD-MATNR .

PARAMETERS:  P_WERKS TYPE MARD-WERKS,
P_LGORT TYPE MARD-LGORT.

START-OF-SELECTION.
PERFORM GET_DATA.
PERFORM BUILD_FIELDCAT.
PERFORM BUILD_LAYOUT.
PERFORM BUILD_SORT.
PERFORM BUILD_FILTER.
PERFORM BUILD_EVENT.

END-OF-SELECTION.
IF GT_TOTAL[] IS  NOT INITIAL.

PERFORM DISPLAY_DATA.
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------
4000
------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA .

SELECT  MATNR  WERKS LGORT LABST
INTO CORRESPONDING FIELDS OF TABLE  GT_TOTAL
FROM MARD
WHERE MATNR IN P_MATNR
AND WERKS = P_WERKS
AND LGORT = P_LGORT.

IF  GT_TOTAL[] IS  NOT INITIAL.
SELECT MATNR NTGEW
FROM MARA
INTO CORRESPONDING FIELDS OF TABLE GT_MARA
FOR ALL ENTRIES IN GT_TOTAL
WHERE MATNR = GT_TOTAL-MATNR.

SELECT MATNR SPRAS MAKTX
FROM MAKT
INTO CORRESPONDING FIELDS OF TABLE GT_MAKT
FOR ALL ENTRIES IN GT_TOTAL
WHERE MATNR  = GT_TOTAL-MATNR.
ENDIF.

SORT GT_MARA BY MATNR ASCENDING.
SORT GT_MAKT BY MATNR ASCENDING.
LOOP AT GT_TOTAL.
READ TABLE GT_MARA WITH  KEY MATNR = GT_TOTAL-MATNR BINARY SEARCH.
IF SY-SUBRC = 0.
GT_TOTAL-NTGEW = GT_MARA-NTGEW.
MODIFY GT_TOTAL.
ENDIF.
READ TABLE GT_MAKT WITH  KEY MATNR = GT_TOTAL-MATNR BINARY SEARCH.
IF SY-SUBRC = 0.
GT_TOTAL-SPRAS = GT_MAKT-SPRAS.
GT_TOTAL-MAKTX = GT_MAKT-MAKTX.
MODIFY GT_TOTAL.
ENDIF.
ENDLOOP.
CLEAR GT_TOTAL.

FREE : GT_MAKT,GT_MARA.
LOOP AT GT_TOTAL.
IF GT_TOTAL-MATNR = '000000000000000023'.
GT_TOTAL-ICON = ICON_GREEN_LIGHT.  "对ICON取值进行判断
ELSE.
GT_TOTAL-ICON =   ICON_RED_LIGHT.
ENDIF.
MODIFY GT_TOTAL.
ENDLOOP.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPLAY_DATA .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
I_CALLBACK_PROGRAM                = SY-CPROG
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
IS_LAYOUT   = GS_LAYOUT
IT_FIELDCAT = GT_FIELDCAT
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
IT_SORT     = GT_SORT
IT_FILTER   = GT_FILTER
*     IS_SEL_HIDE =
*     I_DEFAULT   = 'X'
*     I_SAVE      = ' '
*     IS_VARIANT  =
IT_EVENTS   = GT_EVENT
*     IT_EVENT_EXIT                     =
*     IS_PRINT    =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 = 0
*     I_HTML_HEIGHT_END                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
TABLES
T_OUTTAB    = GT_TOTAL
* EXCEPTIONS
*     PROGRAM_ERROR                     = 1
*     OTHERS      = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

ENDFORM.                    " DISPLAY_DATA
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text 使用子程序或者宏等方式,向fieldcat的内表中增加行
*       表单中的每一列为fieldcat中的一行
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT .
*     CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '1'.
*  GS_FIELDCAT-fieldname = 'MATNR'.
*  GS_FIELDCAT-outputlen = '18'.
*  GS_FIELDCAT-seltext_m = '物料编号'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.
%%APPEND_FIELDCAT  '1'  'MATNR'  ''  '物料编号' .
*    CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '2'.
*  GS_FIELDCAT-fieldname = 'WERKS'.
*  GS_FIELDCAT-outputlen = '18'.
*  GS_FIELDCAT-seltext_m = '工厂'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.
%%APPEND_FIELDCAT  '2'  'WERKS'  ''  '工厂' .
*    CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '3'.
*  GS_FIELDCAT-fieldname = 'LGORT'.
*  GS_FIELDCAT-outputlen = '18'.
*  GS_FIELDCAT-seltext_m = '库存地址'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.
%%APPEND_FIELDCAT  '3'  'LGORT'  ''  '库存地址' .
*    CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '4'.
*  GS_FIELDCAT-fieldname = 'LABST'.
*  GS_FIELDCAT-outputlen = '18'.
*  GS_FIELDCAT-seltext_m = '库存'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.
%%APPEND_FIELDCAT  '4'  'LABST'  ''  '库存数量' .
*    CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '5'.
*  GS_FIELDCAT-fieldname = 'SPRAS'.
*  GS_FIELDCAT-outputlen = '4'.
*  GS_FIELDCAT-seltext_m = '语言代码'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.
%%APPEND_FIELDCAT  '5' 'SPRAS'  ''  '语言代码' .
*    CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '6'.
*  GS_FIELDCAT-fieldname = 'MAKTX'.
*  GS_FIELDCAT-outputlen = '18'.
*  GS_FIELDCAT-seltext_m = '物料描述'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.
%%APPEND_FIELDCAT  '6'  'MAKTX'  ''  '物料描述' .
*      CLEAR GS_FIELDCAT.
*  GS_FIELDCAT-COL_POS = '7'.
*  GS_FIELDCAT-fieldname = 'MEINS'.
*  GS_FIELDCAT-outputlen = '18'.
*  GS_FIELDCAT-seltext_m = '数量'.
*  APPEND GS_FIELDCAT TO GT_FIELDCAT.

%%APPEND_FIELDCAT  '7'  'NTGEW'  ''  '净重' .
%%APPEND_FIELDCAT  '8'  'ICON'   ''   '状态' .
%%APPEND_FIELDCAT  '9'  'CHECK'   ''   '选择' .

ENDFORM.                    " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       text  用于向layout赋值
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_LAYOUT .
GS_LAYOUT-COLWIDTH_OPTIMIZE = 'X' ."优化列宽
GS_LAYOUT-ZEBRA = 'X'.  "斑马线格式输出
GS_LAYOUT-KEY_HOTSPOT = 'X' .    "有区别于fieldcat中热点的设置,这个是关键字的热点设置
GS_LAYOUT-BOX_FIELDNAME = 'BOX'.

"详细清单属性
GS_LAYOUT-DETAIL_INITIAL_LINES = 'X'.  "是否显示值为空的字段
GS_LAYOUT-DETAIL_TITLEBAR = 'Detail Information' ."对话框标题

"表单属性
GS_LAYOUT-WINDOW_TITLEBAR = '物料信息查看'.
"退出时弹出确认对话框
GS_LAYOUT-CONFIRMATION_PROMPT = 'X'.
ENDFORM.                    " BUILD_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  BUILD_SORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_SORT .
* 1. 按照物料号升序
CLEAR GS_SORT .
GS_SORT-SPOS = '1'.
GS_SORT-FIELDNAME = 'MAKTX'.
GS_SORT-UP = 'X'.
GS_SORT-SUBTOT = 'X'."在该字段再进行小计
APPEND GS_SORT TO GT_SORT.

* 1. 按照语言升序
CLEAR GS_SORT .
GS_SORT-SPOS = '2'.
GS_SORT-FIELDNAME = 'NTGEW'.
GS_SORT-DOWN = 'X'.
APPEND GS_SORT TO GT_SORT.

ENDFORM.                    " BUILD_SORT
*&---------------------------------------------------------------------*
*&      Form  BUILD_FILTER
*&---------------------------------------------------------------------*
*       text 创建filter对数据进行筛选,这里筛除掉净重为0的。
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_FILTER .
CLEAR GS_FILTER.
GS_FILTER-FIELDNAME = 'NTGEW'. "字段名
GS_FILTER-OPTIO = 'EQ'.       "等于
GS_FILTER-SIGN0 = 'E'.         "不包含
GS_FILTER-VALUF = ''.      "空值
APPEND GS_FILTER TO GT_FILTER.
ENDFORM.                    " BUILD_FILTER
*&---------------------------------------------------------------------*
*&      Form  BUILD_EVENT
*&---------------------------------------------------------------------*
*       text alv事件
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_EVENT .
CLEAR GS_EVENT.
GS_EVENT-NAME = 'PF_STATUS_SET'.   "Name of callback event.
GS_EVENT-FORM = 'SET_STATUS'.
APPEND GS_EVENT TO GT_EVENT.

GS_EVENT-NAME = 'USER_COMMAND'.   "定义按钮功能
GS_EVENT-FORM = 'FRM_COMMAND'.
APPEND GS_EVENT TO GT_EVENT.
ENDFORM.                    " BUILD_EVENT

FORM SET_STATUS  USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB. "创建一组名为status的按钮。
ENDFORM.

FORM FRM_COMMAND USING R_UCOMM   LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN  'LEAVE'.
MESSAGE 'leave' TYPE 'I' DISPLAY LIKE 'E'.
WHEN OTHERS.
ENDCASE.

ENDFORM.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: