abap - 没有循环计算总计和小计?
问题描述
我开始学习新的abap。但我有问题。我想在不使用“LOOP”和“AT”语句的情况下进行如下结果输出。
我有内部表,如:
Category Amount
AAA 10
AAA 20
BBB 30
CCC 40
CCC 50
CCC 60
我需要将输出显示为:
Category Amount
AAA 10
AAA 20
SUBTOTAL 30
BBB 30
SUBTOTAL 30
CCC 40
CCC 50
CCC 60
SUBTOTAL 150
TOTAL 210
有人能帮忙吗?
解决方案
如果您的问题是关于如何使用构造函数表达式 (ABAP >= 7.40) 构建内部表(在内存中),而不是在屏幕上或在假脱机文件中呈现它(总计和小计是 ALV 中很好集成的功能并且易于使用),那么这是一种方法(这里使用 ASSERT 来表明最终值符合预期):
TYPES : BEGIN OF ty_line,
category TYPE string,
amount TYPE decfloat16,
END OF ty_line,
ty_lines TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
DATA(gt_main) = VALUE ty_lines( ( category = 'AAA' amount = 10 )
( category = 'AAA' amount = 20 )
( category = 'BBB' amount = 30 )
( category = 'CCC' amount = 40 )
( category = 'CCC' amount = 50 )
( category = 'CCC' amount = 60 ) ).
DATA(lt_display) = VALUE ty_lines(
( LINES OF VALUE #(
FOR GROUPS <g> OF <line> IN gt_main
GROUP BY ( category = <line>-category )
( LINES OF VALUE #( FOR <line2> IN GROUP <g> ( <line2> ) ) )
( category = 'SUBTOTAL'
amount = REDUCE #( INIT subtotal TYPE ty_line-amount
FOR <line2> IN GROUP <g>
NEXT subtotal = subtotal + <line2>-amount ) ) ) )
( category = 'TOTAL'
amount = REDUCE #( INIT total TYPE ty_line-amount
FOR <line> IN gt_main
NEXT total = total + <line>-amount ) ) ).
ASSERT lt_display = VALUE ty_lines( ( category = 'AAA' amount = 10 )
( category = 'AAA' amount = 20 )
( category = 'SUBTOTAL' amount = 30 )
( category = 'BBB' amount = 30 )
( category = 'SUBTOTAL' amount = 30 )
( category = 'CCC' amount = 40 )
( category = 'CCC' amount = 50 )
( category = 'CCC' amount = 60 )
( category = 'SUBTOTAL' amount = 150 )
( category = 'TOTAL' amount = 210 ) ).
推荐阅读
- docker - 谷歌云计算实例无法按预期使用启动脚本
- python - 熊猫数据框:订单供应匹配
- docker - github工作流程:连接到docker容器时出现“ECONNREFUSED 127.0.0.1:***”错误
- c# - 如何使用 Blazor 发出 http 请求?尝试但给我一个错误
- c - 将具有十进制数的 char 数组转换为不同的浮点数
- node.js - 在 Node.js 中如何为每个动态创建的子进程建立超时回调?
- android - “时间”输入类型的键盘未完全显示
- microsoft-graph-api - Microsoft Graph API 重复用户
- autodesk-forge - 如何在 Forge Viewer 上的特定页面上打开 PDF 文件?
- electron - 在 Electron 中检测和粘贴 cntrl+v