ALV
ALV概述
全称 alv_list_view ,是sap提供的一个强大的数据报表显示工具,alv实质上是一个屏幕控件对象,他通过程序传递数据内表的方式来显示数据
类型池 : slis
TYPE-POOLS SLIS . "类型池
REUSR_ALV_GRID_DISPLAY
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
* I_CALLBACK_PROGRAM = SY-CPR OG "调用alv函数返回的程序
* I_CALLBACK_PF_STATUS_SET = '子程序名' "设置alv程序内的按钮
* I_CALLBACK_USER_COM AND = '子程序名' "设置按钮功能,传输form名称
* I_CALLBACK_TOP_OF_PAGE = ' ' "表头
* I_CALLBACK_HTML_TOP_OF_PAGE = ' ' "动态表头
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME = 'zstudent' "数据库表名(直接去表内容) (单表)
* I_BACKGROUND_ID = ' '
I_GRID_TITLE = '标题'
* I_GRID_SETTINGS =
IS_LAYOUT = GT_LAYOUT "全局格式,表样式的优化
IT_FIELDCAT = GT_FIELDCAT "列格式设置(表单),必须执行的函数
* IT_EXCLUDING = "隐藏alv基本按钮
* IT_SPECIAL_GROUPS =
IT_SORT = GT_SORT "设置排序内容等
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' ' "
* IS_VARIANT = "
IT_EVENTS = GT_EVENTS "定义alv事件 增加按钮
* 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 =
* O_PREVIOUS_SRAL_HANDLER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = GT_XX "显示表 内表名
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
fieldcat --> 列属性 --> 内表
DATA GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV .
DATA GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV .
列格式设置(表单)字段名称,列是否可修改,列宽度等
FORM BUILD_FIELDCAT .
CLEAR : GV_INDEX , GT_FIELDCAT .
PERFORM FRM_EDIT_FIELDCAT USING 'ZCODE' '学生编号'.
PERFORM FRM_EDIT_FIELDCAT USING 'ZNAME' '学生姓名'.
PERFORM FRM_EDIT_FIELDCAT USING 'ZSEX' '性别'.
ENDFORM.
FORM FRM_EDIT_FIELDCAT USING P_FIELD TYPE STRING
P_TEXT TYPE STRING.
ADD 1 TO GV_INDEX .
GS_FIELDCAT-COL_POS = GV_INDEX . " 第几列输出
GS_FIELDCAT-FIELDNAME = P_FIELD . " 字段名
GS_FIELDCAT-SELTEXT_M = P_TEXT . " 描述文本
CASE P_FIELD.
WHEN 'ZCODE' .
GS_FIELDCAT-KEY = 'X' . " 奖列设为关键字
GS_FIELDCAT-HOTSPOT = 'X' . " 热点
WHEN 'ICON' .
GS_FIELDCAT-ICON = 'X' . " 图标
"取数中书写`
LOOP AT GT_STUDENT INTO GS_STUDENT . " 图标
IF GS_STUDENT-ZSEX = 'M' .
GS_STUDENT-ICON = ICON_GREEN_LIGHT .
ELSE .
GS_STUDENT-ICON = ICON_RED_LIGHT .
ENDIF.
MODIFY GT_STUDENT FROM GS_STUDENT .
ENDLOOP.
WHEN 'CHECK' .
GS_FIELDCAT-CHECKBOX = 'X' . "复选框
WHEN 'LABST'. "表的列属性
GS_FIELDCAT-DO_SUM = 'X'. "合计
GS_FIELDCAT-QUANTITY = 'FER' . "直接指明的国定单位
GS_FIELDCAT-QFIELDNAME = 'WERKS'. "内表中表明当前数值的单位的字段
ENDCASE .
APPEND GS_FIELDCAT TO GT_FIELDCAT .
ENDFORM.
字段说明
key将该列设置为关键字 (x/ )icon以图标显示 (x/ )checkbok以复选框显示 (x/ )just定义对其方式 (r/l/c)lzero增加前导零 (x/ )no_sign不显示符号 (x/ )no_zero不显示前导零 (x/ )col_pos作为第几列输出 (数字)do_sum对字段进行总汇 (x/ )select_l/m/s字段名称描述长/中/短 (字符串)hotspot设置为热点 (显示为有下划线) (x/ )
layout --> 全局格式 --> 结构
DATA GS_LAYOUT TYPE SLIS_LAYOUT_ALV.
全局格式设置(结构)整表字段是否可修改,是否以斑马纹输出,是否显示选择按钮字段等
FORM BUILD_LAYOUT .
GS_LAYOUT-COLWIDTH_OPTIMIZE = 'X' . " 优化列宽
GS_LAYOUT-ZEBRA = 'X' . " 斑马纹
GS_LAYOUT-EDIT = 'X' . " 是否可编辑模式
GS_LAYOUT-NO_VLINE = 'X' . " 不显示垂直格线
GS_LAYOUT-NO_ULINE_HS = 'X' . " 不显示水平格线
GS_LAYOUT-KEY_HOTSPOT = 'X' . " 热点
GS_LAYOUT-BOX_FIELDNAME = 'BOX' . " 内表中字段名称 - 定义为当前行的选择按钮
GS_LAYOUT-INFO_FIELDNAME = 'COLOR' " 行颜色
GS_LAYOUT-COLTAB_FIELDNAME = 'COLOR' " 单元格颜色
GS_LAYOUT-DETAIL_INITIAL_LINES = 'X' . " 点击详情 显示空字段
GS_LAYOUT-WINDOW_TITLEBAR = '窗体抬头' .
GS_LAYOUT-CONFIRMATION_PROMPT = 'X' . " 弹出提示框 - 是否退出
ENDFORM.
字段说明
edit是否为可编辑模式 (x/ )colwidth_optimize优化列宽,根据内容自动匹配宽度 (x/ )no_vline不显示垂直格线 (x/ )no_uline_hs不显示水平格线 (x/ )info_fieldname设置标志颜色字段 (内表中字段名称)key_hotspot设置关键字断热点 (x/ )no_colname是否显示字段名 (x/ )zebra以斑马纹输出,深浅色底纹相间 (x/ )
SORT --> 排序
DATA GT_SORT TYPE SLIS_T_SORTINFO_ALV .
DATA GS_SORT TYPE SLIS_SORTINFO_ALV .
FORM BUILD_SORT .
" 按照学校升序
CLEAR GS_SORT .
GS_SORT-SPOS = '1' .
GS_SORT-FIELDNAME = 'ZSCHOOL' .
GS_SORT-UP = 'X' .
GS_SORT-SUBTOT = 'X' . "分类小计
APPEND GS_SORT TO GT_SORT .
" 按照性别降序
CLEAR GS_SORT .
GS_SORT-SPOS = '2' .
GS_SORT-FIELDNAME = 'ZSEX' .
GS_SORT-DOWN = 'X' .
APPEND GS_SORT TO GT_SORT .
ENDFORM.
FILTER --> 筛选
DATA GT_FILTER TYPE SLIS_T_FILTER_ALV .
DATA GS_FILTER TYPE SLIS_FILTER_ALV .
FORM BUILD_FILTER .
CLEAR GS_FILTER .
GS_FILTER-FIELDNAME = 'ZSEX' . " 字段名
GS_FILTER-SIGN0 = 'E' . " 不包含
GS_FILTER-OPTIO = 'EQ' . " 等于
GS_FILTER-VALUF = '' . " 空值
APPEND GS_FILTER TO GT_FILTER .
ENDFORM.
EVENT --> CALLBACK事件
DATA GT_EVENTS TYPE SLIS_T_EVENT .
DATA GS_EVENTS TYPE SLIS_ALV_EVENT .
FORM BUILD_EVENTS .
CLEAR GS_EVENTS . "自定义按钮
GS_EVENTS-NAME = 'PF_STATUS_SET' .
GS_EVENTS-FORM = 'SET_STATUS' . "子程序名
APPEND GS_EVENTS TO GT_EVENTS .
CLEAR GS_EVENTS .
GS_EVENTS-NAME = 'USER_COMMAND' .
GS_EVENTS-FORM = 'FM_USER_COMMAND' .
APPEND GS_EVENTS TO GT_EVENTS .
ENDFORM.
FORM SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB .
SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB . "自定义按钮
* SET PF-STATUS 'ST_STATUS' EXCLUDING RT_EXTAB . " 参照标准按钮
ENDFORM .
FORM FM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD .
*-----------------------------------------------* 按钮功能
CASE R_UCOMM .
WHEN '&IC1' . "单击
CASE RS_SELFIELD-FIELDNAME .
WHEN '字段名' . "单击要设置热点 双击不用设置热点
MESSAGE S000 WITH '点击' RS_SELFIELD-VALUE
WHEN '字段名' .
"内存id
SET PARAMETER ID 'LIF' FIELD RS_SELFIELD-VALUE .
CALL TRANSACTION 'FK03' .
ENDCASE .
WHEN 'CALLSF' . "双击
DEAD TABLE GT_STUDENT INTO GS_STUDENT INDEX RS_SELFIELD-TABINDEX.
PERFORM CALL_SMARTFORMS USEING GS_STUDENT-字段.
WHEN 'DOWNLOAD' .
" PERFORM DOWNLOAD_FILE
ENDCASE.
ENDFORM .
start-of-selection --> 取数
START-OF-SELECTION . "取数
PERFORM 子程序 .
FORM GET_DATA .
*-----------------------------------------------* 取数
DATA : LT_MARA TYPE TABLE OF TY_MARA,
LS_MARA TYPE TY_MARA,
LT_MAKT TYPE TABLE OF TY_MAKT,
LS_MAKT TYPE TY_MAKT.
SELECT
LGORT,
MATNR,
LABST,
WERKS
INTO TABLE @DATA(LT_MARD) "新语法
FROM MARD.
IF LT_MARD IS NOT INITIAL .
SELECT
MATNR
MEINS
MTART
INTO TABLE LT_MARA
FROM MARA
FOR ALL ENTRIES IN LT_MARD
WHERE MATNR = LT_MARD-MATNR .
SELECT
MATNR
MAKTX
INTO TABLE LT_MAKT
FROM MAKT
FOR ALL ENTRIES IN LT_MARD
"FOR ALL ENTRIES IN --key全取 表不为空
WHERE MATNR = LT_MARD-MATNR .
ENDIF.
LOOP AT LT_MARD INTO DATA(LS_MARD).
MOVE-CORRESPONDING LS_MARD TO GS_XX . "按相同字段名称依次进行赋值
READ TABLE LT_MARA INTO LS_MARA WITH KEY MATNR = LS_MARD-MATNR.
READ TABLE LT_MAKT INTO LS_MAKT WITH KEY MATNR = LS_MARD-MATNR.
IF SY-SUBRC = 0 .
GS_XX-MTART = LS_MARA-MTART .
GS_XX-MEINS = LS_MARA-MEINS .
GS_XX-MAKTX = LS_MAKT-MAKTX .
ENDIF .
APPEND GS_XX TO GT_XX.
CLEAR:GS_XX.
ENDLOOP.
ENDFORM.
数据表单数据选取
end-of-selection --> 读数
END-OF-SELECTION . "读数
IF 内表 IS NOT INITIAL .
PERFORM 子程序 .
ELSE .
MESSAGE S001 DISPLAY LIKE 'E' .
ENDIF .
FORM 子程序 .
PERFORM BUILD_FIELDCAT .
PERFORM BUILD_LAYOUT .
PERFORM BUILD_SORT .
PERFORM BUILD_FILTER .
PERFORM BUILD_EVENTS .
PERFORM BUILD_ALV .
ENDFORM.
对fieldcat赋值:设置每列格式
对layout赋值:设置表单格式
对sort表等赋值:设置排序内容等
对event表赋值:增加程序交互事件
调用函数:输出alv