如何将内部表行转置为列



我想将我的内部表行转置为列,我想修复第一列,我正在尝试使用以下代码执行此操作,但我没有得到预期的结果....它不是将所有行转换为列

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

请注意,ty_t001w的字段类型具有不同的长度:

  • ekorg TYPE t001w-ekorgCHAR 4
  • werks TYPE t001w-werks也有CHAR 4,但是
  • name1 TYPE t001w-name1CHAR 30

您对源表 ( it1_col_row ) 和目标表 ( it2_col_row ) 使用相同的类型 ty_t001w 。因此,当您将源行表映射到目标列表时,30 个字符的字段name1将映射到 4 个字符的字段ekorg。当我在系统中执行您的程序时,我有以下输出(取决于我的数据库表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"实际上是一个值,而不是两个!但是,该值被截断为仅"Werk",因为它从 30 个字符的字段映射到 4 个字符的字段。这发生在第 1 列("Werk 0002")和第 2 列("Werk 0003")的底部值。第 3 列("Werk RAD1")的底部值已正确映射,因为此处它从 30 个字符的字段映射到 30 个字符的字段。

为了纠正这个问题,我为目标表it2_col_row创建了一个额外的TYPES定义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.

相关内容

  • 没有找到相关文章