ABAP基础知识 行表与列表的转换
点击蓝字 关注我们
01
前言
数据的清单呈现有两种方式
-
行表呈现(图一): 与数据存储方式一致,读取后直接呈现,修改后直接保存
-
列表呈现(图二): 与数据存储方式不一致,读取后需转换呈现,修改后需转换保存
本文主要介绍行表与列表的互相转换
为了简化问题的说明及理解.我们把要呈现的清单限定为两个关键字,一个指标
二
列表呈现的优势及劣势
列表呈现方式可以直观的看出人员或产品的销量对比信息.
但是如果指标过多的情况(比如添加销售金额,销售成本等指标).列表呈现就需要更多的列显示不同的指标.
如果产品有更多的分类,列表显示也需要更多的列显示不同的产品.
这些因素都会导致列表呈现带来负面的效果. 影响数据的查看.
三
行表转列表的方式
-
建立关键字值与列的对应关系
-
循环行表
-
按关键字读取列表(哈希表):如果未读取到,新增一条记录
-
识别关键字值对应的列表字段:可以构建对应关系表, 也可以用关键字值与字段名的内在对应关系(比如关键字值是月, 字段名中包含月信息,则可以通过特定逻辑构造关系)
-
累计字段的值
执行结果
四
列表转行表的方式
-
循环列表
-
循环关键字与字段对应关系
-
赋值列表每个字段的值.
-
如果字段值非空 添加到行表
执行结果
五
补充说明
行表转列表时需要确定如下因素
-
列表保留的关键字:示例中的字段NAME. 也可以是多个关键字
-
要转入列的字段: 示例中的字段CAT
-
要转入的指标: 示例中的数量.
根据这些信息再结合动态内表的使用, 可以把行表转列表的逻辑封装成一个通用类. 结合ALV显示,可以做成ALV的一个功能.
根据用户指定的关键字,指定的列,指定的指标转列表显示.
后续考虑实现这个封装类并与动态报表结合,给动态报表更多的交互功能
六
行业使用
鞋服行业中,因为款-变式商品使用. 报表大多需要用列表呈现方式.
一般情况下, 会把商品,颜色等信息作为关键字,把尺码作为转入列的字段. 把数量或金额作为转入的指标. 呈现数据
数据录入或导入时, 把商品,颜色信息作为关键字,把尺码作为转入列的字段, 把数量作为转入的指标. 录入数据后, 转换成行表,执行导入的处理.
七
示例程序源代码
示例程序源代码如下
*&---------------------------------------------------------------------*
*& Report ZTS_COL_TO_LINE
*&---------------------------------------------------------------------*
*&用于演示行表与列表的互相转换方式
*&---------------------------------------------------------------------*
REPORT zts_col_to_line.
*行表定义
DATA: BEGIN OF lw_line,
name(10), "姓名
cat(10), "产品
sl TYPE i,
END OF lw_line.
DATA: lt_line LIKE TABLE OF lw_line.
*列表定义
DATA: BEGIN OF lw_col,
name(10),
catsl01 TYPE i,
catsl02 TYPE i,
catsl03 TYPE i,
END OF lw_col.
DATA: lt_col LIKE HASHED TABLE OF lw_col WITH UNIQUE KEY name.
START-OF-SELECTION.
*行表赋值
lt_line = VALUE #(
( name = '张三' cat = '电视' sl = 10 )
( name = '张三' cat = '手机' sl = 20 )
( name = '张三' cat = '冰箱' sl = 30 )
( name = '李四' cat = '电视' sl = 40 )
( name = '李四' cat = '电视' sl = 5 )
( name = '李四' cat = '手机' sl = 50 )
( name = '王五' cat = '冰箱' sl = 60 )
).
CALL METHOD cl_demo_output=>write( lt_line ).
*行表转换成列表
**建立产品与列的对应关系,
DATA: BEGIN OF lw_rel,
cat(10),
fieldname(10),
END OF lw_rel.
DATA: lt_rel LIKE HASHED TABLE OF lw_rel WITH UNIQUE KEY cat.
DATA: lv_numc2 TYPE numc2.
CLEAR lv_numc2.
LOOP AT lt_line INTO DATA(lw_gp) GROUP BY ( cat = lw_gp-cat ).
lv_numc2 = lv_numc2 + 1.
CLEAR lw_rel.
lw_rel-cat = lw_gp-cat.
lw_rel-fieldname = 'CATSL' && lv_numc2.
INSERT lw_rel INTO TABLE lt_rel.
ENDLOOP.
*循环行表,统计并赋值列表内容
LOOP AT lt_line INTO lw_line.
READ TABLE lt_col ASSIGNING FIELD-SYMBOL(<fs_col>) WITH TABLE KEY name = lw_line-name.
IF sy-subrc <> 0.
CLEAR lw_col.
lw_col-name = lw_line-name.
INSERT lw_col INTO TABLE lt_col ASSIGNING <fs_col>.
ENDIF.
IF <fs_col> IS ASSIGNED.
*定位产品对应的字段名
READ TABLE lt_rel INTO lw_rel WITH TABLE KEY cat = lw_line-cat.
IF sy-subrc = 0.
ASSIGN COMPONENT lw_rel-fieldname OF STRUCTURE <fs_col> TO FIELD-SYMBOL(<fs_sl>).
IF sy-subrc = 0.
<fs_sl> = <fs_sl> + lw_line-sl. "统计数量
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CALL METHOD cl_demo_output=>write( lt_col ).
*列表转行表的方式
REFRESH lt_line.
LOOP AT lt_col INTO lw_col.
LOOP AT lt_rel INTO lw_rel.
ASSIGN COMPONENT lw_rel-fieldname OF STRUCTURE lw_col TO <fs_sl>.
IF sy-subrc = 0.
IF <fs_sl> IS NOT INITIAL.
CLEAR lw_line.
lw_line-name = lw_col-name.
lw_line-cat = lw_rel-cat.
lw_line-sl = <fs_sl>.
APPEND lw_line TO lt_line.
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
CALL METHOD cl_demo_output=>write( lt_line ).
CALL METHOD cl_demo_output=>display( ).
八
总结
行表转列表及列表转行表的核心是转入列的内容与列表字段名的对应关系.
该关系可以通过内表构造, 也可以通过逻辑构造.
通过ASSIGN COMPONENT 语句实现行表/列表的互相转换.
ASSIGN COMPONENT 语句是动态编程的核心语句. 灵活掌握可以实现更多的复杂的功能.
THE
END
约定
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)