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.
4

1 に答える 1

2

のフィールド タイプのty_t001w長さが異なることに注意してください。

  • ekorg TYPE t001w-ekorgもっているCHAR 4
  • werks TYPE t001w-werksも有りますCHAR 4が、
  • name1 TYPE t001w-name1もっているCHAR 30

ty_t001wソース テーブル ( it1_col_row) とターゲット テーブル ( ) に同じタイプを使用していますit2_col_row。したがって、ソース行テーブルターゲット列テーブルにマッピングすると、30 文字のフィールドname1が 4 文字のフィールドにマッピングされますekorg。私のシステムであなたのプログラムを実行したとき、次の出力がありました(私のDBテーブルの内容に依存しますt001w):

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

一見、これは「すべての行を列に変換していない」ように見えます。しかし、デバッガーで、「Werk 0001」が実際には 2 つではなく1 つの値であることに気付きました。ただし、値は 30 文字のフィールドから 4 文字のフィールドにマップされるため、「Werk」のみに切り捨てられます。これは、列 1 ("Werk 0002") と 2 ("Werk 0003") の一番下の値に発生します。列 3 ("Werk RAD1") の一番下の値は、ここでは 30 文字のフィールドから 30 文字のフィールドにマップされているため、正しくマップされています。

この問題を修正するために、ターゲット テーブルの追加TYPES定義を作成しました。この場合、すべてのフィールドの最大長は 30 文字で、切り捨てが発生しないようになっています (以下の abap コードを参照)。次の出力が生成されます。ty_t001w_colit2_col_rowTYPE

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.
于 2014-12-25T10:29:36.057 に答える