2014-11-27 5 views
3

내 내부 테이블 행을 열로 바꿔서 첫 번째 열을 수정하려면 다음 코드를 사용하여 수행하려고하지만 예상 결과를 얻지 못하고 있습니다 .... 모든 행을 변환하지 않습니다. 열로내부 테이블 행을 열로 변환하는 방법은 무엇입니까?

*Types Declaration 
Types: BEGIN OF ty_t001w, 
     ekorg TYPE t001w-ekorg, 
     werks TYPE t001w-werks, 
     name1 TYPE t001w-name1, 
     END OF ty_t001w. 

**Field Symbols Declaration 
FIELD-SYMBOLS: <fs1> TYPE any, 
       <fs2> TYPE any. 

**Internal table and work area declaration 
DATA: it1_col_row TYPE STANDARD TABLE OF ty_t001w, 
     wa1_col_row TYPE ty_t001w, 
     it2_col_row TYPE STANDARD TABLE OF ty_t001w, 
     wa2_col_row TYPE ty_t001w, 
     cline TYPE sy-tabix. 

**Filling internal table with data 

Select * 
    from t001w into corresponding fields of table it1_col_row 
    where ekorg = p_ekorg 
    and fabkl = p_fabkl. 

**Looping Internal table to display data 
LOOP AT it1_col_row INTO wa1_col_row. 
    WRITE:/wa1_col_row-ekorg, wa1_col_row-werks,wa1_col_row-name1. 
ENDLOOP. 
WRITE: /. 

**Looping internal table to change rows into columns 
LOOP AT it1_col_row INTO wa1_col_row. 
    CLEAR wa2_col_row. 
    ASSIGN COMPONENT sy-tabix OF STRUCTURE wa2_col_row TO <fs1>. 
    cline = sy-tabix. 
    DO. 
    ASSIGN COMPONENT sy-index OF STRUCTURE wa1_col_row TO <fs2>. 
    IF sy-subrc NE 0. 
     EXIT. 
    ENDIF. 
    IF cline = 1. 
     <fs1> = <fs2>. 
     APPEND wa2_col_row TO it2_col_row. 
    ELSE. 
     READ TABLE it2_col_row INTO wa2_col_row INDEX sy-index. 
     <fs1> = <fs2>. 
     MODIFY it2_col_row FROM wa2_col_row INDEX sy-index. 
    ENDIF. 
    ENDDO. 
ENDLOOP. 
* 
**Looping internal table to display 
LOOP AT it2_col_row INTO wa2_col_row. 
    WRITE:/wa2_col_row-ekorg,wa2_col_row-werks, wa2_col_row-name1. 
ENDLOOP. 

답변

2

주의하여 ty_t001w의 필드 유형은 다른 길이 있다고 :

  • ekorg TYPE t001w-ekorgCHAR 4
  • werks TYPE t001w-werksCHAR 4을 가지고있다,하지만
  • name1 TYPE t001w-name1 당신은 소스 테이블 (it1_col_row)과 목표 테이블 (it2_col_row)이 동일한 유형 ty_t001w을 사용하는 CHAR 30

있습니다. 따라서 원본 행 테이블대상 열 테이블에 매핑하면 30 문자 필드 name1이 4 문자 필드 ekorg에 매핑됩니다.

0001 0001 Werk 0001 
0001 0002 Werk 0002 
0001 0003 Werk 0003 
0001 RAD1 Werk RAD1 

0001 0001 0001 
0001 0002 RAD1 
Werk Werk Werk RAD1 

언뜻 보면이 "이 열에 모든 행을 변환하지 않습니다"처럼 보이는 : 내 시스템에서 프로그램을 실행했을 때 나는 (내 DB 테이블 t001w의 내용에 따라) 다음과 같은 출력을했다. 그러나 디버거에서 나는 "Werk 0001"이 실제로 값이 아니라는 것을 알아 차렸다. 그러나이 값은 30 문자 필드에서 4 문자 필드로 매핑되므로 "Werk"로만 잘립니다. 이것은 1 열 ("Werk 0002")과 2 ("Werk 0003")의 맨 아래 값에 발생합니다. 3 열 ("Werk RAD1")의 하단 값은 여기에 30 문자 필드에서 30 문자 필드로 매핑되므로 올바르게 매핑됩니다.

이 문제를 해결하기 위해 대상 테이블 it2_col_row에 대해 ty_t001w_col이라는 추가 정의를 만들었습니다. 이 TYPE에서 모든 필드는 최대 길이가 30 자이므로 자르지 않아도됩니다 (아래 abap 코드 참조).

0001 0001 Werk 0001 
0001 0002 Werk 0002 
0001 0003 Werk 0003 
0001 RAD1 Werk RAD1 

0001       0001       0001 
0001       0002       RAD1 
Werk 0001      Werk 0002      Werk RAD1 

수정 된 보고서 :

REPORT zhd_stackoverflow_q27163908. 

PERFORM function 
     USING '0001' 
      '01'. 

FORM function 
    USING p_ekorg TYPE ekorg 
     p_fabkl TYPE fabkl. 

Types Declaration 
TYPES: BEGIN OF ty_t001w, 
     ekorg TYPE t001w-ekorg, 
     werks TYPE t001w-werks, 
     name1 TYPE t001w-name1, 
     END OF ty_t001w. 
TYPES: BEGIN OF ty_t001w_col, 
     ekorg TYPE t001w-name1, 
     werks TYPE t001w-name1, 
     name1 TYPE t001w-name1, 
     END OF ty_t001w_col. 

*Field Symbols Declaration 
FIELD-SYMBOLS: <fs1> TYPE any, 
       <fs2> TYPE any. 

*Internal table and work area declaration 
DATA: it1_col_row TYPE STANDARD TABLE OF ty_t001w, 
     wa1_col_row TYPE ty_t001w, 
     it2_col_row TYPE STANDARD TABLE OF ty_t001w_col, 
     wa2_col_row TYPE ty_t001w_col, 
     cline TYPE sy-tabix. 

*Filling internal table with data 

SELECT * 
    FROM t001w INTO CORRESPONDING FIELDS OF TABLE it1_col_row 
    WHERE ekorg = p_ekorg 
    AND fabkl = p_fabkl. 

*Looping Internal table to display data 
LOOP AT it1_col_row INTO wa1_col_row. 
    WRITE:/wa1_col_row-ekorg, wa1_col_row-werks,wa1_col_row-name1. 
ENDLOOP. 
WRITE: /. 

*Looping internal table to change rows into columns 
LOOP AT it1_col_row INTO wa1_col_row. 
    CLEAR wa2_col_row. 
    ASSIGN COMPONENT sy-tabix OF STRUCTURE wa2_col_row TO <fs1>. 
    cline = sy-tabix. 
    DO. 
    ASSIGN COMPONENT sy-index OF STRUCTURE wa1_col_row TO <fs2>. 
    IF sy-subrc NE 0. 
     EXIT. 
    ENDIF. 
    IF cline = 1. 
     <fs1> = <fs2>. 
     APPEND wa2_col_row TO it2_col_row. 
    ELSE. 
     READ TABLE it2_col_row INTO wa2_col_row INDEX sy-index. 
     <fs1> = <fs2>. 
     MODIFY it2_col_row FROM wa2_col_row INDEX sy-index. 
    ENDIF. 
    ENDDO. 
ENDLOOP. 

*Looping internal table to display 
LOOP AT it2_col_row INTO wa2_col_row. 
    WRITE:/wa2_col_row-ekorg,wa2_col_row-werks, wa2_col_row-name1. 
ENDLOOP. 

ENDFORM. 
그것은 다음과 같은 출력을 생성합니다
관련 문제