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

Der Tabelleninhalt:
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:
(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
<:: 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.