F4搜索帮助动态列 VALUE_ORG39C39

作者:ABAP三叔 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程
F4搜索帮助动态列 VALUE_ORG39C39 - 封面图
F4搜索帮助动态列 VALUE_ORG39C39 - 封面图

前言

ALV的F4搜索帮助函数'F4IF_INT_TABLE_VALUE_REQUEST',通常写法是取值到内表,然后调用下面代码片段

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING* DDIC_STRUCTURE = ' ' retfield = 'MATNR' "这个参数为帮助表中返回到ALV的字段的参数* PVALKEY = ' ' dynpprog = sy-repid "当前程序,不写会有问题 dynpnr = sy-dynnr "当前屏幕,不写会有问题 value_org = 'S' "默认为C但是此处不用S不行 callback_program = sy-repid TABLES value_tab = gt_mara[] "F4帮助值的表 return_tab = lt_return EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3.

如果搜索帮助ALV需要根据条件列是动态的,该如何写呢?

以及VALUE_ORG 参数默认值是'C',它是如何工作的呢

F4搜索帮助动态列 VALUE_ORG39C39 - 封面图
F4搜索帮助动态列 VALUE_ORG39C39 - 封面图

方法一 创建动态内表

先看下效果,后面附代码

1. 在<包装>这一列上添加了自定义F4搜索帮助 当前行<品类>是上衣的时候,列为上衣的尺码XS-XL,有三种包装方式1/2/3,以及各个尺码的数量; 当 前行<品类>是裤子的时候,列为裤子的尺码30-34,有两种包装方式1/2,以及各个尺码的数 量;

F4搜索帮助动态列 VALUE_ORG39C39 - 封面图
F4搜索帮助动态列 VALUE_ORG39C39 - 封面图

2.实现逻辑

根据选中的行的品类,获取所有尺码,然后创建 lvc_t_fcat 内表,用来存储ALV列,然后调用 cl_alv_table_create =>

create_dynamic_table 方法创建动态列表,最后调用 F4IF_INT_TABLE_VALUE_REQUEST 方法展示

3.源代码,具体参见 on_f4_s 方法

REPORT ztest.TYPE-POOLS: slis.*---------------------------------------------------------------------** CLASS lcl_event_receiver DEFINITION*---------------------------------------------------------------------*CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_f4 FOR EVENT onf4 OF cl_gui_alv_grid IMPORTING sender e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display. CLASS-METHODS: on_f4_s IMPORTING e_fieldname TYPE lvc_fname es_row_no TYPE lvc_s_roid er_event_data TYPE REF TO cl_alv_event_data. CLASS-METHODS: on_f4_c IMPORTING e_fieldname TYPE lvc_fname es_row_no TYPE lvc_s_roid er_event_data TYPE REF TO cl_alv_event_data. PRIVATE SECTION.
ENDCLASS. "lcl_event_receiver DEFINITION TYPES: BEGIN OF ty_size, size TYPE char10, qty TYPE i, END OF ty_size.TYPES: tty_size TYPE STANDARD TABLE OF ty_size WITH EMPTY KEY.TYPES: BEGIN OF ty_data, category TYPE char10, "品类 package TYPE i, "套餐 size TYPE tty_size, "尺码数量 END OF ty_data.TYPES: BEGIN OF ty_alv, id TYPE i, category TYPE char10, "品类 package TYPE i, "套餐 END OF ty_alv.DATA: gt_size TYPE STANDARD TABLE OF ty_data, gs_size TYPE ty_data.DATA: gt_alv TYPE STANDARD TABLE OF ty_alv, gs_alv TYPE ty_alv. DATA:gt_fieldcat TYPE lvc_t_fcat, "字段目录内表 gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区 gs_layout TYPE lvc_s_layo. "用于定义ALV表单的相关格式、属性

START-OF-SELECTION.*设置数据 PERFORM frm_set_data.*设置字段属性 PERFORM frm_set_fieldcat.*设置输出格式 PERFORM frm_set_layout.*显示ALV PERFORM frm_display_alv.

FORM frm_set_data. APPEND VALUE #( category = '上衣' package = 1 size = VALUE #( ( size = 'XS' qty = 1 ) ( size = 'S' qty = 3 ) ) ) TO gt_size. APPEND VALUE #( category = '上衣' package = 2 size = VALUE #( ( size = 'M' qty = 2 ) ( size = 'L' qty = 2 ) ) ) TO gt_size. APPEND VALUE #( category = '上衣' package = 3 size = VALUE #( ( size = 'M' qty = 1 ) ( size = 'L' qty = 1 ) ( size = 'XL' qty = 2 ) ) ) TO gt_size. APPEND VALUE #( category = '裤子' package = 1 size = VALUE #( ( size = '30' qty = 1 ) ( size = '31' qty = 3 ) ) ) TO gt_size. APPEND VALUE #( category = '裤子' package = 2 size = VALUE #( ( size = '32' qty = 1 ) ( size = '33' qty = 1 ) ( size = '34' qty = 2 ) ) ) TO gt_size. APPEND VALUE #( id = 1 category = '上衣' ) TO gt_alv. APPEND VALUE #( id = 2 category = '上衣' ) TO gt_alv. APPEND VALUE #( id = 3 category = '裤子' ) TO gt_alv. APPEND VALUE #( id = 4 category = '裤子' ) TO gt_alv.ENDFORM. FORM frm_set_fieldcat . DEFINE add_fieldcat. CLEAR gs_fieldcat. gs_fieldcat-fieldname = &1. gs_fieldcat-coltext = &2. gs_fieldcat-edit = &3. gs_fieldcat-f4availabl = &4. APPEND gs_fieldcat TO gt_fieldcat. END-OF-DEFINITION. add_fieldcat 'ID' '行号' '' '' . add_fieldcat 'CATEGORY' '品类' '' '' . add_fieldcat 'PACKAGE' '包装' 'X' 'X' .ENDFORM.*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------** --> P1 TEXT* <-- P2 TEXT*----------------------------------------------------------------------*FORM frm_set_layout . "ALV 界面格式 CLEAR gs_layout. gs_layout-sel_mode = 'A'. "设置行模式" gs_layout-cwidth_opt = 'X'. "优化列宽设置" gs_layout-zebra = 'X'. "设置斑马线"ENDFORM. " FRM_SET_LAYOUT*&---------------------------------------------------------------------**& FORM FRM_DISPLAY_ALV*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------** --> P1 TEXT* <-- P2 TEXT*----------------------------------------------------------------------*FORM frm_display_alv. DATA: lt_events TYPE slis_t_event, ls_events TYPE slis_alv_event. ls_events-name = 'CALLER_EXIT'. ls_events-form = 'CALLER_EXIT'. APPEND ls_events TO lt_events.*报表展示 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid "当前程序* i_callback_pf_status_set = 'SET_PF_STATUS'* i_callback_user_command = 'FRM_USER_COMMAND' is_layout_lvc = gs_layout "界面格式" it_fieldcat_lvc = gt_fieldcat "字段属性" it_events = lt_events TABLES t_outtab = gt_alv 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. ENDFORM. " FRM_DISPLAY_ALV FORM caller_exit USING ls_data TYPE slis_data_caller_exit. DATA: lo_alv TYPE REF TO cl_gui_alv_grid. DATA: ls_f4 TYPE lvc_s_f4, lt_f4 TYPE lvc_t_f4. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lo_alv. SET HANDLER lcl_event_receiver=>on_f4 FOR lo_alv. ls_f4-fieldname = 'PACKAGE'. ls_f4-register = 'X'. ls_f4-getbefore = 'X'. ls_f4-chngeafter = 'X'. APPEND ls_f4 TO lt_f4. CALL METHOD lo_alv->register_f4_for_fields EXPORTING it_f4 = lt_f4.ENDFORM. "CALLER_EXIT

*---------------------------------------------------------------------** CLASS lcl_event_receiver IMPLEMENTATION*---------------------------------------------------------------------*CLASS lcl_event_receiver IMPLEMENTATION. METHOD on_f4.*<START>------「方法一: VALUE_ORG = 'S'」-------</START>* on_f4_s( e_fieldname = e_fieldname es_row_no = es_row_no er_event_data = er_event_data ).*<END>------「方法一: VALUE_ORG = 'S'」-------</END>*

*<START>------「方法二: VALUE_ORG = 'C',取消下面注释可查看效果」-------</START>** on_f4_c( e_fieldname = e_fieldname es_row_no = es_row_no er_event_data = er_event_data ).*<END>------「方法二: VALUE_ORG = 'C'」-------</END>* ENDMETHOD. "on_f4

METHOD on_f4_s. DEFINE add_fieldcat. READ TABLE lt_fieldcat TRANSPORTING NO FIELDS WIT

...

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「F4搜索帮助动态列VALUE_ORG39C39.md」整理生成,仅用于内部技术分享与学习交流。