当前位置: 首页 > article >正文

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

在 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
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'
  exporting
    i_structure_name = 'DDIC_STRUCTURE'
  changing
    ct_fieldcat = lt_fcat
  exceptions
    inconsistent_interface = 1
    program_error = 2
    others = 3.

    " Creating table
    call method cl_alv_table_create=>create_dynamic_table
      exporting
        it_fieldcatalog = lt_fcat
      importing
        ep_table = tabname.

assign tabname->* to <gt>.
create data tabline like line of <gt>.
assign tabline->* to <gs>.

示例代码:


Report zalv. 
DATA: t_fcat TYPE lvc_t_fcat. " INTERNAL TABLE
FIELD-SYMBOLS:  TYPE lvc_s_fcat.


  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'SFLIGHT'
    CHANGING
      ct_fieldcat            = t_fcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 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.
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_container
    EXPORTING
      container_name = 'CONTAINER'.
  CREATE OBJECT r_grid
    EXPORTING
      i_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_display
    CHANGING
      it_fieldcatalog = t_fcat
      it_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_container
    EXPORTING
      container_name = 'CONTAINER'.
  CREATE OBJECT r_grid
    EXPORTING
      i_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_display
    CHANGING
      it_fieldcatalog = t_fcat
      it_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.kler.cn/a/532537.html

相关文章:

  • TensorFlow 与 PyTorch 的直观区别
  • 【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)
  • 【C语言篇】“三子棋”
  • 路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)
  • Java JWT 技术详解与实践指南
  • 【汽车电子软件架构】AutoSAR从放弃到入门专栏导读
  • 大数据治理:技术视角的解析
  • java项目当中的全局异常处理
  • WPS计算机二级•幻灯片的音视频表格与图形
  • 算法设计-哈夫曼树(C++)
  • kafka集群性能调优方案
  • DeepSeek 登顶140国应用商店榜首
  • 【BUUCTF杂项题】FLAG
  • C++输入输出(上)
  • CSS --- 设置不自动换行
  • 代码随想录算法训练营第十七天| 二叉树5
  • Linux——文件与磁盘
  • 求组合数(递推法、乘法逆元、卢卡斯定理、分解质因数)
  • 介绍一下Mybatis的Executor执行器
  • springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写
  • 【NLP百面百过】大模型算法面试高频面题(全面整理 ʘ‿ʘ)
  • Vue.js组件开发-实现全屏手风琴幻灯片切换特效
  • GESP6级语法知识(六):(动态规划算法(六)多重背包)
  • 爬虫学习笔记之Robots协议相关整理
  • C++模板编程——可变参类模板
  • IOS开发日志-ios新建项目后-将storyboard去掉,版本调整为IOS13以下