今天调试程序中碰到一个诡异的问题,调了1个多小时,发现居然是这样一个错误,这个问题很难发现,所以写出来供大家参考。
千万别这样写ABAP 程序,否则你可能会连自己怎么死都不知道:
我修改了项目中的程序,抽出了这么一段:
REPORT Z_TEST_LOOP.
do 10 times.
DATA : lv_bool type char1 value space.
if sy-index = 5.
lv_bool = 'X'.
endif.
if lv_bool = 'X'.
write 'true'.
else.
write 'false'.
endif.
new-line.
enddo.
代码逻辑非常简单,就是做个循环,一共做10次,当第五次的时候将标志为变成true,照理说循环的每次开头都会调用DATA : lv_bool type char1 value space.所以只要不设置,都会变成false。
问题来了,从第5次开始,所有的lv_bool都是true,再也改不回来了。
原来ABAP程序的变量作用域是一个method 或者function module ,而不是我们通常概念上的块,因此,当系统在循环时,由于系统变量已经定义,则定义的字段不再执行,默认为上一次循环得值,就产生了上面的问题。所以,定义必须写成:
DATA : lv_bool type char1.
lv_bool = space.
如果这段程序在一个大程序内出现,真还是比较难调,仅以此文,供各位ABAPer参考。