Почему INSERT во внутреннюю таблицу не работает?

У меня проблема с 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?


person gurehbgui    schedule 16.01.2014    source источник
comment
METHOD и LEAVE PROGRAM в одном примере? Пожалуйста, выбросьте эту книгу как можно скорее. ;-)   -  person vwegert    schedule 16.01.2014
comment
Пожалуйста, добавьте в образец объявления типов данных, особенно структуры и типы таблиц.   -  person vwegert    schedule 16.01.2014
comment
У вас все еще есть проверка на sy-subrc после вставки. Вы сообщаете об ошибке, когда вставка действительно сработала.   -  person Esti    schedule 17.01.2014
comment
Вы правы, ошибка была в том, что я неправильно скопировал из своей книги.   -  person gurehbgui    schedule 17.01.2014
comment
@vwegert Возможно, METHOD исходит из локального класса в отчете, поэтому в примере есть LEAVE PROGRAM.   -  person Jagger    schedule 17.01.2014


Ответы (2)


Этот фрагмент кода проверяет 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 в своем коде.

person knut    schedule 16.01.2014
comment
Это была ошибка, спасибо. Но другой вопрос: а если бы все равно не получилось и я бы получил sy-subrc‹›0. Как найти причину ошибки? - person gurehbgui; 17.01.2014
comment
Вы можете проверить SAP-справку, чтобы получить коды повторной настройки (фактически: 0 = нормально, 4 = нет вставки, потому что тот же первичный ключ или уникальный вторичный индекс. 2 = проблема со структурой дескриптора большого объекта). Каких еще проблем вы ожидаете? Думаю другие проблемы закончатся исключением. - person knut; 17.01.2014

В ABAP sy-subrc == 0 всегда означает успех. Похоже, у вашего кода есть проблема, поскольку успех связан с любым другим значением.

Если вы поместите точку останова в свой код непосредственно перед вставкой, вы сможете проверить, что вставка прошла успешно.

Вы можете проверить возможные возвращаемые значения инструкции, наведя на нее курсор и нажав клавишу F1. это запустит справку/документацию.

С уважением

person PATRY Guillaume    schedule 16.01.2014
comment
извините, ошибся в сообщении. Я имею в виду, что sy-subrc всегда не 0. Я отредактировал свой вопрос. - person gurehbgui; 16.01.2014
comment
что за таблица reservation_tab ? стандартный, отсортированный или хешированный? какой ключ? вставка должна быть в порядке, за исключением случаев, когда ключ уже присутствует. - person PATRY Guillaume; 16.01.2014
comment
Его тип: TYPES t_reservation_tab TYPE HASHED TABLE OF zreservations WITH UNIQUE KEY reservation_id. - person gurehbgui; 17.01.2014