调试程序中碰到一个诡异的问题,调了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参考。