在for循环中调用ABAP方法

时间:2017-10-04 14:48:14

标签: sap abap

ABAP很新。我有一个班级“卡车”(“vrachtwagen”),它有一个表属性it_pakket(卡车包装)。我写了一个方法将这个表的内容写入屏幕(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.

我已经编写了代码,用卡片填充卡车,并将卡车添加到我循环的内部工作台上。我的猜测是CVrachtwagen类实现中的write方法无法写入屏幕,因为程序仍在运行循环?

1 个答案:

答案 0 :(得分:4)

系统变量SY-INDEX未设置在LOOP AT循环内,您需要将SY-TABIX替换为it_vrachtwagensit_pakket循环内的interface NormalizedObjects<T> { byId: { [id: string]: T }; allIds: string[]; } interface ReduxState { posts: NormalizedObjects<Post>; comments: NormalizedObjects<Comment>; users: NormalizedObjects<User>; }

来自SAP's documentation(不太有用):

sy-index - 循环索引。在DO和WHILE循环中,包含先前循环遍数,包括当前循环。

sy-tabix - 内部表的表索引中的行号。包含使用主表或辅助表索引访问的最后一行。使用哈希算法访问时设置为0.