0

我对 ABAP 有疑问。我有一本书的以下代码:

METHOD make_reservation.
  DATA: license_plate     TYPE zcars-license_plate,
        reservation_wa    LIKE LINE OF reservation_tab,
        reservation_num   TYPE i,
        mess              TYPE string.

  reservation_num = lines( reservation_tab ).

  SELECT license_plate FROM zcars INTO (license_plate) WHERE category = category.

    LOOP AT reservation_tab
      TRANSPORTING NO FIELDS
      WHERE license_plate = license_plate
      AND NOT ( date_from > date_to OR date_to < date_from ).

    ENDLOOP.

    IF sy-subrc <> 0.
      reservation_wa-reservation_id   = reservation_num + 1.
      reservation_wa-customer_id      = customer.
      reservation_wa-license_plate    = license_plate.
      reservation_wa-date_from        = date_from.
      reservation_wa-date_to          = date_to.

      INSERT reservation_wa INTO TABLE reservation_tab.
      IF sy-subrc <> 0.
        CONCATENATE license_plate ' reserved!' INTO mess.
        MESSAGE mess TYPE 'I'.
      ELSE.
        MESSAGE 'internal error!' TYPE 'I' DISPLAY LIKE 'E'.
        LEAVE PROGRAM.
      ENDIF.

      RETURN.
    ENDIF.
  ENDSELECT.

  RAISE EXCEPTION TYPE zcx_no_car_available.

ENDMETHOD.

问题是INSERT reservation_wa INTO TABLE reservation_tab.运行不正确的线路,我总是得到sy-subrc <> 0. 这会导致消息“内部错误!”

现在我的问题是:我厌倦了调试它,但我找不到这个语句不插入数据的原因。如何找出详细的错误消息,这条 SQL 语句出了什么问题?

4

2 回答 2

2

这个snipplet测试not equal 0

      INSERT reservation_wa INTO TABLE reservation_tab.
      IF sy-subrc <> 0.
        CONCATENATE license_plate ' reserved!' INTO mess.
        MESSAGE mess TYPE 'I'.
      ELSE.
        MESSAGE 'internal error!' TYPE 'I' DISPLAY LIKE 'E'.
        LEAVE PROGRAM.
      ENDIF.

我总是更喜欢测试相等性(这更容易阅读)。您的代码的类似编码:

      INSERT reservation_wa INTO TABLE reservation_tab.
      IF sy-subrc = 0.
        MESSAGE 'internal error!' TYPE 'I' DISPLAY LIKE 'E'.
        LEAVE PROGRAM.
      ELSE.
        CONCATENATE license_plate ' reserved!' INTO mess.
        MESSAGE mess TYPE 'I'.
      ENDIF

明文:如果插入成功(返回码== 0),则报错。如果插入不成功,则通知正确的预留。

我不知道您的确切要求,但似乎您在代码中混淆了 if/else 分支。

于 2014-01-16T19:16:08.770 回答
1

在 ABAP 中,sy-subrc == 0总是意味着成功。您的代码似乎有问题,因为成功与任何其他值相关联。

如果您在插入之前在代码中放置断点,您将能够检查插入是否成功。

您可以通过将光标放在指令上并使用 F1 键来检查指令的可能返回值。这将启动帮助/文档。

问候

于 2014-01-16T15:17:15.983 回答