如何在经典(写入)和ALV报告中抑制重复条目?我有一个任务是用这个标准写一个简单的报告。 我试图谷歌,但无法成功解决任何问题并需要帮助。以下是预期结果。
原始报告:
--------------------------------------
|Sales Org | Dist.Channel | Division |
--------------------------------------
|1000 |10 |00 |
|1000 |10 |00 |
|1000 |10 |00 |
|1020 |22 |00 |
|1020 |22 |00 |
--------------------------------------
预期产出:
--------------------------------------
|Sales Org | Dist.Channel | Division |
--------------------------------------
|1000 |10 |00 |
| | | |
| | | |
|1020 |22 |00 |
| | | |
--------------------------------------
需要帮助。谢谢。
答案 0 :(得分:2)
好吧,如果带有数据的内部表确实按照您放入示例的方式进行排序。然后你可以记住输出的最后一行,并将下一行与前一行进行比较,根据这个条件写一个空行。如果前一行不相等,则使用新数据打印新行,并将新行存储在上一行变量中。对我而言,这似乎不是很多开发工作。
然而,这是基于表以某种方式排序的假设。
答案 1 :(得分:1)
ALV确实为此提供了一个选项,它默认启用 - 但您必须按相关列进行排序。你可以把它关掉。
如果你真的想写自己的名单(为什么今天有人会这样做是超出我的理解),你必须自己做。
答案 2 :(得分:1)
假设您使用内部表来存储将要显示的数据,您可以使用DELETE ADJACENT DUPLICATE ENTRIES FROM itab。
对于ALV网格,您必须使用内部表。对于WRITE语句,即使您直接从数据库表中读取也可以缓冲内部表中的条目,请使用上述语句删除重复项,然后显示内部表中的结果。
此致 的Sergiu
答案 3 :(得分:1)
这取决于您显示的数据来自何处。
如果它在内部表格中,那么排序和DELETE ADJACENT DUPLICATES
是可行的方式(s +如所提到的那样)。
但是,如果您使用SQL Select从数据库中读取数据,最好让数据库执行工作并选择SELECT DISTINCT或相应地调整语句。这将使一些工作抵消数据库服务器(也可能有一个索引,以使这更快),并最大限度地减少网络流量。
答案 4 :(得分:1)
即使所有其他答案都提出了一个体面/更好的方法,我想我只是添加完全回答你问题的代码。它确实是@Jagger所建议的。
DATA wa_tvta_prev TYPE tvta.
FIELD-SYMBOLS <fs_tvta> TYPE tvta.
LOOP AT ta_tvta ASSIGNING <fs_tvta>.
IF <fs_tvta> <> wa_tvta_prev.
PERFORM write_line USING <fs_tvta>.
ELSE.
PERFORM write_empty_line.
ENDIF.
wa_tvta_prev = <fs_tvta>.
ENDLOOP.
这假设您有一个已排序的内部表ta_tvta
,其中包含示例中的数据。子例程write_line
和write_empty_line
包含所需的WRITE
语法;我假设你已经弄明白这一部分了。