for循环中的ABAP方法调用
对ABAP来说是个新鲜事。我有一个类“Truck”(“vrachtwagen”),它有一个表属性it_pakket(Truck中的包)。我已经编写了一个方法将此表的内容写入屏幕(displaylind)。我想对每辆卡车都这样做,所以我在for循环中调用这个方法。程序运行时没有错误,但输出不会显示在屏幕上for循环中的ABAP方法调用,abap,Abap,对ABAP来说是个新鲜事。我有一个类“Truck”(“vrachtwagen”),它有一个表属性it_pakket(Truck中的包)。我已经编写了一个方法将此表的内容写入屏幕(displaylind)。我想对每辆卡车都这样做,所以我在for循环中调用这个方法。程序运行时没有错误,但输出不会显示在屏幕上 REPORT ZPR412_OO_OEF1. CLASS CPakket DEFINITION. PUBLIC SECTION. DATA: Id TYPE I READ-
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类实现中的write方法无法写入屏幕,因为程序仍在运行循环?系统变量
SY-INDEX
未设置在循环中的循环中,您需要在it\u vrachtwagens
和it\u pakket
上的循环中用SY-TABIX
替换它
来自(不太有用):
sy索引-循环索引。在DO和WHILE循环中,包含以前的循环过程数,包括当前过程
sy tabix—内部表的表索引中的行号。包含使用主表索引或辅助表索引访问的最后一行。使用哈希算法访问时设置为0。系统变量SY-INDEX
未设置在循环中的循环中,您需要在it vrachtwagens
和it-packet
上的循环中用SY-TABIX
替换它
来自(不太有用):
sy索引-循环索引。在DO和WHILE循环中,包含以前的循环过程数,包括当前过程
sy tabix—内部表的表索引中的行号。包含使用主表索引或辅助表索引访问的最后一行。当使用散列算法访问时设置为0。在哪里填充it_-pakket
?@lausek在代码的不同部分(为了防止混乱,我在原始帖子中没有包含它),我创建了3个“pakket”对象并将它们附加到表it_-pakket中。我能够使用单独的Write语句打印此表的输出,因此表it_pakket毫无疑问是填充的。问题很可能出在您未提供的部分代码中。请编辑您的问题以包含一个。除此之外:ABAP不区分大小写,因此我不建议您习惯于使用CamelCase命名约定,而是坚持推荐的小写字母加下划线命名。另外,代码中的名字应该是英文的。你调试过代码吗?您可以通过调用断点
来轻松实现这一点。但是你的程序不能因为运行循环而不打印。嗯,除了循环是无止境的……哦,顺便说一句,loop
语句不使用sy索引
来计算行数。你应该检查一下sy tabix
,这也不是一个很好的解决方案,因为它也会被READ TABLE
修改,你在哪里填充it_pakket
?@lausek在代码的另一部分(为了防止混乱,我的原始帖子中没有包含它),我创建了3个“pakket”对象并将它们附加到表it_pakket中。我能够使用单独的Write语句打印此表的输出,因此表it_pakket毫无疑问是填充的。问题很可能出在您未提供的部分代码中。请编辑您的问题以包含一个。除此之外:ABAP不区分大小写,因此我不建议您习惯于使用CamelCase命名约定,而是坚持推荐的小写字母加下划线命名。另外,代码中的名字应该是英文的。你调试过代码吗?您可以通过调用断点
来轻松实现这一点。但是你的程序不能因为运行循环而不打印。嗯,除了循环是无止境的……哦,顺便说一句,loop
语句不使用sy索引
来计算行数。您应该检查sy tabix
,这也不是一个很好的解决方案,因为它也会被READ TABLE