维护视图保存前校验时如何高亮标记指定行/字段?
表维护生成器(TMG)批量标记错误行/字段的实现方案
在TMG的"01 - Before saving the data in the database"事件中,要实现批量标记所有错误行并显示对应提示,不能用单条MESSAGE终止的方式,而是要利用TMG提供的两个核心内部表:vim_totals和vim_mesg来实现。
核心实现步骤
- 初始化状态:清空消息表,重置行标记
- 批量校验并标记:遍历所有待保存记录,不符合条件的行标记错误状态,同时添加对应错误消息
- 触发终止保存:如果存在错误,设置终止保存的标识
完整代码示例
FORM before_saving. DATA: ls_vim_mesg TYPE vim_mesg, lv_index TYPE sy-tabix. " 初始化:清空错误消息表,重置行标记 REFRESH vim_mesg. LOOP AT vim_totals ASSIGNING FIELD-SYMBOL(<fs_vim_total>). <fs_vim_total>-vim_mark = space. ENDLOOP. " 遍历所有待保存记录执行校验 LOOP AT total ASSIGNING FIELD-SYMBOL(<fs_total>) INDEX lv_index. " 替换为你的实际校验条件,示例:检查ZCHECK_FIELD字段是否未满足要求 IF <fs_total>-zcheck_field <> 'VALID'. " 标记当前行为错误行(界面会高亮该行) READ TABLE vim_totals ASSIGNING <fs_vim_total> INDEX lv_index. IF sy-subrc = 0. <fs_vim_total>-vim_mark = 'E'. " 'E'代表错误标记 ENDIF. " 添加错误消息到消息表(会自动在界面显示对应行的错误) ls_vim_mesg-msgty = 'E'. ls_vim_mesg-msgid = 'ZTMG_MSG'. " 替换为你的自定义消息类 ls_vim_mesg-msgno = '002'. " 替换为对应的消息号,或者直接用msgtext字段写文本 ls_vim_mesg-msgv1 = <fs_total>-zcheck_field. " 消息变量,可选 ls_vim_mesg-tabix = lv_index. " 指定错误对应的行号 APPEND ls_vim_mesg TO vim_mesg. ENDIF. ENDLOOP. " 存在错误则终止保存,并提示整体错误信息 IF NOT vim_mesg IS INITIAL. vim_abort_saving = abap_true. MESSAGE '请修正所有标记为错误的记录后重新保存' TYPE 'E'. ENDIF. ENDFORM.
关键说明
vim_totals:与total表行一一对应,vim_mark字段设为'E'后,TMG界面会自动高亮该行,提示用户这是错误行vim_mesg:专门用于存储TMG中的错误消息,添加后会在界面底部状态栏或对应行位置显示具体错误提示,支持批量存储所有错误- 不要用原有的单条
MESSAGE ... DISPLAY LIKE 'E'方式,这种方式会中断循环,无法标记所有错误行
另外,你尝试的VIEW_SET_PF_STATUS是用于自定义TMG界面状态栏的,和错误行标记无关,所以无法实现需求,应该用上述标准内部表的方式。
内容的提问来源于stack exchange,提问作者Frontmaniaac
相关产品推荐
相关产品推荐

