Abap 如何将内部表的行转换为列?

Abap 如何将内部表的行转换为列?,abap,transpose,internal-tables,Abap,Transpose,Internal Tables,我想将我的内部表行转换为列,我想修复第一列,我试图用下面的代码来做,但我没有得到预期的结果…它没有将所有的行转换为列 *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 Declar

我想将我的内部表行转换为列,我想修复第一列,我试图用下面的代码来做,但我没有得到预期的结果…它没有将所有的行转换为列

*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类型t001w ekorg,
t001w型werks,
名称1类型t001w-name1,
ty_t001w的末端。
**字段符号声明
字段符号:键入任意,
键入任何。
**内部表格和工作区声明
数据:ty_t001w的it1_列式标准表,
wa1_col_row类型ty_t001w,
ty t001w的it2列式标准表,
wa2_col_row类型ty_t001w,
斜型sy-tabix。
**用数据填充内部表
挑选*
从t001w进入表it1列的相应字段
其中ekorg=p_ekorg
fabkl=p_fabkl。
**循环内部表以显示数据
在it1列循环到wa1列。
写入:/wa1_col_row-ekorg、wa1_col_row-werks、wa1_col_row-name1。
结束循环。
写:/。
**循环内部表以将行更改为列
在it1列循环到wa1列。
清除wa2_col_row。
将结构wa2列的组件sy tabix分配给。
cline=sy tabix。
做
将结构wa1列的组件sy索引分配给。
如果sy subrc NE为0。
出口
恩迪夫。
如果cline=1。
= .
将wa2列追加到it2列。
其他的
将表it2列读入wa2列索引sy索引。
= .
从wa2列索引sy索引修改it2列。
恩迪夫。
恩多。
结束循环。
*
**循环要显示的内部表
在it2列循环到wa2列。
写入:/wa2_col_row-ekorg、wa2_col_row-werks、wa2_col_row-name1。
结束循环。

请注意,
ty\u t001w
的字段类型具有不同的长度:

  • ekorg类型t001w ekorg
    具有
    CHAR 4
  • werks类型t001w werks
    也有
    CHAR 4
    ,但
  • name1类型t001w-name1
    具有
    CHAR 30
对于源表(
it1列
)以及目标表(
it2列
),您使用的是相同类型的
ty\u t001w
)。因此,当您将源行表映射到目标列表时,30个字符的字段
name1
将映射到4个字符的字段
ekorg
。当我在我的系统中执行您的程序时,我有以下输出(取决于我的DB表
t001w
的内容):

乍一看,这看起来像是“它并没有将所有的行转换成列”。但在调试器中,我注意到“Werk 0001”实际上是一个值,而不是两个值!但是,该值被截断为仅“Werk”,因为它是从30个字符的字段映射到4个字符的字段。这发生在第1列(“Werk 0002”)和第2列(“Werk 0003”)的底部值上。第3列的底部值(“Werk RAD1”)映射正确,因为这里它是从30个字符的字段映射到30个字符的字段

为了纠正这个问题,我为目标表it2列创建了一个额外的
TYPES
定义
ty\u t001w\u col
。在此
类型中
所有字段的最大长度为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.
报告zhd_stackoverflow_q27163908。
履行职能
使用“0001”
'01'.
形式函数
使用p_ekorg类型ekorg
p_fabkl型fabkl。
类型声明
类型:从ty_t001w开始,
ekorg类型t001w ekorg,
t001w型werks,
名称1类型t001w-name1,
ty_t001w的末端。
类型:从ty_t001w_col开始,
ekorg类型t001w-name1,
werks类型t001w-name1,
名称1类型t001w-name1,
ty_t001w_col的末尾。
*字段符号声明
字段符号:键入任意,
键入任何。
*内部表格和工作区声明
数据:ty_t001w的it1_列式标准表,
wa1_col_row类型ty_t001w,
it2列式ty列t001w列标准表,
wa2列ty列t001w列,
斜型sy-tabix。
*用数据填充内部表
挑选*
从t001w进入表it1列的相应字段
其中ekorg=p_ekorg
fabkl=p_fabkl。
*循环内部表以显示数据
在it1列循环到wa1列。
写入:/wa1_col_row-ekorg、wa1_col_row-werks、wa1_col_row-name1。
结束循环。
写:/。
*循环内部表以将行更改为列
在it1列循环到wa1列。
清除wa2_col_row。
将结构wa2列的组件sy tabix分配给。
cline=sy tabix。
做
将结构wa1列的组件sy索引分配给。
如果sy subrc NE为0。
出口
恩迪夫。
如果cline=1。
= .
将wa2列追加到it2列。
其他的
将表it2列读入wa2列索引sy索引。
= .
从wa2列索引sy索引修改it2列。
恩迪夫。
恩多。
结束循环。
*循环要显示的内部表
在it2列循环到wa2列。
写入:/wa2_col_row-ekorg、wa2_col_row-werks、wa2_col_row-name1。
结束循环。
尾型。
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.