SY-SUBRC

时间:2024-01-12 16:47:38

一般是对read table和select语句使用。

loop at g_it_data where level < <wa_data>-level and seq < <wa_data>-seq and  ( ( item_category = 'M' and assembly = 'X' ) or level = 1 ).
        <wa_data>-cpmtr = g_it_data-cpmtr.
        if <wa_data>-cpmtr is not initial.
          exit.
        endif.
      endloop.

if <wa_data>-cpmtr is not initial. 不要写成 if sy-subrc = 0,这样的逻辑是有问题的。

下面这段代码问题很严重:

  CLEAR g_it_data.
      READ TABLE g_it_data WITH KEY cpmtr = <wa_data>-cpmtr level = <wa_data>-level .
      IF sy-subrc eq 0.
        IF g_it_data-ctgry IS NOT INITIAL.
          <wa_data>-ctgry = g_it_data-ctgry.
        ENDIF.
      ELSE.
        CLEAR: tmp_sublevel,g_it_data.
        tmp_sublevel = <wa_data>-level + 1.
        READ TABLE g_it_data WITH KEY cpmtr = <wa_data>-cpmtr level = tmp_sublevel.
        IF sy-subrc eq 0.
          <wa_data>-ctgry = g_it_data-ctgry.
        ENDIF.
      ENDIF.

自己写这段代码的目的是,先从同样level,同样cpmtr的记录里去找,找不到就往下一层去找。

当在同样的level找时,read table一但有记录,那么sy-subrc就为零,没读到才不会为零,才会继续在g_it_data里去找下一层。

注意这里,本意是找不到就往下一层找,而代码是read table,没有找到同样level,同样cpmtr的记录就往下找,可是同一个内表里,肯定是会让read table的sy-subrc为零的。

这里应该换判断,不使用嵌套的read table,而是像上面一样,单独判断“ctgry”是否为零。

相关文章