SAP Jobsuche bei DV-Treff


Suchen
image
  • image
  • SAP Forum - User Thema Starter
vor 17 Jahre

Hi,

Um doppelte Einträge in einer internen Tabelle zu löschen gibt es
den Befehl

Delete ADJACENT DUPLICATED FROM itab COMPARING KUNNR NAME

 
Ich möchte das selbe etwa damit nachbilden. Ich bekomme es
irgendwie nicht ganz zusammen. Kann mir vielleicht jemand  auf die Sprünge helfen

Loop at itab into wa2.
read table itab into wa3 with key KUNNR = wa2-KUNNR NAME = wa2-NAME.
IF sy-subrc ....
write:/ 'Doppelte eintraege sind' , ....
ENDIF.
endloop.

  Grüße

image

dimes
  • dimes
  • SAP Forum - Neuling
vor 17 Jahre

versuch es mal auserhalb der loop-schleife...

gruß dimes

f.kemmer
vor 17 Jahre

Hi Image,

Dein Ansatz war gut aber halt nicht ausprogrammiert.

Loop at itab into wa2.
  read table itab into wa3 with key KUNNR = wa2-KUNNR NAME = wa2-NAME.
  IF sy-subrc EQ 0.
    write:/ 'Doppelter Eintrag' , ' ' , wa2-kunnr.
    delete itab with key kunnr = wa2-kunnr
                                       name = wa2-name. 
  ENDIF.
endloop.

Anmerkungen:
 - Warum willst du nicht einfach den Befehl "Delete ADJACENT DUPLICATES FROM itab COMPARING KUNNR NAME" verwenden?
 - Bist du wirklich sicher dass zwei Datensätze die den gleichen Namen und die gleiche Kundennummer haben auch sonst in allen Feldwerten übereinstimmen?

sy-tabix
vor 17 Jahre
f.kemmer schrieb:

Loop at itab into wa2.
  read table itab into wa3 with key KUNNR = wa2-KUNNR NAME = wa2-NAME.
  IF sy-subrc EQ 0.
    write:/ 'Doppelter Eintrag' , ' ' , wa2-kunnr.
    delete itab with key kunnr = wa2-kunnr
                                       name = wa2-name. 
  ENDIF.
endloop.

hmmm... Das Coding ist auch nicht so ganz richtig. Ein bisschen logisch u. syntaktisch falsch.

Syntaktisch falsch:
    delete itab with key kunnr = wa2-kunnr
                                       name = wa2-name. 
Diesen Befehl gibt es nicht.
Den hast du wahrscheinlich gemeint:
DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.
Und logisch auch falsch:
Es wird die Tabellenzeile mit den Schlüsselwerten k1 = v1 ....kn = vn gelöscht. Falls es mehrere Tabellenzeilen mit den angegebenen Schlüsselwerten gibt, wird nur die erste Tabellenzeile gelöscht... und außerdem: Bei der Schlüsselangabe muß der Tabellenschlüssel vollständig mit Werten versehen werden.
Hauptproblem: Es werden nicht alle doppelten Einträge gelöscht, nur einer.

Falls der Befehl
DELETE ADJACENT DUPLICATES FROM itab
       [COMPARING f1 f2 | COMPARING ALL FIELDS]
nicht benutzt werden kann (wenn z.B. die itab nach den Vergleichsfeldern nicht sortiert werden kann, es werden nämlich nur nachfolgende Dubletten gelöscht) dann würde ich folgendes vorschlagen:

DATA f_tabix TYPE sytabix.

LOOP AT itab INTO itab_wa1. 
 f_tabix = sy-tabix + 1.
 LOOP AT itab INTO itab_wa2 FROM f_tabix
             WHERE kunnr = itab_wa1-kunnr
                  AND name = itap_wa1-name.
    WRITE: / 'Doppelter Eintrag:' , itab_wa2-kunnr, itab_wa2-name.
    DELETE TABLE itab FROM itab_wa2.
 ENDLOOP.
ENDLOOP.

Viel Erfolg u. beste Grüße