2011-11-03 100 views
1

如何在古典(写入)和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  | 
|   |    |   | 
-------------------------------------- 

需要help.Thank你。

+0

请说明一下 - 您是要删除这些行还是仅隐藏显示中的值? – vwegert

回答

1

假设您使用内部表来存储要显示的数据,可以使用DELETE ADJACENT DUPLICATE ENTRIES FROM itab

对于ALV网格,您必须使用内部表格。对于WRITE语句,即使直接从数据库表中读取,也可以缓冲内部表中的条目,使用上述语句删除重复项,然后显示内部表中的结果。

问候, 的Sergiu

+0

这个家伙如何使用这个解决方案(根据预期的输出部分)接收空行? – Jagger

+0

这很有用,我不得不先排序表,谢谢。 –

+0

@Jagger在删除相邻的重复项之后,您总是可以添加空行。 – sepo

1

ALV确实为此提供了一个选项,它在默认情况下启用 - 但您必须按照相关列进行排序。你可以关掉它。

如果你真的想写自己的名单(为什么今天任何人都会这样做是超出我的理解),你必须为自己做这件事。

2

好吧,如果与数据的内部表是真的排序你把你的例子的方式。然后,您可以记住输出的最后一行,并将下一行与前一行进行比较,根据此条件写入空行。如果前一行不相等,则用新数据打印新行并将新行存储在前一行变量中。对我来说,这似乎不是很多的开发工作。

然而,这是基于假设,表是不知何故排序。

1

这将取决于您显示的数据来自何处。

如果它在一个内部表中,那么排序和DELETE ADJACENT DUPLICATES是要走的路(s + as sepo提到)。

但是,如果您正在使用SQL Select从数据库中读取数据,最好让数据库执行该操作并选择DISTINCT或相应地调整您的语句。这会将一些工作抵消给数据库服务器(他们也可能有一个索引使其更快),并最大限度地减少网络流量。

+0

这也是有帮助的,谢谢Thorsten –

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_linewrite_empty_line包含所需的WRITE语法;我假设你已经弄清楚了这一部分。

+0

我没有尝试这种方法,但即时通讯gona尽快尝试虽然我已经解决了它。谢谢勒内 –