了解 ALV 中的 field catalog (ABAP List Viewer)

embedded/2025/2/8 4:11:20/

ABAP 中,字段目录是使用 ALV (ABAP List Viewer) 定义内部表中的数据显示方式的关键元素。它提供对 ALV 中显示的字段的各种属性的控制,例如列标题、对齐方式、可见性、可编辑性等。关键概念:

Field Catelog 字段目录:这是一个表(对于现代 ALV 网格,通常为 lvc_t_fcat 类型,对于旧 ALV 网格,通常为 slis_t_fieldcat_alv),其中包含有关 ALV 中显示的内部表的每个字段的元数据。

它定义了每列的显示方式(例如,列标题、字段对齐方式、输出长度)。

创建字段目录:您可以手动定义字段目录,也可以使用 LVC_FIELDCATALOG_MERGE 等功能模块根据数据字典结构 (DDIC) 自动创建一个字段目录。生成目录后,您可以对其进行修改以调整字段属性。

Field catalog

全局结构类型的所有字段都以相同的名称出现在数据表中。现在需要对字典结构进行更改或显示额外的列。

在这种情况下,我们可以调用函数模块 ( LVC_FIELDCATALOG_MERGE ),该模块将字典结构的字段目录返回到 lvc_t_fcat 类型的表。

现在我们可以循环它并可以进行我们想要的任何更改。

  1. 不支持 REUSE_*ALV* 功能模块。我建议切换到 CL_SALV_* 类。文档更好,有更多的示例程序 (DEMO_SALV_*),您可以获得支持。
  2. 如果你想获得基于字典的字段描述 (duh),你需要一个字典结构。如果您使用 在 ABAP 级别组装结构类型 TYPE ... BEGIN OF ... END OF ... ,据我所知,各个字段的字典类型首先转换为 ABAP 类型,然后才组装成结构类型。无论如何,原始字段的字典引用会丢失。不要在代码中定义输出表的结构,而是使用字典结构。

结构 slis_fieldcat_alv 提供了几种不同的文本组件,这些组件用作列标签。选择的文本取决于当前列宽(这通常取决于显示的数据的长度)。确保你相应地更改它们!

通常的技术是:通过传递 I_STRUCTURE_NAME,您可以获得与此 DDIC 结构(更改参数 ct_fieldcat)对应的字段目录。然后,您可以根据需要修改此内部表,并将修改后的表传递给 REUSE_ALV_GRID_DISPLAY

在我不区分不同大小的文本版本的情况下,我使用以下宏将所有文本字段设置为相同的值。

  • define set_field
ABAP">data:lt_fcat type lvc_t_fcat.
data:tabname type ref to data,tabline type ref to data.field-symbols:<gt> type standard table,<gs> type any.call function 'LVC_FIELDCATALOG_MERGE'exportingi_structure_name = 'DDIC_STRUCTURE'changingct_fieldcat = lt_fcatexceptionsinconsistent_interface = 1program_error = 2others = 3." Creating tablecall method cl_alv_table_create=>create_dynamic_tableexportingit_fieldcatalog = lt_fcatimportingep_table = tabname.assign tabname->* to <gt>.
create data tabline like line of <gt>.
assign tabline->* to <gs>.

示例代码:

ABAP">
Report zalv. 
DATA: t_fcat TYPE lvc_t_fcat. " INTERNAL TABLE
FIELD-SYMBOLS:  TYPE lvc_s_fcat.CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'EXPORTINGi_structure_name       = 'SFLIGHT'CHANGINGct_fieldcat            = t_fcatEXCEPTIONSinconsistent_interface = 1program_error          = 2OTHERS                 = 3.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.LOOP AT t_fcat ASSIGNING .CASE -fieldname .WHEN 'PLANETYPE'.-coltext = 'PLANE'.WHEN 'SEATSMAX'.-no_out = 'X'.ENDCASE.ENDLOOP.
ABAP">REPORT zalv.
TYPES:BEGIN OF stu,carrid TYPE sflight-carrid,connid TYPE sflight-connid,fldate TYPE sflight-fldate,w_check,END OF stu.
DATA:fs_itab TYPE stu,                 " INTERNAL TABLEt_itab LIKE TABLE OF fs_itab.     " WORK AREA
DATA:r_grid TYPE REF TO cl_gui_alv_grid,r_container TYPE REF TO cl_gui_custom_container.
DATA:t_fcat TYPE lvc_t_fcat,wa_fcat TYPE lvc_s_fcat.
SELECT carrid connid fldate FROM
sflight INTO CORRESPONDING FIELDS OF TABLE t_itab.
CALL SCREEN 100.
*&---------------------------------------------------------------------
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------
MODULE status_0100 OUTPUT.SET PF-STATUS 'SCREEN'.SET TITLEBAR 'TITLE'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------
*text
*--------------------------------------------------------------------
MODULE user_command_0100 INPUT.CASE sy-ucomm.WHEN 'BACK'.LEAVE TO SCREEN 0.ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------
*& Module SET_HANDLER OUTPUT
*&-------------------------------------------------------------------
*text
*----------------------------------------------------------------------
MODULE set_handler OUTPUT.CREATE OBJECT r_containerEXPORTINGcontainer_name = 'CONTAINER'.CREATE OBJECT r_gridEXPORTINGi_parent = r_container.
*POPULATING THE FIELD CATALOG.wa_fcat-fieldname = 'W_CHECK'.wa_fcat-coltext = 'CHECK'.wa_fcat-checkbox = 'X'.wa_fcat-edit = 'X'.wa_fcat-col_pos = 1.APPEND wa_fcat TO t_fcat.CLEAR wa_fcat.wa_fcat-fieldname = 'CARRID'.wa_fcat-ref_table = 'SFLIGHT'.wa_fcat-ref_field = 'CARRID'.wa_fcat-col_pos = 2.APPEND wa_fcat TO t_fcat.CLEAR wa_fcat.wa_fcat-fieldname = 'CONNID'.wa_fcat-ref_table = 'SFLIGHT'.wa_fcat-ref_field = 'CONNID'.wa_fcat-col_pos = 3.APPEND wa_fcat TO t_fcat.CLEAR wa_fcat.CALL METHOD r_grid->set_table_for_first_displayCHANGINGit_fieldcatalog = t_fcatit_outtab       = t_itab.
ENDMODULE. " SET_HANDLER OUTPUT

REPORT zalv.
TYPES:BEGIN OF stu,carrid TYPE sflight-carrid,connid TYPE sflight-connid,fldate TYPE sflight-fldate,w_check,END OF stu.
DATA:
fs_itab TYPE stu,                 " INTERNAL TABLE
t_itab LIKE TABLE OF fs_itab.     " WORK AREA
DATA:
r_grid TYPE REF TO cl_gui_alv_grid,
r_container TYPE REF TO cl_gui_custom_container.
DATA:
t_fcat TYPE lvc_t_fcat,
wa_fcat TYPE lvc_s_fcat.
SELECT carrid connid fldate FROM
sflight INTO CORRESPONDING FIELDS OF TABLE t_itab.
CALL SCREEN 100.
*&---------------------------------------------------------------------
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------
MODULE status_0100 OUTPUT.SET PF-STATUS 'SCREEN'.SET TITLEBAR 'TITLE'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------
*text
*--------------------------------------------------------------------
MODULE user_command_0100 INPUT.CASE sy-ucomm.WHEN 'BACK'.LEAVE TO SCREEN 0.ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------
*& Module SET_HANDLER OUTPUT
*&-------------------------------------------------------------------
*text
*----------------------------------------------------------------------
MODULE set_handler OUTPUT.CREATE OBJECT r_containerEXPORTINGcontainer_name = 'CONTAINER'.CREATE OBJECT r_gridEXPORTINGi_parent = r_container.
*POPULATING THE FIELD CATALOG.wa_fcat-fieldname = 'W_CHECK'.wa_fcat-coltext = 'CHECK'.wa_fcat-checkbox = 'X'.wa_fcat-edit = 'X'.wa_fcat-col_pos = 1.APPEND wa_fcat TO t_fcat.CLEAR wa_fcat.wa_fcat-fieldname = 'CARRID'.wa_fcat-ref_table = 'SFLIGHT'.wa_fcat-ref_field = 'CARRID'.wa_fcat-col_pos = 2.APPEND wa_fcat TO t_fcat.CLEAR wa_fcat.wa_fcat-fieldname = 'CONNID'.wa_fcat-ref_table = 'SFLIGHT'.wa_fcat-ref_field = 'CONNID'.wa_fcat-col_pos = 3.APPEND wa_fcat TO t_fcat.CLEAR wa_fcat.CALL METHOD r_grid->set_table_for_first_displayCHANGINGit_fieldcatalog = t_fcatit_outtab       = t_itab.
ENDMODULE. " SET_HANDLER OUTPUT

参考链接

  • https://answers.sap.com/questions/3380700/using-the-fm-lvcfieldcatalogmerge.html
  • https://answers.sap.com/questions/6058081/fieldcatalog-merge-in-alv-report.html
  • https://wiki.scn.sap.com/wiki/display/ABAP/Field+catalog+types
  • https://ultimasolution.pl/refresh-alv-grid-and-keep-position-and-current-cell-abap

http://www.ppmy.cn/embedded/160457.html

相关文章

Sumatra PDF:小巧免费,满足多样阅读需求

Sumatra PDF是一款完全免费的本地阅读器软件&#xff0c;以小巧的体积和全面的功能受到用户青睐。如今&#xff0c;它已经更新到3.3版本&#xff0c;带来了更多实用功能&#xff0c;尤其是新增的注释功能&#xff0c;值得我们再次关注。 软件特色 轻量级体积&#xff1a;压缩…

linux环境自动化golang项目启动脚本解析

一.场景介绍 当在本地创建了golang项目,修改了代码功能,怎么在远程测试服务器上更新该功能呢,可以使用下面的步骤来解决该问题(这只是其中一种方法): (1).推送最新代码到远程仓库 (2).在测试服务器上创建该项目并拉取最新代码 (3).创建deploy.sh脚本 (4).运行deploy.sh脚本 二.…

离线安装Appium Server

1、问题概述? 安装Appium通常有两种方式: 第一种:下载exe安装包,这种是Appium Server GUI安装方式,缺点是通过命令启动不方便。 第二种:通过cmd安装appium server,可以通过命令方式启动,比较方便。 问题:在没有外网的情况下,无法通过命令在cmd中安装appium server…

操作系统和中间件的信息收集

在浏览器中收集操作系统与中间件信息时&#xff0c;主要通过客户端JavaScript&#xff08;用于操作系统/浏览器信息&#xff09;和服务器端脚本&#xff08;用于中间件信息&#xff09;实现。以下是分步指南&#xff1a; 一、客户端操作系统信息收集&#xff08;JavaScript&am…

OSCP - Other Machines - sar2HTML

主要知识点 路径枚举cronjob提权 具体步骤 nmap扫描&#xff0c;只开了一个80端口 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-31 19:13 CST Nmap scan report for 172.16.33.13 Host is up (0.035s latency). Not shown: 65534 closed tcp ports (conn-refus…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

React中为每个列表项显示多个DOM节点的解决方案

React中为每个列表项显示多个DOM节点的解决方案 问题背景&#xff1a;Fragment的简写形式的限制解决方案&#xff1a;使用显式的<Fragment>组件实现步骤 其他替代方案方法一&#xff1a;使用<div>包裹节点方法二&#xff1a;使用React.createElement创建Fragment 为…

C++中的pair,pair和map的结合

文章目录 1. pair 的基本用法语法&#xff1a;示例&#xff1a; 2. pair 和 map 的结合map 的基本用法语法&#xff1a;示例&#xff1a; 3. pair 和 map 中的具体应用(1) map 中的 pair 存储(2) insert 方法插入 pair(3) 使用 auto 获取 pair 对象(4) 使用 pair 和 map 返回多…