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

约定

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

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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容