核心知识
核心步骤
1、设置-SET
2、获取ALV内表的值(数据引用)
3、清空变量
自己尝试
被调程序:Z_ALV_LHY
代码
*&---------------------------------------------------------------------*
*& Report ZTEST_ALV_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_alv_lhy.
*--第一步:声明ALV的相关变量
TYPE-POOLS:slis.
*DATA:lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
* ls_fieldcat TYPE slis_fieldcat_alv, "
* ls_layout TYPE slis_layout_alv. "alv格式控制的结构体:layout
DATA:lt_fieldcat TYPE slis_t_fieldcat_alv. "存储fieldcat的内表
DATA lv_colpos TYPE int2.
*--第二步:定义结构
TYPES:BEGIN OF ty_alvshow,
vbeln TYPE vbak-vbeln,"销售凭证
erdat TYPE vbak-erdat,"记录建立日期
kunnr TYPE vbak-kunnr, "售达方
vtweg TYPE vbak-vtweg, "分销渠道
ernam TYPE vbak-ernam, "创建人员名称
posnr TYPE vbap-posnr, "销售凭证项目
matnr TYPE vbap-matnr, "物料
END OF ty_alvshow.
*--第三步:定义内表和工作区
DATA: wa_alvshow TYPE ty_alvshow. "工作区
DATA: lt_alvshow TYPE TABLE OF ty_alvshow. "内表
*--第四步:读取数据
SELECT
a~vbeln a~erdat kunnr vtweg a~kostl posnr matnr
FROM vbak AS a INNER JOIN vbap AS b
ON a~vbeln = b~vbeln
INTO TABLE lt_alvshow
UP TO 10 ROWS.
DATA: gt_listheader TYPE slis_t_listheader, "ALV 表头
gs_setting TYPE lvc_s_glay,
gs_layout TYPE lvc_s_layo. "ALV布局工作区
DATA: gs_fieldcat TYPE lvc_s_fcat, "字段工作区
gt_fieldcat TYPE lvc_t_fcat. "字段的表
DATA: gs_sort TYPE lvc_s_sort, "ALV 控制:排序顺序,结构类型
gt_sort TYPE lvc_t_sort. "ALV 控制:排序标准表
PERFORM frm_set_layout. "设置布局
PERFORM frm_set_fieldcat. "设置字段
PERFORM frm_show_alv. "展示alv
PERFORM form_top_of_pace. "控制标题的显示
FORM frm_set_layout. "设置布局的子程序
gs_layout-zebra = 'X'. "斑纹的页面列表输出’
gs_layout-detailtitl = '详细信息'.
* Write: 'set layout'.
ENDFORM.
FORM frm_set_fieldcat.
CLEAR gs_fieldcat."????
REFRESH gt_fieldcat. "????
DEFINE set_fieldcat. "定义字段宏
gs_fieldcat-fieldname = &1. "标识列对应的字段名
gs_fieldcat-coltext = &2. "ALV 控制: 列标题
gs_fieldcat-no_zero = &3. "是否隐藏输出为0的字段
gs_fieldcat-key = &4. "是否是关键字
gs_fieldcat-outputlen = &5. "列输出的字符宽度
gs_fieldcat-ref_table = &6. "ALV 控制: 内部表字段的参考表名称
gs_fieldcat-ref_field = &7. "ALV 控制: 内部表字段的参考字段名称
gs_fieldcat-drdn_hndl = &8. "4 字节带符号整数
gs_fieldcat-just = 'L'."ALV 控制: 对齐
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat. "????
END-OF-DEFINITION.
set_fieldcat 'vbeln' '销售凭证' '' '' '' '' '' ''. "这里不隐藏0的部分
set_fieldcat 'erdat' '记录建立日期' 'X' '' '' '' '' ''.
set_fieldcat 'kunnr' '售达方' 'X' '' '' '' '' ''.
set_fieldcat 'vtweg' '分销渠道' 'X' '' '' '' '' ''.
set_fieldcat 'ernam' '创建人员名称' 'X' '' '' '' '' ''.
set_fieldcat 'posnr' '销售凭证项目' 'X' '' '' '' '' ''.
set_fieldcat 'matnr' '物料' 'X' '' '' '' '' ''.
DEFINE set_sort. "定义排序宏
CLEAR gs_sort.
gs_sort-fieldname = &1.
gs_sort-spos = 1. "排序顺序
gs_sort-up = 'X'. "升序排列
gs_sort-subtot = 'X'. "输出小计
APPEND gs_sort TO gt_sort.
END-OF-DEFINITION.
"调用宏
* 第一种调用宏的写法
set_sort: 'vbeln','erdat','kunnr','vtweg','ernam','posnr','matnr'.
* write:/.
* 第二种调用宏的写法
* set_sort 'vbeln'.
* set_sort 'erdat'.
* set_sort 'kunnr'.
* set_sort 'vtweg'.
* set_sort 'ernam'.
* set_sort 'posnr'.
* set_sort 'matnr'.
ENDFORM.
FORM form_pf_status_set USING rt_extab TYPE slis_t_extab. "设置GUI状态,设置工具栏
SET PF-STATUS 'ZTEST_STANDARD'.
"需要使用 set PF-STATUS 才能调用我们的工具栏,
"原来是STANDARD,现在改成我们自己的状态名
ENDFORM.
FORM frm_show_alv. "显示ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'" 调用函数模块
EXPORTING
i_callback_program = sy-cprog
i_callback_pf_status_set = 'FORM_PF_STATUS_SET'"输入函数名称,名字要输对,要大写
"i_callback_user_command = 'SUB_USER_COMMAND'
"i_callback_pf_status_set = 'form_pf_status_set' " 设置GUI状态,设置工具栏
i_callback_top_of_page = 'FORM_TOP_OF_PACE' " 设置标题,要大写
is_layout_lvc = gs_layout " ALV输出布局样式
it_fieldcat_lvc = gt_fieldcat " 设定显示的项目名称及输出设定
" it_sort_lvc = gt_sort "排序
i_save = 'A' " 保存表格布局:'X'-只能保存为全局标准变式,'U'-只能保存特定用户变式,'A'-都可以保存,SPACE-不能保存变式(默认:space)
TABLES
t_outtab = lt_alvshow " 必须参数,要显示的内表
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
ENDFORM.
FORM form_top_of_pace. "设置标题
"设置大号的标题
DATA LT_Commentary TYPE slis_t_listheader.
DATA WA_Commentary TYPE slis_listheader.
WA_Commentary-typ = 'H'.
WA_Commentary-info = '销售凭证清单'.
APPEND WA_Commentary TO LT_Commentary.
"设置中号的标题
WA_Commentary-typ = 'S'.
WA_Commentary-info = '销售凭证清单'.
APPEND WA_Commentary TO LT_Commentary.
"设置小号的标题
WA_Commentary-typ = 'A'.
WA_Commentary-info = '销售凭证清单'.
APPEND WA_Commentary TO LT_Commentary.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = LT_Commentary"因为这个参数是一个类表,故赋值一个类表
i_logo = 'LOGO'. "名称一定要大写
* I_END_OF_LIST_GRID =
* I_ALV_FORM =.
ENDFORM.
主调程序:Z_GET_OTHERALV
代码
*&---------------------------------------------------------------------*
*& Report Z_GET_OTHERALV
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z_GET_OTHERALV.
DATA REF_DATA TYPE REF TO DATA.
TYPES: BEGIN OF GTY_OUT,
VBELN TYPE VBAK-VBELN, "销售凭证
ERDAT TYPE VBAK-ERDAT, "记录建立日期
KUNNR TYPE VBAK-KUNNR, "售达方
VTWEG TYPE VBAK-VTWEG, "分销渠道
ERNAM TYPE VBAK-ERNAM, "创建人员名称
POSNR TYPE VBAP-POSNR, "销售凭证项目
MATNR TYPE VBAP-MATNR, "物料
END OF GTY_OUT.
DATA: GS_OUT TYPE GTY_OUT,
GT_OUT TYPE TABLE OF GTY_OUT.
FIELD-SYMBOLS <LT_DATA> TYPE STANDARD TABLE. "定义承接数据的动态内表,不提前定义这种类型的话,无法使用LOOP循环
"1、设置CL_SALV_BS_RUNTIME_INFO的初始设置
CALL METHOD CL_SALV_BS_RUNTIME_INFO=>SET
EXPORTING
DISPLAY = ABAP_FALSE
METADATA = ABAP_FALSE
DATA = ABAP_TRUE.
SUBMIT Z_ALV_LHY AND RETURN.
TRY.
"2、获取数据引用
CALL METHOD CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF
IMPORTING
R_DATA = REF_DATA.
CATCH CX_SALV_BS_SC_RUNTIME_INFO INTO DATA(LS_CX_SALV_BS_SC_RUNTIME_INFO).
WRITE LS_CX_SALV_BS_SC_RUNTIME_INFO->GET_TEXT( ).
ENDTRY.
"3、清空变量
CALL METHOD CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL.
ASSIGN REF_DATA->* TO <LT_DATA>.
CHECK <LT_DATA> IS ASSIGNED.
LOOP AT <LT_DATA> ASSIGNING FIELD-SYMBOL(<FS_DATA>).
MOVE-CORRESPONDING <FS_DATA> TO GS_OUT.
IF GS_OUT-ERDAT = '20250318'.
GS_OUT-ERNAM = 'LiuHongyu'.
ENDIF.
APPEND GS_OUT TO GT_OUT.
CLEAR GS_OUT.
ENDLOOP.
CL_DEMO_OUTPUT=>DISPLAY( GT_OUT ).