禁止表中的重复条目

时间:2011-11-03 01:42:14

标签: duplicates report sap abap

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

需要帮助。谢谢。

5 个答案:

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