for 循环中的 ABAP 方法调用
ABAP method call within a for-loop
ABAP 新手。我有一个 class "Truck" ("vrachtwagen"),它有一个 table 属性 it_pakket(货车上的包裹)。我写了一个方法来将这个 table 的内容写入屏幕(DisplayLading)。我想为每辆卡车执行此操作,因此我在 for 循环中调用此方法。程序运行没有错误,但输出没有显示在屏幕上。
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.
我编写了代码来用包裹装满卡车,并将卡车添加到我循环的内部 table。我的猜测是CVrachtwagen class实现中的write方法无法写入屏幕,因为程序还在运行循环?
系统变量 SY-INDEX
未在 LOOP AT
循环内设置,您需要在 it_vrachtwagens
和 [=14= 的循环内将其替换为 SY-TABIX
].
来自 SAP's documentation(帮助不大):
sy-index - 循环索引。在 DO 和 WHILE 循环中,包含先前循环次数,包括当前次数。
sy-tabix - 内部 table 的 table 索引中的行号。包含使用主索引或辅助索引 table 访问的最后一行。使用哈希算法访问时设置为 0。
ABAP 新手。我有一个 class "Truck" ("vrachtwagen"),它有一个 table 属性 it_pakket(货车上的包裹)。我写了一个方法来将这个 table 的内容写入屏幕(DisplayLading)。我想为每辆卡车执行此操作,因此我在 for 循环中调用此方法。程序运行没有错误,但输出没有显示在屏幕上。
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.
我编写了代码来用包裹装满卡车,并将卡车添加到我循环的内部 table。我的猜测是CVrachtwagen class实现中的write方法无法写入屏幕,因为程序还在运行循环?
系统变量 SY-INDEX
未在 LOOP AT
循环内设置,您需要在 it_vrachtwagens
和 [=14= 的循环内将其替换为 SY-TABIX
].
来自 SAP's documentation(帮助不大):
sy-index - 循环索引。在 DO 和 WHILE 循环中,包含先前循环次数,包括当前次数。
sy-tabix - 内部 table 的 table 索引中的行号。包含使用主索引或辅助索引 table 访问的最后一行。使用哈希算法访问时设置为 0。