4

108 のエントリで満たされた内部テーブルがあります。9 から 9 のエントリでエントリが繰り返されているため、それらの重複を削除したいと考えていました。それらはまったく同じなので、 を使用しましたdelete adjacent duplicates from itab comparing all fields。なしでも試してみcomparing all fieldsました。失敗。

私のテーブルには、bukrs、hkont、gjahr、belnr、budat、waers、shkzg、wrbtr、dmbtr、dmbe2 の 9 つのフィールドがあります。彼らは BSIS から来ており、この順序でもあります。これはDOSELECT があるループenter code hereです。ループのDELETE外側をパットしました。DO

最初の 2 つSELECTの は正常に機能しており、以前に存在したコードに属しています。

DO 12 TIMES.
         lv_aux = lv_aux + 1.
         lv_tamanho = STRLEN( lv_aux ).
         IF lv_tamanho = 1.
           CONCATENATE '0' lv_aux INTO lv_aux.
         ENDIF.
         CONCATENATE p_gjahr lv_aux '01' INTO z_v_first_day.

         PERFORM get_last_day_of_month USING z_v_first_day
                                       CHANGING lv_last_day.

         " some other code irrelevant to the issue

         SELECT bukrs hkont gjahr belnr budat waers shkzg dmbtr wrbtr dmbe2 FROM bsis
           APPENDING CORRESPONDING FIELDS OF TABLE gt_bancbsis
           WHERE hkont = '0051100001'
           AND bukrs EQ p_bukrs
           AND budat <= lv_last_day.

         " some other code irrelevant to the issue
ENDDO.

DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING ALL FIELDS.

ダバガーの内部テーブル gt_bancbsis の写真です。 デバッガーの itab

4

2 に答える 2

8

ADJACENTステートメント内の単語はDELETE ADJACENT DUPLICATES、非常に正当な理由があります。隣り合った重複行のみが削除されることを示しています。これは、オンラインのキーワード ドキュメントにも記載されています。

調べたコンポーネントで隣接する行の内容が同じである場合、その行は重複していると見なされます。複数の重複行が連続している場合は、すべての行 (最初の行を除く) が削除されます。

これは次のことを意味します: テーブルに値が含まれている場合

 A B
 C D
 A B
 C D

重複する値が含まれていますが、これらは隣接してDELETE ADJACENT DUPLICATESいないため、何を指定しても削除されません。

一方、ステートメントは、 1 つ以上の列SELECTに指示しない限り、選択されたデータセットを返すときに特定の順序を保証しません。ORDER BY行は任意の順序で返されるだけで、DELETE ADJACENT DUPLICATESステートメントが機能する場合は、まったくの偶然です。あるシステムでは動作し、別のシステムでは動作を停止し、3 つ目のシステムでは重複の半分だけを削除することさえあります。だから、基本的なルール:

重複を削除する前に、重複をチェックするフィールドで内部テーブルがソートされていることを確認してください。

スケーラビリティを向上さSORTせるには、データベースで行を でソートする代わりに、 ステートメントを使用する必要がありますORDER BY。したがって、どちらかを使用できます

SORT gt_bancbsis.
DELETE ADJACENT DUPLICATES FROM gt_bancbsis.

または、特定のフィールドのみを確​​認したい場合は、

SORT gt_bancbsis BY foo bar baz.
DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING foo bar baz.
于 2012-11-07T11:27:25.800 に答える
1

BSISテーブルでは、4 つの jey フィールド ( bukrs、hkont、gjahr、belnr ) を使用してます。これらのフィールドは、並べ替えにのみ使用してください。

  1. 最初に内部テーブルをソートします。

    SORT ITAB WITH KEY ITAB-FIELDS.
    
  2. 次に、フィールドを比較します。

     DELETE ADJACENT DUPLICATES FROM ITAB
    

    それはうまくいきます。

于 2012-11-07T04:29:26.503 に答える