2017-10-04 5 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 클래스 구현의 write 메소드가 화면에 쓸 수 없다는 것입니다.

+0

어디서 'it_pakket'을 채우시겠습니까? –

+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-INDEXLOOP AT 루프 내에서 설정되지 않은 시스템 변수는, 당신은 it_vrachtwagensit_pakket 통해 루프 내부 SY-TABIX로 교체해야합니다. (너무 도움이되지 않음) SAP's documentation에서

:

SY-인덱스 - 루프 인덱스입니다. DO 및 WHILE 루프에는 현재 패스를 포함하여 이전 루프 통과 수를 포함합니다.

sy-tabix - 내부 테이블의 테이블 인덱스에있는 행 번호. 기본 또는 보조 테이블 인덱스를 사용하여 액세스 한 마지막 행을 포함합니다. 해시 알고리즘을 사용하여 액세스 할 때 0으로 설정됩니다.

+0

정말 고마워요! – RobVH