前言在日常的 SAP ABAP 开发中ALVSAP List Viewer报表是最常见的开发任务之一。很多初学者在面对 ALV 开发时常常会因为代码结构混乱、缺乏框架感而感到无从下手。笔者基于几个实际的报表程序的代码分别拆解并提炼出可复用的、清晰标准的 ALV 框架。主要涵盖数据结构定义、选择屏幕、权限检查、数据查询、以及最终的 ALV 展示。一、使用 REUSE_ALV_GRID_DISPLAY_LVC 搭建一个标准的 SAP Function ALV 框架REUSE_ALV_GRID_DISPLAY_LVC是 SAP ABAP 中最经典、最常用的 ALV 显示函数通过传入布局、字段目录和数据即可生成功能完备的交互式表格报表。报表主要核心逻辑流程如下┌─────────────────────────────────────────────┐│ 报表框架 │├─────────────────────────────────────────────┤│ 1. 声明 TABLES TYPES DATA ││ 2. 定义选择屏幕 (SELECTION-SCREEN) ││ 3. INITIALIZATION (可选: 设默认值) ││ 4. AT SELECTION-SCREEN (可选: 校验) ││ 5. START-OF-SELECTION ││ ├── frm_check_auth ← 权限检查 ││ ├── frm_get_data ← SQL 查询 ││ └── frm_display_alv ← ALV 展示 ││ ├── set_layout ││ ├── frm_get_fieldcat × N ││ └── REUSE_ALV_GRID_DISPLAY_LVC ││ 6. END-OF-SELECTION │└─────────────────────────────────────────────┘1、数据结构定义 (TYPES DATA)REPORT zppr019. TABLES: zppt013, zppt002. 引用字典表 TYPES: BEGIN OF ty_alv, sel TYPE ad_mark, 选择框 werks TYPE zppt013-werks, 工厂 ... 其他字段 ... zmessage TYPE zppt013-zmessage, 消息 END OF ty_alv. DATA: gt_alv TYPE TABLE OF ty_alv, 输出内表 ls_alv TYPE ty_alv. DATA: gs_layout TYPE lvc_s_layo, 布局 gt_fieldcat TYPE lvc_t_fcat, 字段目录 gs_fieldcat TYPE lvc_s_fcat.2、选择屏幕 (SELECTION SCREEN)SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001. PARAMETERS: p_werks TYPE zppt013-werks OBLIGATORY. SELECT-OPTIONS: s_aufnr FOR zppt013-aufnr, s_ernam FOR zppt013-ernam, s_erdat FOR zppt013-erdat. SELECTION-SCREEN END OF BLOCK blk1.3、事件驱动与主逻辑分离INITIALIZATION. * 初始化设置默认值等 AT SELECTION-SCREEN. * 校验用户点击执行后的数据校验 START-OF-SELECTION. * 主逻辑集中调用三个关键 FORM PERFORM frm_check_auth. PERFORM frm_get_data. PERFORM frm_display_alv. END-OF-SELECTION.4、权限检查 (frm_check_auth)FORM frm_check_auth . 查询生产主管 (fevor) 列表 SELECT werks, fevor FROM t024f INTO TABLE DATA(lt_t024f) WHERE werks p_werks AND fevor IN s_fevor. LOOP AT lt_t024f ASSIGNING FIELD-SYMBOL(ls_t024f). 授权对象 ZFEVOR检查工厂和生产主管权限 AUTHORITY-CHECK OBJECT ZFEVOR ID WERKS FIELD ls_t024f-werks ID ZFEVOR FIELD ls_t024f-fevor. IF sy-subrc NE 0. MESSAGE 无对应的权限请确认 TYPE E. ENDIF. ENDLOOP. ENDFORM.5、数据检索 (frm_get_data)FORM frm_get_data . SELECT a~werks, a~znumber, a~aufnr, a~zbstype, a~zywcjms, a~zzline, b~zzlinedesc, b~fevor, a~matnr, a~maktx, a~charg, a~erfmg, a~erfme, a~ernam, a~erdat, a~erzet, a~zmessage FROM zppt013 AS a LEFT JOIN zppt002 AS b ON a~werks b~werks AND a~zzline b~zzline WHERE a~werks p_werks AND a~aufnr IN s_aufnr AND a~erdat IN s_erdat INTO CORRESPONDING FIELDS OF TABLE gt_alv. ENDFORM.6、ALV 显示与 Fieldcat 工具 (frm_display_alv)FORM frm_display_alv . PERFORM set_layout. 使用统一工具 FORM 构建字段目录 PERFORM frm_get_fieldcat USING: WERKS 工厂 ZPPT013 WERKS . PERFORM frm_get_fieldcat USING: MATNR 物料 ZPPT013 MATNR . ... 其他字段 ... CALL FUNCTION REUSE_ALV_GRID_DISPLAY_LVC EXPORTING i_callback_program sy-cprog is_layout_lvc gs_layout it_fieldcat_lvc gt_fieldcat i_save A TABLES t_outtab gt_alv. ENDFORM. * 工具 FORM统一添加字段到 Fieldcat FORM frm_get_fieldcat USING p1 p2 p3 p4 p5 p6 p7 p8 p9. CLEAR: gs_fieldcat. gs_fieldcat-fieldname p1. 字段名 gs_fieldcat-coltext p2. 列文本 gs_fieldcat-scrtext_l p2. 长文本 gs_fieldcat-scrtext_m p2. 中文本 gs_fieldcat-scrtext_s p2. 短文本 gs_fieldcat-ref_table p3. 参考表 gs_fieldcat-ref_field p4. 参考字段 gs_fieldcat-emphasize p5. 强调颜色 gs_fieldcat-fix_column p6. 固定列 gs_fieldcat-edit p7. 可编辑 gs_fieldcat-checkbox p8. 复选框 gs_fieldcat-hotspot p9. 热点链接 APPEND gs_fieldcat TO gt_fieldcat. ENDFORM.7、布局设置 (set_layout)FORM set_layout . CLEAR gs_layout. gs_layout-zebra abap_true. 斑马纹 gs_layout-no_toolbar abap_true. 隐藏标准工具栏 gs_layout-cwidth_opt abap_true. 自动列宽优化 gs_layout-box_fname SEL. 选择框字段名 ENDFORM.常用布局说明属性作用示例值zebra斑马纹abap_truecwidth_opt自动优化列宽abap_truebox_fname指定选择框字段名SELsel_mode选择模式如多行Dno_toolbar是否隐藏标准工具栏abap_true二、使用 CL_GUI_ALV_GRID 面向对象展示 ALV (OO ALV)CL_GUI_ALV_GRID 是 SAP 面向复杂单据开发的 OO ALV 容器类相比函数式REUSE_ALV_GRID_DISPLAY_LVC支持单元格编辑、单元格样式控制、动态自定义工具栏、单元格联动事件、自定义 F4 弹窗、子 ALV 弹窗、多操作模式切换新增 / 修改 / 删除 / 查询适合出入库、调拨、退料等需要在线编辑保存的自建业务单据本文基于物料单据模板 ZMMF006 拆解一套可通用 OO ALV 单据开发框架。报表主要核心逻辑流程如下1. 全局定义层- 业务输出结构、库存弹窗结构、打印表头/表身结构体- ALV全局对象、内表、屏幕全局变量2. 选择屏幕层- 业务场景下拉、工厂、单号/仓库/日期选择框- 四大操作模式单选框3. ALV事件类核心LCL_EVENT_RECEIVER统一封装toolbar、data_changed_finished、user_command、onf4、hotspot_click五大事件4. 标准执行块INITIALIZATION默认初始化日期范围AT SELECTION-SCREEN OUTPUT业务场景权限过滤下拉框AT SELECTION-SCREEN输入合法性校验START-OF-SELECTION程序主流程入口5. 屏幕模块屏幕1029主ALV编辑界面PF-STATUS自定义工具栏屏幕0707批次库存弹窗子ALV界面6. 功能子程序库业务逻辑隔离FRM_CHECK_AUTH权限校验入口FRM_GET_DATA主数据读取逻辑FRM_DISPLAY_ALVALV渲染统一入口FRM_BULED_FCAT动态生成字段目录FRM_SET_DRDN_TABLE单元格下拉框配置FRM_MARK_SELECTIONALV选中行缓存与回填解决刷新丢失选中FRM_CREATE新增空行默认赋值FRM_DELETE行删除逻辑新增行直接删/已有单据标记删除FRM_CHECK全量行数据校验核心校验逻辑FRM_SAVE单据保存、单号生成、数据库批量更新、OA推送FRM_OPEN_SHLP_DIALOG批次库存弹窗读取与渲染FRM_PRINT_FUNCTIONSmartForms批量打印标准模板FRM_SEND_OAOA审批推送预留接口1、全局数据结构定义(TYPES DATA)REPORT zmmf006. INCLUDE cl_alv_control. TABLES:zmmt002, zmmt003. 业务单据主表、业务配置表 1.主ALV输出结构体单据明细核心结构 TYPES:BEGIN OF ts_out. INCLUDE TYPE zmmt002. 复用字典业务表减少字段重复定义 ...其它字段 TYPES: error_exist TYPE boolean, 行校验错误标记 menge TYPE mllbkum, 实时库存 sele TYPE ad_mark, 行多选标记 status_doc TYPE rmpsp_dp_status, 行状态红绿灯图标 mess TYPE vec_message, 行错误提示文本 styl TYPE lvc_t_styl, 单元格样式内表禁用/高亮/F4 updkz TYPE updkz_d, 操作标记 I新增 U修改 D删除 name1_lifnr TYPE lfa1-name1, 供应商名称缓存 name1_kunnr TYPE kna1-name1, 客户名称缓存 END OF ts_out. 2.批次库存弹窗子ALV结构体 TYPES:BEGIN OF ts_stock, lgort TYPE lgort_d, clabs TYPE labst, zzhw TYPE ze_zzhq, labst TYPE labst, speme TYPE speme, cspem TYPE speme. INCLUDE TYPE zmmt004. 批次特性表 TYPES: sele TYPE ad_mark, 弹窗选中标记 END OF ts_stock. 3.打印专用拆分结构体解耦打印逻辑 TYPES:BEGIN OF ty_head_print, 打印表头 butxt TYPE t001-butxt, title TYPE char20, zdylx TYPE zmmt003-zdylx, znumber TYPE zmmt002-znumber, lgobe TYPE t001l-lgobe, zcrdate TYPE zmmt002-zcrdate, zywcjms TYPE zmmt002-zywcjms, lgobe_umlgo TYPE t001l-lgobe, department TYPE adcp-department, zzdr TYPE char20, zsum_lfimg TYPE lips-lfimg. END OF ty_head_print. TYPES:BEGIN OF ty_item_print, 打印明细 znumber TYPE zmmt002-znumber, matnr TYPE zmmt002-matnr, maktx TYPE zmmt002-maktx, zzkhgg TYPE zmmt002-zzkhgg, z_khph TYPE zmmt002-z_khph, erfmg TYPE zmmt002-erfmg, msehl TYPE t006a-msehl, zzhwms TYPE zwmt003-zzhwms. END OF ty_item_print. 全局数据对象 DATA: gs_head_print TYPE ty_head_print, gs_item_print TYPE ty_item_print, gt_item_print TYPE TABLE OF ty_item_print. DATA: lt_zywcjdm TYPE TABLE OF zmmt002-zywcjdm. OO ALV核心容器对象 DATA: go_alv TYPE REF TO cl_gui_alv_grid, ok_code TYPE sy-ucomm. DATA:gt_out TYPE TABLE OF ts_out, 主ALV输出内表 gt_stock TYPE TABLE OF ts_stock, 弹窗库存内表 gt_fcat TYPE lvc_t_fcat. 动态字段目录2、选择屏幕SELECTION SCREENSELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-002. PARAMETERS:p_ywcj TYPE zmmt002-zywcjdm AS LISTBOX VISIBLE LENGTH 24, 业务场景下拉 p_werks TYPE zmmt002-werks OBLIGATORY. 工厂必输 SELECT-OPTIONS:s_number FOR zmmt002-znumber, 单据号 s_lgort FOR zmmt002-lgort, 库存地点 s_erdat FOR zmmt002-zcrdate, 创建日期 s_ernam FOR zmmt002-zcreated. 制单人 SELECTION-SCREEN END OF BLOCK blk1. SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE TEXT-003. 四大操作模式单选按钮 PARAMETERS:p_ins TYPE boolean RADIOBUTTON GROUP rg1, 创建 p_mod TYPE boolean RADIOBUTTON GROUP rg1, 修改 p_del TYPE boolean RADIOBUTTON GROUP rg1, 删除 p_que TYPE boolean RADIOBUTTON GROUP rg1. 查询 SELECTION-SCREEN END OF BLOCK blk2.3、ALV 统一事件类定义框架核心交互事件收拢单独本地类封装全部 ALV 交互事件避免代码分散按需求可完整复用至所有类似程序CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object, handle_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid IMPORTING e_modified et_good_cells, handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm, handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid IMPORTING e_fieldname es_row_no er_event_data, handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id. ENDCLASS. CLASS lcl_event_receiver IMPLEMENTATION. * 1.handle_finished单元格编辑后置联动回填物料/供应商/库存自动带出 METHOD handle_finished. CHECK e_modified EQ abap_true. READ TABLE et_good_cells ASSIGNING FIELD-SYMBOL(ls_cell) INDEX 1. READ TABLE gt_out ASSIGNING FIELD-SYMBOL(ls_out) INDEX ls_cell-row_id. 根据修改字段查表回填附属信息 CASE ls_cell-fieldname. WHEN LIFNR. 供应商带出名称 SELECT SINGLE name1 FROM lfa1 INTO ls_out-name1_lifnr WHERE lifnr ls_out-lifnr. WHEN MATNR. 物料带出描述、单位、批次标识、实时库存 SELECT SINGLE maktx FROM makt INTO ls_out-maktx WHERE matnr ls_out-matnr AND spras sy-langu. SELECT SINGLE meins zznbgg FROM mara INTO (ls_out-erfme,ls_out-zznbgg) WHERE matnr EQ ls_out-matnr. SELECT SINGLE xchpf FROM marc INTO ls_out-xchpf WHERE matnr ls_out-matnr AND werks ls_out-werks. WHEN CHARG. 批次带出客户规格 SELECT SINGLE z_khph zzkhgg FROM zmmt004 INTO (ls_out-z_khph,ls_out-zzkhgg) WHERE matnr ls_out-matnr AND charg ls_out-charg. WHEN MATNR OR WERKS OR LGORT OR INSMK. 读取库存数量 SELECT SINGLE labst speme FROM mard INTO DATA(ls_mard) WHERE matnr EQ ls_out-matnr AND werks EQ ls_out-werks AND lgort EQ ls_out-lgort. IF ls_out-insmk EQ space. ls_out-menge ls_mard-labst. ELSE. ls_out-menge ls_mard-speme. ENDIF. ENDCASE. 修改单据赋值更新标记 IF p_mod EQ abap_true. ls_out-updkz cl_logic_accessgc_updkz_u. ENDIF. 稳定刷新ALV行列不跳转 go_alv-refresh_table_display( is_stable VALUE lvc_s_stbl( row abap_true col abap_true ) ). ENDMETHOD. * 2.handle_toolbar动态生成工具栏不同模式展示不同按钮 METHOD handle_toolbar. DELETE e_object-mt_toolbar WHERE function CS |LOCAL|. 移除标准布局按钮 CASE abap_true. WHEN p_ins . 创建新增、删除、保存 e_object-mt_toolbar VALUE #( BASE e_object-mt_toolbar ( butn_type 3 ) ( function CRE text TEXT-004 )( function DEL text TEXT-008 )( function SAVE text TEXT-007 ) ). WHEN p_mod. 修改仅保存 e_object-mt_toolbar VALUE #( BASE e_object-mt_toolbar ( butn_type 3 )( function SAVE text TEXT-007 ) ). WHEN p_del. 删除标记删除、保存 e_object-mt_toolbar VALUE #( BASE e_object-mt_toolbar ( butn_type 3 )( function DEL text TEXT-005 )( function SAVE text TEXT-007 ) ). WHEN p_que. 查询仅打印 e_object-mt_toolbar VALUE #( BASE e_object-mt_toolbar ( butn_type 3 )( function PRINT text TEXT-009 ) ). ENDCASE. ENDMETHOD. * 3.handle_user_command工具栏按钮命令分发 METHOD handle_user_command. go_alv-check_changed_data( ). 捕获未回车的单元格修改数据 PERFORM frm_mark_selection USING 01. 缓存选中行 CASE e_ucomm. WHEN CRE. PERFORM frm_create. 新增行 WHEN DEL. PERFORM frm_delete. 删除行 WHEN SAVE. PERFORM frm_check. PERFORM frm_save. 校验保存 WHEN PRINT. PERFORM frm_print_function. 批量打印 ENDCASE. go_alv-refresh_table_display( is_stable VALUE lvc_s_stbl( row abap_true col abap_true ) ). PERFORM frm_mark_selection USING 10. 刷新回填选中行 ENDMETHOD. * 4.handle_onf4自定义批次F4弹出库存子ALV弹窗 METHOD handle_onf4. CASE e_fieldname. WHEN CHARG. PERFORM frm_open_shlp_dialog USING es_row_no-row_id. ENDCASE. er_event_data-m_event_handled abap_true. go_alv-refresh_table_display( is_stable VALUE lvc_s_stbl( row abap_true col abap_true ) ). ENDMETHOD. * 5.handle_hotspot_click库存弹窗批次热点点击回填主表 METHOD handle_hotspot_click. gt_stock[ e_row_id-index ]-sele abap_true. LEAVE TO SCREEN 0. ENDMETHOD. ENDCLASS.4、标准执行块程序执行顺序INITIALIZATION. * 初始化默认查询日期近31天 DATA: lv_end_date TYPE sy-datum, lv_start_date TYPE sy-datum. lv_end_date sy-datum. lv_start_date sy-datum - 31. s_erdat-low lv_start_date. s_erdat-high lv_end_date. INSERT s_erdat INTO TABLE s_erdat. AT SELECTION-SCREEN OUTPUT. * 业务场景下拉权限过滤仅展示用户有权限场景 DATA lt_values TYPE vrm_values, lt_filtered TYPE vrm_values. SELECT zywcjdm AS key zywms AS text FROM zmmt003 INTO TABLE lt_values WHERE zywcjdm GT Z007. LOOP AT lt_values ASSIGNING FIELD-SYMBOL(ls_values). AUTHORITY-CHECK OBJECT ZYWCJ ID ZYWCJ FIELD ls_values-key. IF sy-subrc 0. APPEND ls_values TO lt_filtered. ENDIF. ENDLOOP. lt_values lt_filtered. CALL FUNCTION VRM_SET_VALUES EXPORTING id P_YWCJ values lt_values. AT SELECTION-SCREEN. * 屏幕输入校验日期区间、单号必填控制 lt_zywcjdm VALUE #( ( Z011 ) ( Z013 ) ( Z015 ) ( Z030 ) ). IF sy-ucomm ONLI AND s_number[] IS INITIAL AND line_exists( lt_zywcjdm[ table_line p_ywcj ] ). MESSAGE e001(00) WITH 单号必输. ENDIF. IF p_ins NE X. LOOP AT s_erdat ASSIGNING FIELD-SYMBOL(ls_date) WHERE sign I AND option BT. IF ls_date-high - ls_date-low 120. MESSAGE 查询区间不得超过120天请重新输入 TYPE E. ENDIF. ENDLOOP. ENDIF. START-OF-SELECTION. * 主流程统一调用三层逻辑 PERFORM frm_check_auth. 权限校验 PERFORM frm_get_data. 数据读取 PERFORM frm_display_alv. ALV渲染展示5、权限检查 (frm_check_auth)FORM frm_check_auth . * 预留业务权限校验逻辑可扩展工厂、单据操作权限检查 ENDFORM.6、数据检索 (frm_get_data)FORM frm_get_data . DATA:lt_ywcj TYPE RANGE OF zel_ywcjdm. * 业务场景查询条件赋值 IF p_ywcj EQ space. lt_ywcj VALUE #( ( sign |I| option |NB| low |Z001| high |Z007| ) ). ELSE. lt_ywcj VALUE #( ( sign |I| option |EQ| low p_ywcj ) ). ENDIF. * 读取业务配置表 SELECT SINGLE * FROM zmmt003 INTO zmmt003 WHERE zywcjdm EQ p_ywcj. * 查询模式读取数据库单据数据创建模式无需读取历史数据 IF p_que EQ abap_true. SELECT * FROM zmmt003 INTO CORRESPONDING FIELDS OF TABLE gt_out WHERE werks p_werks AND zywcjdm IN lt_ywcj AND znumber IN s_number AND zcrdate IN s_erdat. ENDIF. ENDFORM.7、ALV 入口渲染与动态字段目录 (frm_display_alv frm_buled_fcat)7.1 ALV 统一渲染入口FORM frm_display_alv . IF gt_out IS NOT INITIAL OR p_ins EQ abap_true. PERFORM frm_buled_fcat. 动态生成字段目录 CALL SCREEN 1029. 调用主ALV屏幕 ELSE. MESSAGE s001(/accgo/acm_uis_corrc). ENDIF. ENDFORM.7.2 动态字段目录生成工具 FORM frm_buled_fcat按需FORM frm_buled_fcat. CASE abap_true. WHEN p_ins OR p_mod. 创建/修改模式区分业务场景控制编辑权限 IF line_exists( lt_zywcjdm[ table_line p_ywcj ] ). 退料业务仅数量可编辑其余字段锁定 gt_fcat VALUE #( ( fieldname MATNR outputlen 18 edit abap_true ) ( fieldname ERFMG outputlen 16 edit abap_false ) ( fieldname INSMK outputlen 12 drdn_hndl 1 drdn_alias abap_true ) ( fieldname CHARG outputlen 12 f4availabl xsdbool( zmmt003-charg EQ |A| ) ) ... 其余业务字段 ). ELSE. 常规创建/修改全字段可编辑 gt_fcat VALUE #( ( fieldname MATNR edit abap_true outputlen 18 ) ( fieldname WERKS edit abap_true outputlen 8 ) ... ). ENDIF. WHEN p_del OR p_que. 删除/查询全部段只读展示完整操作日志字段 gt_fcat VALUE #( BASE gt_fcat ( fieldname ZNUMBER outputlen 16 ) ( fieldname ZCREATED outputlen 12 ) ( fieldname ZCRDATE outputlen 10 ) ( fieldname MBLNR outputlen 12 ) ... ). ENDCASE. * 自动读取结构体元数据填充字段文本、参考表无需手动维护coltext DATA(lt_dfies) cl_salv_data_descrread_structdescr( CAST cl_abap_structdescr( cl_abap_structdescrdescribe_by_data( VALUE ts_out( ) ) ) ). SORT lt_dfies BY fieldname. LOOP AT gt_fcat ASSIGNING FIELD-SYMBOL(fs_fcat). READ TABLE lt_dfies ASSIGNING FIELD-SYMBOL(fs_dfies) WITH KEY fieldname fs_fcat-fieldname BINARY SEARCH. fs_fcat CORRESPONDING #( BASE ( fs_fcat ) fs_dfies MAPPING ref_table reftable ref_field reffield EXCEPT outputlen ). ENDLOOP. MODIFY gt_fcat FROM VALUE #( ref_table space ref_field space ) TRANSPORTING ref_table ref_field WHERE fieldname EQ |CHARG|. ENDFORM.8、屏幕 ALV 容器初始化 MOD_INIT_ALVOO ALV 核心实例化逻辑MODULE mod_init_alv OUTPUT. IF go_alv IS NOT BOUND. 单例模式仅实例化一次容器 go_alv NEW cl_gui_alv_grid( i_lifetime cl_gui_controllifetime_dynpro i_parent cl_gui_containerscreen0 ). go_alv-register_f4_for_fields( VALUE #( ( fieldname |CHARG| register abap_true internal abap_true ) ) ). PERFORM frm_set_drdn_table. 加载下拉框数据源 * ALV基础布局与展示参数 go_alv-set_table_for_first_display( EXPORTING is_layout VALUE lvc_s_layo( cwidth_opt abap_false sel_mode |D| stylefname |STYL| ) i_save /isdfps/cl_const_abc_123gc_a is_variant VALUE disvariant( report sy-cprog log_group COND #( WHEN p_ins THEN |INS| WHEN p_mod THEN |MOD| WHEN p_del THEN |DEL| WHEN p_que THEN |QUE| ) variant zmmt003-variant ) it_toolbar_excluding VALUE #( ( cl_gui_alv_gridmc_fg_edit ) ) CHANGING it_outtab gt_out it_fieldcatalog gt_fcat ). * 绑定全部自定义事件 SET HANDLER:lcl_event_receiverhandle_toolbar FOR go_alv, lcl_event_receiverhandle_finished FOR go_alv, lcl_event_receiverhandle_onf4 FOR go_alv, lcl_event_receiverhandle_user_command FOR go_alv. go_alv-set_toolbar_interactive( ). go_alv-register_edit_event( cl_gui_alv_gridmc_evt_modified ). ELSE. * 已实例化稳定刷新界面 go_alv-refresh_table_display( is_stable VALUE #( row abap_true col abap_true ) ). ENDIF. ENDMODULE.关键 Layout 参数说明lvc_s_layo属性作用示例值cwidth_opt自动优化列宽abap_false/abap_truesel_mode行选择模式D 多行选择Dstylefname启用单元格样式内表必须指定 STYL 结构字段STYLzebra斑马纹隔行底色abap_truebox_fname行多选标记字段SELE9、通用辅助子程序框架复用工具9.1 下拉框配置 frm_set_drdn_tableFORM frm_set_drdn_table . DATA lt_dral TYPE lvc_t_dral. lt_dral VALUE #( handle 1 ( value |非限制库存| int_value | | ) ( value |冻结库存| int_value |S| ) ). go_alv-set_drop_down_table( it_drop_down_alias lt_dral ). ENDFORM.9.2 选中行缓存 / 回填 frm_mark_selection解决 ALV 刷新后多选行丢失问题FORM frm_mark_selection USING pv_sign TYPE numc2. STATICS lt_rows TYPE lvc_t_row. CASE pv_sign. WHEN 01. 读取当前选中行写入内表标记SELE FREE lt_rows. go_alv-get_selected_rows( IMPORTING et_index_rows lt_rows ). MODIFY gt_out FROM VALUE #( sele abap_false ) TRANSPORTING sele WHERE sele EQ abap_true. LOOP AT lt_rows ASSIGNING FIELD-SYMBOL(ls_row). READ TABLE gt_out INDEX ls_row-index ASSIGNING FIELD-SYMBOL(ls_out). ls_out-sele abap_true. ENDLOOP. WHEN 10. 刷新后回填选中行 go_alv-set_selected_rows( it_index_rows lt_rows is_keep_other_selections abap_false ). ENDCASE. ENDFORM.10、业务操作子程序10.1 frm_create新增空白单据行自动填充业务场景、工厂、初始状态10.2 frm_delete区分新增临时行直接删除、历史单据标记删除标识 UPDKZD10.3 frm_check全量行级数据校验非空、库存、主数据合法性、业务场景专属规则错误行标红 提示文本10.4 frm_open_shlp_dialog读取批次库存弹出 0707 子 ALV 屏幕选择后回填主 ALV10.5 frm_print_function标准化 SmartForms 批量打印预取描述表、分组打印单据、预览输出三、OO ALV 容器框架 vs 函数 ALV 核心差异1、编辑能力函数 ALV 仅支持整行编辑OO ALV 支持单元格粒度禁用、高亮、F4 按钮2、交互事件函数 ALV 仅支持简单用户命令OO ALV 原生支持单元格修改实时联动、自定义工具栏、热点点击、弹窗3、适用场景函数 ALV 纯只读报表OO ALV 可在线编辑、保存的业务单据出入库 / 调拨 / 工单4、扩展性OO ALV 支持嵌套子 ALV 弹窗、单元格下拉、动态切换编辑权限企业单据开发首选5、布局灵活性OO ALV 可按操作模式动态切换工具栏、字段编辑属性一套程序实现增删改查功能需要创建屏幕以及GUI状态