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.