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        |
|          |              |          |
--------------------------------------

需要帮助。谢谢。

4

5 回答 5

2

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

然而,这是基于表格以某种方式排序的假设。

于 2011-11-03T12:37:59.407 回答
1

ALV 确实为此提供了一个选项,它默认启用 - 但您必须按有问题的列进行排序。不过,您可以将其关闭。

如果你真的喜欢编写自己的列表(为什么今天有人会这样做,我无法理解),你必须自己做。

于 2011-11-03T10:04:01.857 回答
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语法;我假设你已经弄清楚了那部分。

于 2011-11-08T00:07:21.070 回答
1

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

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

但是,如果您使用 SQL Select 从数据库中读取数据,最好让数据库完成工作并 SELECT DISTINCT 或相应地调整您的语句。这将抵消数据库服务器的一些工作(他们可能也有一个索引来加快速度)并最大限度地减少网络流量。

于 2011-11-06T20:54:49.517 回答
1

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

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

问候,塞尔吉乌

于 2011-11-03T11:03:36.923 回答