使用PNP逻辑数据库时无法清空PNPBUKRS选择选项的求助
PNP逻辑数据库BUKRS筛选器无法清空的解决思路
问题根源
- 代码事件顺序错误:
GET pernr是PNP逻辑数据库的专属事件,不能嵌套在AT SELECTION-SCREEN块中,会导致逻辑执行混乱。 - 清空操作时机不对:在
START-OF-SELECTION中清空选择选项仅在程序执行阶段生效,返回选择屏幕时该事件不会触发,屏幕仍保留缓存值。 - PNP的选择选项属于全局绑定字段,仅清空内表和工作区不足以同步到屏幕显示,需在屏幕输出事件中处理。
解决步骤
1. 修正代码事件结构
将GET pernr事件单独抽出,遵循ABAP标准事件执行顺序:
DATA: g_auto_filled_bukrs TYPE c LENGTH 1. " 新增标志位,标记是否自动填充过BUKRS AT SELECTION-SCREEN. IF pnpbukrs[] IS INITIAL. pnpbukrs-sign = 'I'. pnpbukrs-option = 'EQ'. pnpbukrs-low = '1021'. APPEND pnpbukrs. g_auto_filled_bukrs = 'X'. " 标记为自动填充 ENDIF. START-OF-SELECTION. IF t_p0001 IS INITIAL. REFRESH pnpbukrs[]. CLEAR pnpbukrs. ENDIF. GET pernr. PERFORM f_seleciona_dados. END-OF-SELECTION. " 后续业务处理逻辑
2. 添加屏幕输出事件重置选择选项
通过AT SELECTION-SCREEN OUTPUT事件,在用户返回选择屏幕时触发清空操作,同步屏幕显示:
AT SELECTION-SCREEN OUTPUT. IF g_auto_filled_bukrs = 'X'. REFRESH pnpbukrs[]. " 清空选择选项内表 CLEAR pnpbukrs. " 清空工作区 CLEAR g_auto_filled_bukrs. " 重置标志位,避免重复清空 ENDIF.
3. 验证逻辑效果
- 用户未输入BUKRS时,程序自动填充1021并标记标志位。
- 程序执行完成后返回选择屏幕,
AT SELECTION-SCREEN OUTPUT事件触发,BUKRS选择选项被清空,屏幕显示为空。 - 用户手动输入BUKRS时,标志位不触发,保留用户输入值。
补充说明
若无需区分手动输入和自动填充场景,可直接在AT SELECTION-SCREEN OUTPUT中无条件清空,但需确保符合业务需求;避免直接修改PNP逻辑数据库的全局缓存,通过标准事件处理是最安全的方式。
内容的提问来源于stack exchange,提问作者Hugo Ximenes Loiola
相关产品推荐
相关产品推荐

