Dublettenprüfung

Getting started ... Alles für einen gelungenen Start.
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Dublettenprüfung

Beitrag von esra (ForumUser / 6 / 2 / 0 ) »
Hallo zusammen,

im Praktikum habe ich die Aufgabe bekommen Dubletten in der Tabelle KNA1 (über 60 000 Datensätze) zu finden. Ich habe erst eine kleiner tabelle ZDUBLETTE angelegt mit 20 Einträgen und dann folgendes programmiert:

TABLES: ZDUBLETTE.

DATA:
l_name1 TYPE zdublette-name1,
l_pstlz TYPE zdublette-pstlz,
l_stras TYPE zdublette-stras,
it_zdublette TYPE TABLE OF zdublette.

FIELD-SYMBOLS: <zdublette> TYPE zdublette.

SELECT * FROM zdublette INTO TABLE it_zdublette
WHERE name1 IN NAME
AND pstlz IN PLZ
AND stras IN STRASSE.

SORT it_zdublette BY name1 ASCENDING.

LOOP AT it_zdublette ASSIGNING <zdublette>.

FORMAT COLOR OFF.

IF: <zdublette>-name1 = l_name1
AND <zdublette>-pstlz = l_pstlz
AND <zdublette>-stras = l_stras.
WRITE:/ <zdublette>-name1, <zdublette>-pstlz, <zdublette>-stras.
ENDIF.

l_name1 = <zdublette>-name1.
l_pstlz = <zdublette>-pstlz.
l_stras = <zdublette>-stras.

ENDLOOP.

Drücke ich dann auf F8 bekomme ich folgende Ausgabe:

Dr. Martin Depner 20201 Seestr. 10
Dr. Martin Depner 20201 Seestr. 10
Dr. Martin Depner 20201 Seestr. 10
Müller 10000 Hauptstr. 1

das ist ja gut soweit die Dubletten habe ich ja. Nur ich will nicht nur die doppelten Einträge anzeigen, sonder mit den Dubletten auch die nicht Dublette. Genauer erläutert es gibt in der Tabelle vier mal den Dr. Martin Depner das Programm soll mir alle 4 anzeigen.

Kann mir vielleicht jemand helfen? Dankeschön im Voraus.

esra

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Dublettenprüfung

Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
Moin esra,
hier meine Lösung:
1. Tabelle ztest angelegt:

Code: Alles auswählen.

F1     F2        F3

001	HIER	22
002	HIER	23
003	HIER	22
004	DORT	99
005	DA	21
006	DA	22
007	HIER	22
008	HIER	23
und dazu folgendes Coding:

Code: Alles auswählen.

REPORT  ztest10.

DATA: BEGIN OF it_data OCCURS 0,
      f2(10),
      f3(10),
      END OF it_data.

DATA: it_test TYPE TABLE OF ztest WITH HEADER LINE.
DATA i TYPE i.

SELECT DISTINCT f2 f3 FROM ztest INTO TABLE it_data.

LOOP AT it_data.

  SELECT * FROM ztest INTO TABLE it_test
  WHERE f2 = it_data-f2 AND f3 = it_data-f3.

  i = LINES( it_test ).

  IF i > 1.
    LOOP AT it_test.
      WRITE :/ it_test-f1,it_test-f2,it_test-f3.
    ENDLOOP.
  ENDIF.


ENDLOOP.
das Ergebnis:

Code: Alles auswählen.

DISTINCT Test

001        HIER       22
003        HIER       22
007        HIER       22
002        HIER       23
008        HIER       23
gruß TRon
(übernimm nicht die Geschichte mit den Kopfzeilen ..obsolet)

Folgende Benutzer bedankten sich beim Autor Tron für den Beitrag:
esra

<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Dublettenprüfung

Beitrag von esra (ForumUser / 6 / 2 / 0 ) »
Hallo Tron,

dankeschön deine Lösung hat geklappt. Nur habe ich jetzt noch ein Problem. Noch einmal meine Tabelle zdublette:

Müller Hauptstr. 10 82211
Müller Hauptstr. 10 82211
Mueller Hauptstraße 10 82211
Maier Berliner Straße 11 78456

Dubletten sind hier:

Müller Hauptstr. 10 82211
Müller Hauptstr. 10 82211
Mueller Hauptstraße 10 82211


also so möchte ich das haben, dass das Programm mir Mueller Hauptstraße 10 auch als Dublette erkennt.
Dazu muss ich Zeichenketten vergleichen oder? Die unscharfe Suche vermute ich nur habe ich aber keine Ahnung wie ich das machen soll??? Ne idee? Dankeschön.

LG

esra

Re: Dublettenprüfung

Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
Moin esra,
in der "neuen Herausforderung" hat man nur die Möglichkeit mit Suchmustern zu arbeiten.
Dazu fertigt man aus einem zu durchsuchenden Block eine zweite interne Tabelle (Kopie) an und bereitet Diese pro Feld wie folgt auf :
1. Entfernen aller Leerzeichen in einem Feld.
2. Umwandeln in Großbuchstaben.
3. Ersetzten aller Umlaute (inkl. "ß").
Nach meiner Methodik wird dann die kleinste, halbe Stringlänge plus 1 ermittelt, da z.B Hauptstr. und Hauptstrasse unterschiedlich lang sind.
Daraus ergibt sichz.B.: für Hauptstr. = Länge = (9/2) + 1 = 5 . Somit lautet das Suchmuster HAUPT

Die Tabelle
Bild
Der Tabelleninhalt:
Bild

Das Programm
  • *&---------------------------------------------------------------------*
    *& Report ZDUBLETTEN_FIND *
    *& *
    *&---------------------------------------------------------------------*
    *& *
    *& *
    *&---------------------------------------------------------------------*

    REPORT zdubletten_find.

    TYPES: BEGIN OF ty_dist ,
    housenum TYPE ad_hsnm1,
    zip TYPE ad_pstcd1,
    END OF ty_dist.

    DATA: ls_dist TYPE ty_dist,
    lt_dist TYPE TABLE OF ty_dist.

    DATA: ls_res TYPE zdublette,
    lt_res TYPE TABLE OF zdublette,
    lt_tmp TYPE TABLE OF zdublette.

    DATA i TYPE i.

    SELECT DISTINCT housenum zip FROM zdublette INTO TABLE lt_dist.

    LOOP AT lt_dist INTO ls_dist.
    SELECT * FROM zdublette INTO TABLE lt_res WHERE
    housenum = ls_dist-housenum AND zip = ls_dist-zip.
    i = LINES( lt_res ).
    IF i > 1.
    PERFORM compact.
    ENDIF.
    ENDLOOP.

    RETURN.

    *&---------------------------------------------------------------------*
    *& Form compact
    *&---------------------------------------------------------------------*
    * text
    *----------------------------------------------------------------------*
    FORM compact.

    FIELD-SYMBOLS <s> TYPE zdublette.

    DATA: lv_min1 TYPE i,
    lv_min2 TYPE i.

    DATA: lt_tmp2 TYPE TABLE OF zdublette,
    ls_tmp TYPE zdublette.


    lt_tmp[] = lt_res[].

    LOOP AT lt_tmp ASSIGNING <s>.
    CONDENSE <s>-name NO-GAPS.
    TRANSLATE <s>-name TO UPPER CASE.
    REPLACE ALL OCCURRENCES OF 'Ä' IN <s>-name WITH 'AE'.
    REPLACE ALL OCCURRENCES OF 'Ö' IN <s>-name WITH 'OE'.
    REPLACE ALL OCCURRENCES OF 'Ü' IN <s>-name WITH 'UE'.
    REPLACE ALL OCCURRENCES OF 'ß' IN <s>-name WITH 'SS'.
    i = STRLEN( <s>-name ).
    IF lv_min1 = 0 OR i < lv_min1.
    lv_min1 = i.
    ENDIF.

    CONDENSE <s>-street NO-GAPS.
    TRANSLATE <s>-street TO UPPER CASE.
    REPLACE ALL OCCURRENCES OF 'Ä' IN <s>-street WITH 'AE'.
    REPLACE ALL OCCURRENCES OF 'Ö' IN <s>-street WITH 'OE'.
    REPLACE ALL OCCURRENCES OF 'Ü' IN <s>-street WITH 'UE'.
    REPLACE ALL OCCURRENCES OF 'ß' IN <s>-street WITH 'SS'.
    i = STRLEN( <s>-street ).
    IF lv_min2 = 0 OR i < lv_min2.
    lv_min2 = i.
    ENDIF.
    ENDLOOP.

    lv_min2 = 1 + ( lv_min2 / 2 ).
    lv_min1 = 1 + ( lv_min1 / 2 ).

    lt_tmp2[] = lt_tmp[].

    LOOP AT lt_tmp2 ASSIGNING <s>.
    <s>-name = <s>-name(lv_min1).
    <s>-street = <s>-street(lv_min2).
    ENDLOOP.

    SORT lt_tmp2 BY name street.
    DELETE ADJACENT DUPLICATES FROM lt_tmp2 COMPARING name street.

    LOOP AT lt_tmp2 ASSIGNING <s>.
    WRITE:/.
    ULINE.
    LOOP AT lt_tmp INTO ls_res.
    IF ls_res-name(lv_min1) = <s>-name AND ls_res-street(lv_min2) = <s>-street.

    READ TABLE lt_res INTO ls_tmp WITH KEY id = ls_res-id .
    WRITE :/ ls_res-id,ls_tmp-id,ls_res-name,ls_tmp-name,ls_res-street,ls_tmp-street.

    ENDIF.
    ENDLOOP.
    ENDLOOP.

    ENDFORM. "compact
Das Ergebnis sieht dann wie folgt aus:
Bild

(hoffe Du steigst da durch)


Sollten wir uns nicht einmal ernsthaft die Frage stellen: Warum entstehen überhaupt Dopplungen und ist es nicht erforderlich, alles zu unternehmen, Dopplungen zu verhindern ?!

gruß TRon

Folgende Benutzer bedankten sich beim Autor Tron für den Beitrag:
esra

<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Dublettenprüfung

Beitrag von esra (ForumUser / 6 / 2 / 0 ) »
Hallo Tron,

dankeschön! Das werde ich jetzt gleich probieren. Ich hoffe auch das ich da durch steige:-) so einfach ist die Geschichte nicht für mich. Zurzeit befinde ich mich im Praxissemester. Das Unternehmen in der ich grad bin hat einen SAP System, das 10 Jahre alt ist. In der Tabelle KNA1 sind sehr viele Dubletten drin. Was unsere IT-Abteilung jetzt machen möchte ist, alle Dubletten finden, bereinigen und die in Zukunft vermeiden. Diese Aufgabe hab ich jetzt bekommen, was für mich als unerfahrene Person im Bereich SAP nicht so einfach ist. Dubletten sind bei uns im System durch Datenmigration und durch doppelte Eingabe der Kundendaten in den jeweiligen Abteilunden entstanden. Es gibt so Drittanbieter SW was ich so gegooglt habe. Weiß aber nicht ob die gut sind. Schön wäre es wenn SAP selbst eine Funktion im System hätte was wir verwenden können oder ein Produkt was wir kaufen können.
Was glaubst du? Wie könnten wir in Zukunft Dubletten verhindern? Erst müssen wir natürlich bereinigen:-(

Danke für deine Hilfe.

LG

esra

Re: Dublettenprüfung

Beitrag von esra (ForumUser / 6 / 2 / 0 ) »
Also ich habe es versucht und es klappt mit meiner Tabelle zdublette :D und hoffe das es auch mit KNA1 klappt.
Vielen Dank noch einmal für deine Hilfe.

LG

Re: Dublettenprüfung

Beitrag von esra (ForumUser / 6 / 2 / 0 ) »
Hallo Tron,

dein Programm funktioniert super mit beiden Tabellen (zdublette, kna1). Nur einen kleinen Problem habe ich noch. Zum Beispiel wird der Kunde
Hauser, Seestraße.1 , 82211 und Kunde Hauser, Münchnestr. 14, 82211 (Tabelle zdublette) angezeigt. Beide werden in der Ausgabe getrennt, weil es keine Dubletten sind. Gibt es aber eine Möglichkeit, diese in der Ausgabeliste garnicht anzuzeigen? Ich habe selbst die letzte Zeit versucht komme aber nicht weiter.
Dankeschön!

LG

esra

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.