如何在动态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
相关产品推荐
相关产品推荐

