[SAP ABAP] ALV报表练习3
采购订单处理报表
业务目的:根据选择屏幕的筛选条件,使用ALV报表显示采购订单详情
效果展示
涉及的功能点:
① 将EBELN列设置成'HOTSPOT'热点,单击某采购凭证编号时,跳转到采购订单管理界面
② 当在采购订单报表处理查询页面取不到任何数据时,在选择画面提示错误消息"不存在满足条件的数据,请确认选择条件"
③ 在采购订单信息查询页面对屏幕上的输入字段"公司代码"进行存在检查,如果不存在该公司代码,提示消息"公司xxxx不存在,请检查"
④ 在采购订单处理报表信息页面 ,点击刷新按钮,可刷新ALV行信息的内容
完整代码如下所示
主程序(zmm01_437)
*&---------------------------------------------------------------------*
*& Report ZMM01_437
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmm01_437.
INCLUDE zmm01_437_top. " 数据定义
INCLUDE zmm01_437_f01. " 子例程
*----------------------------------------------------------------------*
* DESC: INITIALIZATION 事件
*----------------------------------------------------------------------*
INITIALIZATION.
PERFORM frm_set_initialization. " 赋初始值
*----------------------------------------------------------------------*
* DESC: AT SELECTION-SCREEN OUTPUT 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
* DESC: AT SELECTION-SCREEN 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
PERFORM frm_check_data. " 数据检查
*----------------------------------------------------------------------*
* DESC: START-OF-SELECTION 事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_get_data. " 获取数据
" 检查数据是否为空
IF gt_ekpo IS INITIAL.
MESSAGE '不存在满足条件的数据,请确认选择条件' TYPE 'E'.
ENDIF.
*---------------------------------------------------------------------*
* END-OF-SELECTION 事件
*---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM frm_display_data. " ALV呈现数据
INCLUDE程序(zmm01_437_top)
*&---------------------------------------------------------------------*
*& 包含 ZMM01_437_TOP
*&---------------------------------------------------------------------*
TABLES: ekko, ekpo.
* 选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_bukrs TYPE ekko-bukrs OBLIGATORY DEFAULT '1010'. " 公司代码(必输,默认值为1010)
SELECT-OPTIONS: s_bsart FOR ekko-bsart, " 采购凭证类型
s_aedat FOR ekko-aedat, " 创建日期
s_ernam FOR ekko-ernam, " 创建人
s_matnr FOR ekpo-matnr. " 物料号
SELECTION-SCREEN END OF BLOCK b01.
* 自定义数据类型
TYPES: BEGIN OF ty_ekpo,
sel(1), " 选择标志
index TYPE n LENGTH 5, " 序号
ebeln TYPE ekpo-ebeln, " 采购凭证编号
ebelp TYPE ekpo-ebelp, " 采购凭证行
loekz TYPE c LENGTH 10, " 删除标记
txz01 TYPE ekpo-txz01, " 行项目文本
matnr TYPE ekpo-matnr, " 物料号
maktx TYPE makt-maktx, " 物料描述
bukrs TYPE ekko-bukrs, " 公司代码
butxt TYPE t001-butxt, " 公司代码描述
werks TYPE ekpo-werks, " 工厂
name1 TYPE t001w-name1, " 工厂名称
lgort TYPE ekpo-lgort, " 存储地点
lgobe TYPE t001l-lgobe, " 存储地点描述
banfn TYPE ekpo-banfn, " 采购申请编号
menge TYPE ekpo-menge, " 订单数量
meins TYPE ekpo-meins, " 订单单位
zyshsl TYPE ekpo-menge, " 已收货数量
zwshsl TYPE ekpo-menge, " 未收货数量 (未收货数量 = 订单数量 - 已收货数量)
END OF ty_ekpo.
* 定义内表和结构变量
DATA: gs_ekpo TYPE ty_ekpo, " 结构体变量(工作区)
gt_ekpo TYPE STANDARD TABLE OF ty_ekpo. " 内表
* ALV参数定义
DATA: gs_layout TYPE lvc_s_layo, " 用于定义ALV表单的相关格式、属性
gs_fcat TYPE lvc_s_fcat, " 字段目录工作区
gt_fcat LIKE TABLE OF gs_fcat. " 字段目录内表
INCLUDE程序(zmm01_437_f01)
*&---------------------------------------------------------------------*
*& 包含 ZMM01_437_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_set_initialization
*&---------------------------------------------------------------------*
*& 屏幕缺省值设置:20240101至当前日期
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_initialization .
s_aedat-sign = 'I'.
s_aedat-option = 'EQ'.
s_aedat-low = '20240101'.
s_aedat-high = sy-datum.
APPEND s_aedat. " S_AEDAT创建日期 缺省值 20240101 至当前日期
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data.
SELECT ekpo~ebeln " 采购凭证编号
ekpo~ebelp " 采购凭证行
ekpo~loekz " 删除标记
ekpo~txz01 " 行项目文本
ekpo~matnr " 物料号
makt~maktx " 物料描述
ekko~bukrs " 公司代码
t001~butxt " 公司代码描述
ekpo~werks " 工厂
t001w~name1 " 工厂名称
ekpo~lgort " 存储地点
t001l~lgobe " 存储地点描述
ekpo~banfn " 采购申请编号
ekpo~menge " 订单数量
ekpo~meins " 订单单位
FROM ekpo
INNER JOIN ekko
ON ekpo~ebeln = ekko~ebeln
LEFT JOIN makt
ON ekpo~matnr = makt~matnr
AND makt~spras = sy-langu
LEFT JOIN t001
ON ekko~bukrs = t001~bukrs
LEFT JOIN t001w
ON ekpo~werks = t001w~werks
LEFT JOIN t001l
ON ekpo~werks = t001l~werks
AND ekpo~lgort = t001l~lgort
INTO CORRESPONDING FIELDS OF TABLE gt_ekpo
WHERE ekko~bukrs = p_bukrs
AND ekko~bsart IN s_bsart
AND ekko~aedat IN s_aedat
AND ekko~ernam IN s_ernam
AND ekpo~matnr IN s_matnr.
" 处理字段逻辑数据
IF sy-subrc = 0.
SORT gt_ekpo BY ebeln ASCENDING ebelp ASCENDING. " 输出结果按照以下字段升序排列:EBELN,EBELP
" 数据编辑
LOOP AT gt_ekpo ASSIGNING FIELD-SYMBOL(<lfs_ekpo>).
<lfs_ekpo>-index = sy-tabix. " 序号处理
" 当字段loekz = L时,显示“已删除”,否则显示为空
IF <lfs_ekpo>-loekz = 'L'.
<lfs_ekpo>-loekz = '已删除'.
ENDIF.
" zyshsl字段(已收货数量)逻辑处理
SELECT SUM( wemng )
FROM eket
INTO <lfs_ekpo>-zyshsl
WHERE ebeln = <lfs_ekpo>-ebeln
AND ebelp = <lfs_ekpo>-ebelp.
<lfs_ekpo>-zwshsl = <lfs_ekpo>-menge - <lfs_ekpo>-zyshsl. " 未收货数量 = 订单数量 - 已收货数量
" 将订单单位转换成“可读”的格式,例如将“EA”转换成“个”
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
input = <lfs_ekpo>-meins " 转换前
language = sy-langu
IMPORTING
long_text = <lfs_ekpo>-meins " 转换后
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
" 将最终输出的物料号字段,转换成“外部格式”
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = <lfs_ekpo>-matnr " 转换前
IMPORTING
output = <lfs_ekpo>-matnr. " 转换后
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& 对屏幕上的输入字段 P_BUKRS 进行“存在检查”
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_data .
DATA: lv_bukrs TYPE t001-bukrs.
SELECT SINGLE bukrs
INTO lv_bukrs
FROM t001
WHERE bukrs = p_bukrs.
IF sy-subrc <> 0.
MESSAGE e000(z_msg2025) WITH p_bukrs. " 公司&1 不存在,请检查
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_data .
" 设置fieldcat
PERFORM frm_set_fieldcat.
" 调用ALV函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_bypassing_buffer = abap_true
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_ALV_SET_STATUS' " 子例程(设置状态栏)
i_callback_user_command = 'FRM_ALV_USER_COMMAND' " 子例程(用户指令响应)
is_layout_lvc = gs_layout " 设置ALV布局
it_fieldcat_lvc = gt_fcat " 设置ALV列属性
i_save = 'A'
TABLES
t_outtab = gt_ekpo " 内表数据
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
DATA: lv_index LIKE sy-index.
CLEAR: gs_fcat,
gt_fcat,
gs_layout.
* 设置行的属性(ALV界面格式)
gs_layout-cwidth_opt = 'X'. " 设置自适应列宽
gs_layout-zebra = 'X'. " 设置斑马标识
gs_layout-box_fname = 'SEL'. " 用于ALV做选择的box
" ALV字段处理宏
DEFINE catalog.
lv_index = lv_index + 1.
gs_fcat-col_pos = lv_index.
gs_fcat-fieldname = &1. " 设置要输出的表格列的值,在内表中定义的字段名(必须大写)
gs_fcat-fix_column = &2. " 固定列
gs_fcat-ref_table = &3.
gs_fcat-edit = &4. " 是否可编辑
gs_fcat-colddictxt = 'L'.
gs_fcat-scrtext_l = &5. " 设置要输出的表格列的列名,即ALV报表显示的列名
gs_fcat-ref_field = &6.
gs_fcat-outputlen = &7.
gs_fcat-emphasize = &8. " 列颜色
gs_fcat-hotspot = &9. " 热点
APPEND gs_fcat TO gt_fcat.
END-OF-DEFINITION.
* * &1 &2 &3 &4 &5 &6 &7 &8 &9
catalog:
'INDEX' 'X' '' '' '序号' '' '' '' '',
'EBELN' 'X' '' '' '采购凭证编号' '' '' '' 'X',
'EBELP' 'X' '' '' '采购凭证行' '' '' '' '',
'LOEKZ' '' '' '' '删除标记' '' '' '' '',
'TXZ01' '' '' '' '行项目文本' '' '' '' '',
'MATNR' '' '' '' '物料号' '' '' '' '',
'MAKTX' '' '' '' '物料描述' '' '' '' '',
'BUKRS' '' '' '' '公司代码' '' '' '' '',
'BUTXT' '' '' '' '公司代码描述' '' '' '' '',
'WERKS' '' '' '' '工厂' '' '' '' '',
'NAME1' '' '' '' '工厂名称' '' '' '' '',
'LGORT' '' '' '' '存储地点' '' '' '' '',
'LGOBE' '' '' '' '存储地点描述' '' '' '' '',
'BANFN' '' '' '' '采购申请编号' '' '' '' '',
'MENGE' '' '' '' '订单数量' '' '' 'C510' '',
'MEINS' '' '' '' '订单单位' '' '' '' '',
'ZYSHSL' '' '' '' '已收货数量' '' '' '' '',
'ZWSHSL' '' '' '' '未收货数量' '' '' '' ''.
ENDFORM.
* 设置状态栏
FORM frm_alv_set_status USING ct_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTALV' EXCLUDING ct_extab.
ENDFORM.
* 设置用户指令响应
FORM frm_alv_user_command USING pv_ucomm LIKE sy-ucomm
ps_selfield TYPE kkblo_selfield.
" 编辑完成保存后强制刷新ALV页面
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: lv_stable TYPE lvc_s_stbl.
lv_stable-row = abap_true.
lv_stable-col = abap_true.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
CASE pv_ucomm. " pv_ucomm参数表示引发输入后处理的功能代码
WHEN '&IC1'. " 单击(热点)或者双击进行触发:单击和双击使用同一功能代码(用户命令执行)
READ TABLE gt_ekpo INTO gs_ekpo INDEX ps_selfield-tabindex.
IF ps_selfield-fieldname = 'EBELN'.
" 单击某采购凭证编号时,跳转到采购订单管理界面
SET PARAMETER ID 'BES' FIELD gs_ekpo-ebeln .
CALL TRANSACTION 'ZDIALOG_GZ437'.
ENDIF.
WHEN '&SX'.
PERFORM frm_get_data.
ENDCASE.
" 刷新
CALL METHOD lr_grid->refresh_table_display
EXPORTING
is_stable = lv_stable.
ENDFORM.
上述代码涉及的文本元素以及选择文本内容如下所示
GUI STATUS状态栏
补充扩展知识
调用REUSE_ALV_GRID_DISPLAY_LVC函数显示ALV,在调用该函数之前,需要先定义Layout和Fieldcat,该函数对应的Layout 类型为lvc_s_layo,Fieldcat类型为lvc_s_fcat
Layout主要用于设定 ALV的输出格式
Fieldcat主要用于ALV的结构定义,包括具体的栏位及名称、类型、格式等属性
本文涉及到的相关知识点
[SAP ABAP] ALV报表练习1
[SAP ABAP] ALV报表练习2
[SAP ABAP] Dialog屏幕开发