2011-11-03 102 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儘快嘗試雖然我已經解決了它。謝謝勒內 –