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

Well, if the internal table with the data is really sorted the way you put in your example. Then you can remember the last line that was output and compare the next one to the previous one an write an empty row based on this condition. If the previous line is not equal then you print the new row with new data and store the new one in the previous row variable. To me it does not seem like a lot of the development effort.

This is however based on the assumption that the table is somehow sorted.

于 2011-11-03T12:37:59.407 に答える
1

ALVにはこのオプションがあり、デフォルトで有効になっていますが、問題の列で並べ替える必要があります。ただし、オフにすることはできます。

あなたが本当にあなた自身のリストを書くことに興味があるなら(なぜ今日誰かがそれをするのかは私の理解を超えています)、あなたはあなた自身のためにこれをしなければならないでしょう。

于 2011-11-03T10:04:01.857 に答える
1

表示されるデータを格納するために内部テーブルを使用していると仮定すると、ITABから隣接する重複エントリを削除を使用できます。

For ALV grid you have to use an internal table. For WRITE statement, even if you read directly from a database table you can buffer the entries in an internal table, use the above statement to delete duplicates and then display results from internal table.

Regards, Sergiu

于 2011-11-03T11:03:36.923 に答える
1

This would depend where the data that you are displaying is coming from.

それが内部テーブルにある場合は、並べ替えて実行DELETE ADJACENT DUPLICATESする方法です(s + sepoが述べたように)。

ただし、SQL Selectを使用してデータベースからデータを読み取る場合は、データベースに作業を任せてSELECT DISTINCTを実行するか、それに応じてステートメントを調整することをお勧めします。これにより、データベースサーバー(これを高速化するためのインデックスもある場合があります)への作業が相殺され、ネットワークトラフィックが最小限に抑えられます。

于 2011-11-06T20:54:49.517 に答える
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 に答える