SAP简友广场

ABAP基础知识 行表与列表的转换

2021-07-02  本文已影响0人  syjf1976_abap

点击蓝字 关注我们

01

前言

数据的清单呈现有两种方式

本文主要介绍行表与列表的互相转换

为了简化问题的说明及理解.我们把要呈现的清单限定为两个关键字,一个指标

列表呈现的优势及劣势

列表呈现方式可以直观的看出人员或产品的销量对比信息.

但是如果指标过多的情况(比如添加销售金额,销售成本等指标).列表呈现就需要更多的列显示不同的指标.

如果产品有更多的分类,列表显示也需要更多的列显示不同的产品.

这些因素都会导致列表呈现带来负面的效果. 影响数据的查看.

行表转列表的方式

执行结果

列表转行表的方式

执行结果

补充说明

行表转列表时需要确定如下因素

根据这些信息再结合动态内表的使用, 可以把行表转列表的逻辑封装成一个通用类. 结合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

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.     

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)


上一篇下一篇

猜你喜欢

热点阅读