2014-01-16 29 views
1

我遇到ABAP问题。我有以下的代码从一本书:如何找到我的SQL INSERT不起作用的原因?

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. 

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

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

+2

'METHOD'和'LEAVE PROGRAM' in the same example?请尽快扔掉本书。 ;-) – vwegert

+1

请将数据类型声明添加到示例中,特别是结构和表类型。 – vwegert

+2

插入后,您仍然在sy-subrc上检查错误的方法。插入实际工作时,您报告错误。 – Esti

回答

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分支。

+0

这是错误,谢谢。但还有一个问题:如果它仍然会失败,我会得到一个sy-subrc <> 0.如何找到错误的原因? – gurehbgui

+0

您可以检查SAP帮助以获取retun代码(实际上:0 = ok,4 =因为相同的主键或唯一的二级索引而没有插入,2 = LOB句柄结构存在问题)。你还期望什么问题?我认为其他问题会以例外结束。 – knut

1

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

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

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

问候

+0

对不起,我在帖子中输入了一个错误。我的意思是sy-subrc总是不是0.我编辑了我的问题。 – gurehbgui

+0

什么样的表是reservation_tab?标准,排序或哈希?关键是什么?除非钥匙已经存在,否则插入应该是确定的。 –

+0

它的类型:TYPES t_reservation_tab TYPE HASHED TABLE OF zreservations WITH UNIQUE KEY reservation_id。 – gurehbgui