1、在ALV中添加表头
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = GS_LAYOUT_LVC
IT_FIELDCAT_LVC = GT_FIELDCAT_LVC
I_CALLBACK_PF_STATUS_SET = 'FRM_SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' "用于自己想添加新的控件
**I_CALLBACK_HTML_TOP_OF_PAGE = 'FRM_TOP_OF_PAGE'**
I_HTML_HEIGHT_TOP = 19
I_SAVE = 'A'
IT_EVENTS = GT_EVENTS[]
TABLES
T_OUTTAB = GT_OUTPUT
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
代码部分:
*&---------------------------------------------------------------------*
*& Form frm_top_of_page
*&---------------------------------------------------------------------*
*& text:表头信息
*&---------------------------------------------------------------------*
FORM FRM_TOP_OF_PAGE USING DOCUMENT TYPE REF TO CL_DD_DOCUMENT.
DATA: LV_TEXT TYPE SDYDO_TEXT_ELEMENT.
DATA: LV_P TYPE I,
LV_BUFFER TYPE STRING.
DATA: LV_BUTXT TYPE CHAR20.
DATA AREA1 TYPE REF TO CL_DD_AREA.
DATA AREA2 TYPE REF TO CL_DD_AREA.
*----------------------------------------------------------------------*
SELECT SINGLE BUTXT "公司代码或者公司名称
FROM T001
INTO @LV_BUTXT
WHERE BUKRS EQ @P_BUKRS.
CONCATENATE '<HTML><CENTER><H1>' '销售费用明细表' '</H1></CENTER></HTML>' INTO LV_BUFFER. " 居中 <H1>设置字体格式
CALL METHOD DOCUMENT->HTML_INSERT
EXPORTING
CONTENTS = LV_BUFFER
CHANGING
POSITION = LV_P.
LV_TEXT = LV_BUTXT.
*“输出公司名称
CALL METHOD DOCUMENT->ADD_TEXT EXPORTING TEXT = '单位名称:' && LV_TEXT.
*”把区域一分为二
CALL METHOD DOCUMENT->VERTICAL_SPLIT
EXPORTING
SPLIT_AREA = DOCUMENT
SPLIT_WIDTH = '50%'
IMPORTING
RIGHT_AREA = AREA2.
*“在区域2中输出文本:日期、单位
CONCATENATE '<P ALIGN = centre >' P_GJAHR '年' P_MONAT '月 ' INTO LV_BUFFER .
CALL METHOD AREA2->HTML_INSERT
EXPORTING
CONTENTS = LV_BUFFER
CHANGING
POSITION = LV_P.
CONCATENATE '<P ALIGN = right >' ' ' ' 金额单位: 人民币' INTO LV_BUFFER .
CALL METHOD AREA2->HTML_INSERT
EXPORTING
CONTENTS = LV_BUFFER
CHANGING
POSITION = LV_P.
ENDFORM.
2、创建动态的ALV的基础语法
*取移动类型配置表(针对给了具体的配置表并且要将配置表中的数据全部显示到ALV界面上)
PERFORM GET_GR_NUMBER.
*构建 动态字段
PERFORM BUILD_DYN_FIELD.
*创建动态内表
PERFORM CREATE_DYN_TABLE.
*&---------------------------------------------------------------------*
*& Form GET_GR_NUMBER
*&---------------------------------------------------------------------*
*& text 取移动类型配置表
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GET_GR_NUMBER .
SELECT *
FROM ZMMT0056
INTO TABLE GT_ZMMT0056.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DYN_FIELD
*&---------------------------------------------------------------------*
*& text 构建 动态字段
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM BUILD_DYN_FIELD .
SELECT * INTO TABLE @DATA(LT_ZMMT0056)
FROM ZMMT0056.
SORT LT_ZMMT0056 BY ZZYWLX.
DELETE ADJACENT DUPLICATES FROM LT_ZMMT0056 COMPARING ZZYWLX."查一下,去重
REFRESH LT_FIELDCAT.
LS_FIELDCAT-COLTEXT = '工厂'.
LS_FIELDCAT-FIELDNAME = 'WERKS'.
LS_FIELDCAT-DATATYPE = 'CHAR'.
LS_FIELDCAT-INTLEN = '4'.
APPEND LS_FIELDCAT TO LT_FIELDCAT.
CLEAR LS_FIELDCAT (在ALV中必须要加上这一句,要不然以后显示的小数的话,就可能不显示小数点前面的那个0)
LS_FIELDCAT-COLTEXT = '工厂描述'.
LS_FIELDCAT-FIELDNAME = 'NAME1'.
LS_FIELDCAT-DATATYPE = 'CHAR'.
LS_FIELDCAT-INTLEN = '30'.
APPEND LS_FIELDCAT TO LT_FIELDCAT.
CLEAR LS_FIELDCAT
LS_FIELDCAT-COLTEXT = '库存地点'.
LS_FIELDCAT-FIELDNAME = 'LGORT'.
LS_FIELDCAT-DATATYPE = 'CHAR'.
LS_FIELDCAT-INTLEN = '4'.
APPEND LS_FIELDCAT TO LT_FIELDCAT.
.
.
.
.
.
*本期收入
DATA LV_FIELDNAME TYPE CHAR40.
DATA LV_COLTEXT TYPE CHAR40.
* CLEAR: GS_ZMMT0056.
LOOP AT LT_ZMMT0056 INTO GS_ZMMT0056 WHERE ZZYWLX+0(1) = 'A'.
* 本期收入数量
LS_FIELDCAT-COLTEXT = GS_ZMMT0056-ZZYWLXMS.
LS_FIELDCAT-FIELDNAME = GS_ZMMT0056-ZZYWLX.
LS_FIELDCAT-DATATYPE = 'QUAN'.
LS_FIELDCAT-INTLEN = '13'.
LS_FIELDCAT-DECIMALS = '3'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO LT_FIELDCAT.
*本期收入金额
LS_FIELDCAT-COLTEXT = GS_ZMMT0056-ZZYWLXMS && '金额'.
LS_FIELDCAT-FIELDNAME = GS_ZMMT0056-ZZYWLX && '_JE'.
LS_FIELDCAT-DATATYPE = 'CURR'.
LS_FIELDCAT-INTLEN = '16'.
LS_FIELDCAT-DECIMALS = '2'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO LT_FIELDCAT.
ENDLOOP.
* 收入合计
LS_FIELDCAT-COLTEXT = '收入合计'.
LS_FIELDCAT-FIELDNAME = 'ZZSRHJ'.
LS_FIELDCAT-DATATYPE = 'QUAN'.
LS_FIELDCAT-INTLEN = '13'.
LS_FIELDCAT-DECIMALS = '2'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO LT_FIELDCAT.
ENDFORM.
&---------------------------------------------------------------------*
*& Form CREATE_DYN_TABLE
*&---------------------------------------------------------------------*
*& text 创建动态内表
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM CREATE_DYN_TABLE .
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = LT_FIELDCAT
IMPORTING
EP_TABLE = DY_TABLE.
ASSIGN DY_TABLE->* TO <DYN_TABLE>.
CREATE DATA DY_WA LIKE LINE OF <DYN_TABLE>.
ASSIGN DY_WA->* TO <DYN_WA>.
ASSIGN DY_WA->* TO <DYN_EMPTY>.
ENDFORM.
3、创建ALV的步骤
*----------------------------------------------------------------------*
* layout的定义
*----------------------------------------------------------------------*
DATA:GS_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
GS_VARIANT TYPE DISVARIANT,
GS_FIELDCAT LIKE LINE OF GT_FIELDCAT,
GV_REPID TYPE SYREPID.
* 给layout赋值
GS_LAYOUT-CWIDTH_OPT = 'X'.
GS_LAYOUT-ZEBRA = 'X'.
GV_REPID = SY-REPID.
* 载入需要显示的列
PERFORM FRM_APPEND_COL.
*ALV显示
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = GV_REPID
* i_callback_pf_status_set = 'FRM_SET_STATUS' "用于自己想添加新的控件
* i_callback_user_command = 'FRM_USER_COMMAND'
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_OUTPUT
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
*&---------------------------------------------------------------------*
*& Form frm_append_col
*&---------------------------------------------------------------------*
*& text 载入需要显示的列
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_APPEND_COL .
*设计需要显示的列
CLEAR GT_FIELDCAT[].
DEFINE MCR_FIELDCAT.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1. "字段名
gs_fieldcat-reptext = &2. "字段标签
gs_fieldcat-key = &3.
gs_fieldcat-no_zero = &4. "去掉前导0
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
MCR_FIELDCAT 'EKORG' '采购组织' '' ''.
MCR_FIELDCAT 'EKOTX' '采购组织描述' '' ''.
MCR_FIELDCAT 'EKGRP' '采购组' '' ''.
MCR_FIELDCAT 'EKNAM' '采购组描述' '' ''.
MCR_FIELDCAT 'LIFNR' '供应商' '' 'X'.
MCR_FIELDCAT 'NAME1_GYS' '供应商名称' '' ''.
ENDFORM.
4、在ALV界面显示的小数不显示小数点前面的0的问题
出错的原因:没加这句代码CLEAR LS_FIELDCAT,就是没清空FIELDCAT的工作区
5、ALV中去除前导0
(1)在ALV中直接添加一列就可以了
DEFINE MCR_FIELDCAT.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-reptext = &2.
gs_fieldcat-key = &3.
gs_fieldcat-no_zero = &4. 这一列就是表示去除前导0
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
6、ALV界面的复选框变成不可选
(1)首先在要输出的ALV的内表的定义里面添加一个字段 style type lvc_t_styl, " 为内表添加设置编辑状态所需的字段
(2)定义一个内表
data:gs_edit type lvc_s_styl,
gt_edit type lvc_t_styl.
(3)然后给layout赋值的时候,对layout的stylefname进行赋值。