ABAP代码第22行出现“Statement is not accessible”语法错误的原因及解决方法
ABAP语法错误:Statement is not accessible 原因及解决办法
错误原因
这个Statement is not accessible错误说白了就是:你的第22行WRITE语句永远不会被程序执行到,编译器一眼就看出来了,所以给你报了这个错。
具体到你的代码逻辑:
ABAP是事件驱动的编程语言,主程序里的可执行代码必须放在指定的事件块(比如START-OF-SELECTION、END-OF-SELECTION)内部。你的代码中,START-OF-SELECTION事件块包含了DO循环和子程序调用,当这个事件块里的代码执行完毕后,程序的主执行流程就直接终止了——后面的WRITE语句不在任何事件块里,程序根本不会“走到”这里,所以这条语句完全是“无效”的,编译器就会提示这个错误。
另外顺便提一句:FORM子程序的定义位置没问题(放在主事件块之后),但它不影响主流程的执行逻辑,主流程还是在START-OF-SELECTION结束后就停了。
解决办法
把这条WRITE语句放到程序能执行到的事件块里就行,有两种常用的方案:
方案1:移到START-OF-SELECTION事件块内部
把WRITE放在ENDDO后面,这样循环执行完就会打印这串字符:
REPORT zabap01_sue02. START-OF-SELECTION. DO 3 TIMES. PERFORM call_subr01. ENDDO . WRITE: /'1111111111111111111111111'. "<========= 移到这里 FORM call_subr01. DATA: lv_val TYPE I. lv_val = lv_val + 1. WRITE:/ 'local variable', lv_val. ENDFORM.
方案2:放到END-OF-SELECTION事件块
如果你想在所有主事件执行完后再打印,可以单独加一个END-OF-SELECTION事件块,把WRITE放进去:
REPORT zabap01_sue02. START-OF-SELECTION. DO 3 TIMES. PERFORM call_subr01. ENDDO . FORM call_subr01. DATA: lv_val TYPE I. lv_val = lv_val + 1. WRITE:/ 'local variable', lv_val. ENDFORM. END-OF-SELECTION. WRITE: /'1111111111111111111111111'. "<========= 放到这个事件块里
这样修改后,编译器就不会再报错,这条WRITE语句也能正常执行了。
内容的提问来源于stack exchange,提问作者zhang sue




