Schlüsselbefehl Delete Adjacent Duplicates

Aus SAP-Wiki
(Weitergeleitet von Delete adjacent duplicates)
Wechseln zu: Navigation, Suche

Ein extrem eleganter und wertvoller Befehl, um eine Tabelle auf die für den jeweiligen Kontext nötigen Datensätze zu verdichten ist DELETE ADJACENT DUPLICATES.


Verwendung Befehl DELETE ADJACENT DUPLICATES

  • Hier werden aus einer internen Tabelle jeweils die Datensätze gelöscht, die unter "COMPARING" die gleiche Bedingung erfüllen. Der erste Satz unter diesen gleichen Datensätzen bleibt erhalten.
  • Daher ist es stets wichtig vor der Verdichtung die Tabelle nach den "Comparing"-Feldern zu sortieren und dies mit aufsteigend/absteigend (ascending/descending) in die Reihenfolge zu bringen, die nach der Verdichtung die gewünschten Datensätze übrig lässt. Ansonsten kommt es zu unsinnigen Ergebnissen.
sort itab by feld1 feld2.
delete adjacent duplicates from itab comparing feld1 feld2.
  • Wenn alle Felder einer Internen Tabelle bezüglich mehrerer Datensätze den gleichen Wert haben können, kann der Befehl auch ergänzt werden, um den Zusatz "comparing all fields".
delete adjacent duplicates from itab comparing all fields.

Anwendungsfall

Ein einfacher Anwendungsfall wäre, wenn man eine interne Tabelle ITAB hat, wo die Materialnummer ein Feld ist, in der eine Materialnummer mehrfach vorkommen kann. Für jeweils ein Material möchte man eine Datenbankselektion durchführen. Eine Möglichkeit ist nun zu programmieren.

Data: ls_itab type ty_itab,
      lv_maktx type makt-maktx.
 
* Sortieren und verdichten der Tabelle
  sort itab by matnr.
  delete adjacent duplicates from itab comparing matnr.
 
* Selektion der Materialkurzbeschreibung von der Datenbank
  loop at itab into ls_itab.
    Select maktx
      into lv_maktx
      from makt
      where matnr = ls_itab-matnr
         and spras = sy-langu.
  endloop.

Verdichtung Tabelle mit Addierung Mengenfeld

  • Häufig besteht die Anforderung eine Interne Tabelle zu verdichten, aber ein/mehrere Mengenfelder der Gruppe/eines verdichteten Datensatzes zu addieren.
  • Hier kann man mit einer Hilfstabelle arbeiten, in denen die unverdichteten Datensätze gespeichert werden und über diese Hilfstabelle erfolgt dann die Summierung des Mengenfeldes mit einer entsprechenden Where-Bedingung zur verdichteten Internen Tabelle.
form verdichtung using pit_itab type tty_itab.
  
Data: lt_itab  type tty_itab,
      lv_zmeng type vbap-zmeng,
      ls_itab  type ty_itab.
  
Field-Symbols: <fs_itab> type ty_itab.
 
* Merken der vollständigen Tabelle
  lt_itab = pit_itab. 

* Sortieren und Verdichten nach Gruppierungsmerkmal                    
  sort pit_itab by matnr.        
  delete adjacent duplicates form pit_itab comparing matnr.   

* Äußerer Loop über verdichtete Datensätze und 
*   innerer Loop über Gruppierungsmerkmal zur Addition des Mengenfeldes
  loop at pit_itab assigning <fs_itab>.      
    clear lv_zmeng.

    loop at lt_itab into ls_itab where matnr = <fs_itab>-matnr.        
       add ls_itab-zmeng to lv_zmeng.    "Addieren Mengenfeld
    endloop.
 
* Zuweisung addierte Menge zum Mengenfeld der Tabelle des äußeren Loops
    <fs_itab>-zmeng = lv_zmeng.            
  endloop.
 
endform.

Web-Links