如何在经典(写)和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 |
| | | |
--------------------------------------
需要帮助。谢谢你。
如果包含数据的内部表确实按照示例中的方式排序。然后,您可以记住输出的最后一行,并将下一行与前一行进行比较,并根据此条件写入空行。如果前一行不相等,则打印带有新数据的新行,并将新数据存储在前一行变量中。对我来说,这似乎不是很多开发工作。
然而,这是基于表以某种方式排序的假设。
假设您正在使用一个内部表来存储将要显示的数据,您可以使用DELETE adjacentduplicate ENTRIES FROM itab。
对于ALV网格,您必须使用内部表。对于WRITE语句,即使直接从数据库表中读取,也可以在内部表中缓冲条目,使用上面的语句删除重复项,然后显示内部表的结果。
问候,Sergiu
ALV确实为此提供了一个选项,它在默认情况下是启用的—但是您必须按照所讨论的列进行排序。不过你可以把它关掉。
如果你真的喜欢写你自己的清单(为什么今天有人这样做我无法理解),你必须为自己做。
这取决于您要显示的数据来自何处。
如果它在一个内部表中,那么排序和DELETE ADJACENT DUPLICATES
是一种方法(s+正如sepo提到的)。
但是,如果您正在使用SQL Select从数据库读取数据,那么最好让数据库完成工作并选择DISTINCT或相应地调整语句。这将抵消一些工作到数据库服务器(它也可能有一个索引,使这更快),并最大限度地减少网络流量。
尽管所有其他答案建议一个体面/更好的方法,我想我只是添加代码,准确地回答你的问题。它做了@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
语法;