如何让ABAP将数值0识别为非初始值?
解决ABAP计算器中0被判定为未输入的问题
问题核心
你使用IF inp_z1 IS INITIAL OR inp_z2 IS INITIAL的判断逻辑时,由于TYPE P数值类型的初始值为0,导致系统会把用户主动输入的0误判为「未输入」。同时,用< 0的判断会排除负数,不符合需求。
解决方案
利用ABAP选择屏幕的AT SELECTION-SCREEN ON <参数>事件,通过SCREEN-VALUE获取输入框的原始字符串内容,直接判断用户是否真的未输入任何内容。这种方式可以精准区分「用户清空输入框」和「用户输入0/负数」的场景。
修改后的完整代码
PARAMETERS: inp_z1 TYPE p DECIMALS 2 DEFAULT 1, operator TYPE c LENGTH 1, " 明确运算符类型为单字符 inp_z2 TYPE p DECIMALS 2 DEFAULT 1. DATA: inp_erg TYPE p DECIMALS 10, inp_ergstr TYPE string, error_boolean TYPE c LENGTH 1. * 检查第一个数值输入框是否为空 AT SELECTION-SCREEN ON inp_z1. DATA(lv_input_z1) = screen-value. CONDENSE lv_input_z1 NO-GAPS. " 去除输入中的空格 IF lv_input_z1 IS INITIAL. MESSAGE TEXT-r01 TYPE 'E'. " 抛出错误提示,阻止提交 ENDIF. * 检查第二个数值输入框是否为空 AT SELECTION-SCREEN ON inp_z2. DATA(lv_input_z2) = screen-value. CONDENSE lv_input_z2 NO-GAPS. IF lv_input_z2 IS INITIAL. MESSAGE TEXT-r01 TYPE 'E'. ENDIF. START-OF-SELECTION. error_boolean = space. " 执行计算逻辑 CASE operator. WHEN '+'. inp_erg = inp_z1 + inp_z2. WHEN '-'. inp_erg = inp_z1 - inp_z2. WHEN '*'. inp_erg = inp_z1 * inp_z2. WHEN '/'. IF inp_z2 = 0. MESSAGE '除数不能为0' TYPE 'E'. ENDIF. inp_erg = inp_z1 / inp_z2. WHEN OTHERS. MESSAGE '请输入有效的运算符(+/-/*/)' TYPE 'E'. ENDCASE. " 输出计算结果 WRITE: / '计算结果:', inp_erg.
关键说明
SCREEN-VALUE:直接获取用户在输入框中输入的原始文本,不受系统自动转换数值的影响。CONDENSE lv_input NO-GAPS:去除输入中的空格,避免用户输入空格被误判为有效内容。MESSAGE ... TYPE 'E':抛出错误消息并阻止选择屏幕提交,确保只有输入有效内容才能进入主逻辑。
内容的提问来源于stack exchange,提问作者Yaso
相关产品推荐
相关产品推荐

