2017-10-04 307 views
0

對ABAP來說很新穎。我有一個班級「卡車」(「vrachtwagen」),它有一個表屬性it_pakket(卡車包)。我寫了一個方法將這個表的內容寫到屏幕上(DisplayLading)。我想爲每輛卡車做這個,所以我在for循環中調用這個方法。程序運行沒有錯誤,但輸出不顯示在屏幕上。for循環中的ABAP方法調用

REPORT ZPR412_OO_OEF1. 

CLASS CPakket DEFINITION. 
    PUBLIC SECTION. 
     DATA: Id TYPE I READ-ONLY, 
      aantal TYPE I, 
      bestemmeling TYPE STRING. 
     METHODS: SetID IMPORTING ID TYPE I. 
ENDCLASS. 

CLASS CPakket IMPLEMENTATION. 
    METHOD SetID. 
    me->Id = ID. 
    ENDMETHOD. 
ENDCLASS. 

CLASS CVrachtwagen DEFINITION. 
    PUBLIC SECTION. 
    DATA: Id TYPE I READ-ONLY. 
    METHODS: SetID IMPORTING ID TYPE I, 
      LaadPakket IMPORTING Pakket TYPE REF TO CPakket, 
      LosPakket IMPORTING Pakket TYPE REF TO CPakket, 
      DisplayLading. 
    PRIVATE SECTION. 
    DATA: it_pakket TYPE STANDARD TABLE OF REF TO CPakket, 
      pakket TYPE REF TO CPakket. 
ENDCLASS. 

CLASS CVrachtwagen IMPLEMENTATION. 
    METHOD SetID. 
    me->Id = ID. 
    ENDMETHOD. 
    METHOD LaadPakket. 
    APPEND Pakket TO it_pakket. 
    ENDMETHOD. 
    METHOD LosPakket. 
    ENDMETHOD. 
    METHOD DisplayLading. 
    LOOP AT me->it_pakket into pakket. 
     WRITE:/ pakket->Id, pakket->aantal, pakket->bestemmeling. 
    ENDLOOP. 
    ENDMETHOD. 
ENDCLASS. 

DATA: 
    vrachtwagen TYPE REF TO CVrachtwagen, 
    it_vrachtwagens TYPE STANDARD TABLE OF REF TO CVrachtwagen, 
    pakket TYPE REF TO CPakket, 
    it_pakket TYPE STANDARD TABLE OF REF TO CPakket, 
    s TYPE string. 

start-of-selection. 
DO 2 TIMES. 
    CREATE OBJECT vrachtwagen. 
    CALL METHOD vrachtwagen->SetId EXPORTING Id = sy-index. 
    APPEND vrachtwagen TO it_vrachtwagens. 
ENDDO. 

CREATE OBJECT pakket. 
CALL METHOD pakket->SetId EXPORTING Id = 1. 
pakket->aantal = 5. 
pakket->bestemmeling = 'Bob'. 
APPEND pakket TO it_pakket. 

CREATE OBJECT pakket. 
CALL METHOD pakket->SetId EXPORTING Id = 2. 
pakket->aantal = 2. 
pakket->bestemmeling = 'Jan'. 
APPEND pakket TO it_pakket. 

CREATE OBJECT pakket. 
CALL METHOD pakket->SetId EXPORTING Id = 3. 
pakket->aantal = 1. 
pakket->bestemmeling = 'Piet'. 
APPEND pakket TO it_pakket. 

LOOP AT it_vrachtwagens INTO vrachtwagen. 
    CASE sy-index. 
    WHEN 1. 
     loop at it_pakket into pakket. 
     if sy-index lt 3. 
      vrachtwagen->LaadPakket(pakket). 
     endif. 
     endloop. 
    WHEN 2. 
     read table it_pakket into pakket index 3. 
     vrachtwagen->LaadPakket(pakket). 
    ENDCASE. 
ENDLOOP. 
LOOP AT it_vrachtwagens INTO vrachtwagen. 
    vrachtwagen->DisplayLading(). 
ENDLOOP. 

我寫的代碼,以填補包卡車和添加的卡車內部表在我環路。我的猜測是CVrachtwagen類實現中的寫入方法無法寫入屏幕,因爲程序仍在運行循環?

+0

你在哪裏填寫'it_pakket'? – 2017-10-04 15:40:53

+0

@lausek在代碼的不同部分(沒有在我的原始文章中包含它以防止混亂),我創建3個「pakket」對象並將它們附加到表it_pakket。我能夠使用單獨的Write語句打印此表的輸出,因此表it_pakket毫無疑問地被填充。 – RobVH

+1

問題很可能出現在您未提供的部分代碼中。請修改您的問題以包含[MCVE](https://stackoverflow.com/help/mcve)。除此之外:ABAP不區分大小寫,所以我不建議你習慣於使用CamelCase命名約定,而是堅持推薦的lower_case_with_underscores命名。此外,代碼中的名稱應該是英文的。 – vwegert

回答

4

系統變量SY-INDEX沒有設置LOOP AT循環中,你需要在it_vrachtwagensit_pakketSY-TABIX你的循環裏面來取代它。

SAP's documentation(不是太有用):

SY-指數 - 環指標。在DO和WHILE循環中,包含先前循環遍數的數量,包括當前遍數。

sy-tabix - 內部表的表索引中的行號。包含使用主或輔助表索引訪問的最後一行。使用散列算法訪問時設置爲0。

+0

這個工作,非常感謝你! – RobVH