You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在动态ALV中基于DDIC结构配置字段隐藏或技术属性?

基于DDIC结构实现动态ALV字段隐藏的方案

完全可以在DDIC结构中定义字段的显示/隐藏状态,无需硬编码指定字段,以下是两种实用实现方案:

方案一:利用DDIC字段的全局屏幕隐藏属性

这种方式直接借助DDIC字段的原生屏幕控制属性,适合不需要在其他事务码中显示该字段的场景:

  • 步骤1:配置DDIC字段属性
    打开SE11进入目标自定义结构,选中需要隐藏的字段,点击「属性」按钮,切换到「屏幕相关」标签页,勾选「隐藏」选项。注意:该属性会影响所有使用此字段的SAP标准或自定义屏幕(如SE16N),需确认业务无冲突。
  • 步骤2:动态生成字段目录时读取属性
    通过DDIF_FIELDINFO_GET函数获取字段的屏幕属性,将SCREEN_INVISIBLE标志映射到ALV字段目录的NO_OUT参数:
DATA: ls_fieldcat TYPE lvc_s_fcat,
      lt_fieldcat TYPE lvc_t_fcat,
      ls_fieldinfo TYPE dfies,
      lt_fieldinfo TYPE dfies_tab.

" 获取目标DDIC结构的字段元数据
CALL FUNCTION 'DDIF_FIELDINFO_GET'
  EXPORTING
    tabname   = 'Z_CUSTOM_STRUCT' " 传入动态获取的结构名
  TABLES
    dfies_tab = lt_fieldinfo.

" 循环生成ALV字段目录
LOOP AT lt_fieldinfo INTO ls_fieldinfo.
  MOVE-CORRESPONDING ls_fieldinfo TO ls_fieldcat.
  " 根据DDIC的隐藏属性设置ALV列隐藏
  IF ls_fieldinfo-screen_invisible = 'X'.
    ls_fieldcat-no_out = 'X'.
  ENDIF.
  APPEND ls_fieldcat TO lt_fieldcat.
ENDLOOP.

" 后续执行ALV显示逻辑(如调用CL_GUI_ALV_GRID的SET_TABLE_FOR_FIRST_DISPLAY)

方案二:自定义标记(不影响全局属性,推荐)

如果需要避免全局屏幕属性的影响,可通过字段注释或自定义域的方式添加隐藏标记,灵活性更高:

子方案2.1:字段注释嵌入隐藏标记

  • 步骤1:给DDIC字段添加标记
    在结构字段的「短文本」或「长文本」末尾添加自定义标记,例如 [HIDE](比如将字段短文本设为"内部编码 [HIDE]")。
  • 步骤2:解析标记生成字段目录
LOOP AT lt_fieldinfo INTO ls_fieldinfo.
  MOVE-CORRESPONDING ls_fieldinfo TO ls_fieldcat.
  " 检查字段短文本是否包含隐藏标记
  IF ls_fieldinfo-scrtext_s CS '[HIDE]'.
    ls_fieldcat-no_out = 'X'.
    " 可选:移除标记,避免ALV表头显示冗余内容
    REPLACE ALL OCCURRENCES OF '[HIDE]' IN ls_fieldcat-scrtext_s WITH ''.
  ENDIF.
  APPEND ls_fieldcat TO lt_fieldcat.
ENDLOOP.

子方案2.2:自定义域传递显示状态

  • 步骤1:创建专用域
    创建域(如Z_ALV_DISPLAY_FLAG),定义固定值:D=显示, H=隐藏。
  • 步骤2:关联DDIC字段
    给需要控制显示状态的结构字段分配该域(或通过数据元素关联)。
  • 步骤3:读取域属性生成字段目录
DATA: ls_domain TYPE dd01v.

LOOP AT lt_fieldinfo INTO ls_fieldinfo.
  MOVE-CORRESPONDING ls_fieldinfo TO ls_fieldcat.
  " 获取字段对应的域信息
  CALL FUNCTION 'DDIF_DOMA_GET'
    EXPORTING
      domname = ls_fieldinfo-domname
    IMPORTING
      dd01v_wa = ls_domain.
  " 判断域是否为自定义显示控制域,且标记为隐藏
  IF ls_domain-domname = 'Z_ALV_DISPLAY_FLAG' AND ls_fieldinfo-fieldtext CS '隐藏'.
    ls_fieldcat-no_out = 'X'.
  ENDIF.
  APPEND ls_fieldcat TO lt_fieldcat.
ENDLOOP.

注意事项

  • 方案一的全局属性会影响所有使用该字段的场景,需谨慎使用;
  • 方案二的自定义标记方式不影响其他业务场景,实现成本最低,推荐优先采用;
  • 确保动态生成字段目录时,所有字段的NO_OUT属性被正确赋值,ALV会自动处理列的显示/隐藏。

内容的提问来源于stack exchange,提问作者Cutter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:27:32