Dubletten herausfinden

Getting started ... Alles für einen gelungenen Start.
17 Beiträge Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

Dubletten herausfinden

Beitrag von L0w-RiDer (Specialist / 103 / 10 / 1 ) » 14. Mär 2019 08:45

Hallo zusammen,

ich habe ein Programm geschrieben, welches mir Kreditoren-Dubletten heraussuchen soll. Nun kommt es leider vor, dass es mir unterschiedliche Ergebnisse ausgibt. Der Fehler liegt hier in folgendem Codefragment (siehe unten). Ich führe es ein Mal aus und es gibt mir 120 Einträge, beim nächsten Mal vielleicht 135 usw. Kann da jemand erkennen wo der Fehler liegt? Hat jemand sonst Vorschläge für eine Alternative wie man das programmieren könnte?

Vielen Dank im Voraus.
Zuletzt geändert von L0w-RiDer am 14. Mär 2019 21:28, insgesamt 1-mal geändert.


Re: Dubletten herausfinden

Beitrag von nikibert (ForumUser / 78 / 3 / 0 ) » 14. Mär 2019 10:16

Hi,

habe nun grad kein System zur Hand, hatte kuerzlich aber nach selbiger Fragestellung gesucht und folgende Diskussion gefunden:
https://www.abapforum.com/forum/viewtop ... 5&start=15

Vielleicht hilft es dir ja weiter!

Gruss
nikibert

Re: Dubletten herausfinden

Beitrag von qyurryus (ForumUser / 20 / 18 / 4 ) » 14. Mär 2019 11:36

L0w-RiDer hat geschrieben:Hallo zusammen,

ich habe ein Programm geschrieben, welches mir Kreditoren-Dubletten heraussuchen soll. Nun kommt es leider vor, dass es mir unterschiedliche Ergebnisse ausgibt. Der Fehler liegt hier in folgendem Codefragment (siehe unten). Ich führe es ein Mal aus und es gibt mir 120 Einträge, beim nächsten Mal vielleicht 135 usw. Kann da jemand erkennen wo der Fehler liegt? Hat jemand sonst Vorschläge für eine Alternative wie man das programmieren könnte?

Vielen Dank im Voraus.

Code: Alles auswählen.

  LOOP AT gt_join INTO gs_join.
    IF sy-tabix = 1.
      gs_merk = gs_join.
    ELSE.
      IF gs_merk-iban = gs_join-iban
        AND gs_merk-tabkey <> gs_join-tabkey
        AND gs_merk-bukrs = gs_join-bukrs.
        IF lv_hilf <> 1.
          MESSAGE 'Doppelte IBAN-Nummer wurde gefunden!' TYPE 'I'
          DISPLAY LIKE 'I'.
          lv_hilf = 1.
        ENDIF.
        shift gs_merk-tabkey left DELETING LEADING '0'.
        shift gs_join-tabkey left DELETING LEADINg '0'.
        APPEND gs_merk TO gt_ausgabe.
        APPEND gs_join TO gt_ausgabe.
      ELSE.
        gs_merk = gs_join.
      ENDIF.
    ENDIF.
  ENDLOOP.
Du vergleichst mit deiner Methodik nur Tabellenzeilen, die direkt nebeneinander sind. Damit das funktioniert, müsste die Tabelle erst nach den Schlüsseln sortiert werden. Ob das passiert ist aus diesem Coding-Schnipsel nicht ersichtlich.
Außerdem könntest du für die Ausgabe der Message nach dem loop einfach abfragen, ob gt_ausgabe nicht leer ist, statt es im Loop und mit der Hilfsvariable zu tun.

Re: Dubletten herausfinden

Beitrag von a-dead-trousers (Top Expert / 3206 / 81 / 795 ) » 14. Mär 2019 12:28

In Anlehnung an qyurryus Antwort:
Wenn die Inhalte in 'gt_join' direkt aus der Datenbank stammen, ist die Sortierung, sofern kein ORDER BY oder SORT verwendet wurde, nicht gesichert.
Bei Verwendung der HanaDB ist das immer der Fall und bei Oracle leider hin und wieder auch. Der Name 'gt_join' lässt einen Datenbank-Join vermuten und da ist die Sortierung nach dem Primary Key (default in Oracle) nur schwer bis gar nicht möglich.
Wir haben daher schon vor geraumer Zeit (auch weil die Hana-Umstellung anstand) begonnen unsere Programme nach fehlenden SORT oder ORDER BY zu durchsuchen und korrigieren.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Dubletten herausfinden

Beitrag von black_adept (Top Expert / 3234 / 54 / 563 ) » 14. Mär 2019 17:25

a-dead-trousers hat geschrieben:IWir haben daher schon vor geraumer Zeit (auch weil die Hana-Umstellung anstand) begonnen unsere Programme nach fehlenden SORT oder ORDER BY zu durchsuchen und korrigieren.
Alle oder nur die wo die nachfolgende Verarbeitung auf einer Sortierung beruht? Ich kenne hinreichend viele Fälle, wo einfach eine Liste abgearbeitet werden muss - egal wie die Sortierung ist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dubletten herausfinden

Beitrag von ralf.wenzel (Top Expert / 3399 / 147 / 218 ) » 15. Mär 2019 05:56

Sry, aber ein Variablenname wie „gt_join“ gehört verboten. Man sieht ja hier schon, dass gerätselt wird darüber, was da wohl drinstehen könnte. Aber Hauptsache, „gt_“ steht davor....


Ralf *sieht sich mal wieder belegt

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
DeathAndPain


Re: Dubletten herausfinden

Beitrag von Thomas R. (Expert / 681 / 31 / 27 ) » 15. Mär 2019 06:35

join als Name wäre aber auch nicht besser.... :D

MfG
Thomas R.

Re: Dubletten herausfinden

Beitrag von ralf.wenzel (Top Expert / 3399 / 147 / 218 ) » 15. Mär 2019 06:46

Nein, aber „gt_“ wird gern empfohlen, macht den Namen aber nix besser.


Ralf

Re: Dubletten herausfinden

Beitrag von a-dead-trousers (Top Expert / 3206 / 81 / 795 ) » 15. Mär 2019 07:36

black_adept hat geschrieben:Alle oder nur die wo die nachfolgende Verarbeitung auf einer Sortierung beruht? Ich kenne hinreichend viele Fälle, wo einfach eine Liste abgearbeitet werden muss - egal wie die Sortierung ist.
Sagen wir mal so: Ziemlich viele. :x
Sicher ist sicher.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Dubletten herausfinden

Beitrag von DeathAndPain (Top Expert / 1038 / 119 / 227 ) » 15. Mär 2019 10:51

Ich habe mir sogar angewöhnt, bei Tabellen, bei denen ich keinerlei Sortierung brauche, in der Deklaration explizit WITH EMPTY KEY anzugeben. Das spart eine unbedeutende Anzahl Bytes, hebt aber besonders hervor, dass ich mir Gedanken gemacht habe. Und Schlüssel bei Standardtabellen sind eine ziemlich nutzlose Sache. Die kann man eigentlich nur bei COLLECT brauchen. Oder bei AT/ENDAT - aber dafür muss die Tabelle dann doch wieder nach dem Schlüssel sortiert werden.

Leider hat die SAP diesen netten Zusatz nicht kompatibel zu Konstrukten wie Funktionsbausteinen gemacht. Die können in ihren TABLES-Parametern zwar nur Standardtabellen, aber wenn man denen als TABLES-Parameter eine interne Tabelle übergibt, die WITH EMPTY KEY definiert ist, dann kommt es zu einem Dump. Ich weiß, TABLES-Parameter gelten schon seit ewigen Zeiten als obsolet, aber jeder, der noch mit FBs arbeitet, benutzt sie, die SAP eingeschlossen. Dass man da keine Tabellen WITH EMPTY KEY übergeben kann, halte ich für eine schon mutwillige Schikane. Sie haben den CALL FUNCTION-Befehl ja auch kompatibel zu VALUE #( ) gemacht.

Re: Dubletten herausfinden

Beitrag von ralf.wenzel (Top Expert / 3399 / 147 / 218 ) » 15. Mär 2019 11:45

Ich würde nicht immer gleich Böswilligkeit unterstellen. Jeder, der schonmal große IT-Projekte gemacht hat, weiß, wie schwierig es ist, große Teams optimal zu administrieren.


Ralf

Re: Dubletten herausfinden

Beitrag von L0w-RiDer (Specialist / 103 / 10 / 1 ) » 15. Mär 2019 17:14

Also es geht darum, dass ich Kreditor-Dubletten herausfischen möchte. Die gleiche IBAN-Nummer hat unterschiedliche TABKEY im gleichen Buchungskreis. So z.B.

IBAN : 7888900 Tabkey : 790 Buchungskreis: 0010
IBAN: 7888900 Tabkey: 450 Buchungskreis: 0010.

Hat jemand eine Idee so etwas elegant zu lösen? Meine Schleife funktioniert an sich schon, bloß irgendwo ist ein Fehler drin, da ich einmal 320 Treffer bekommen und wenn ich es noch mal ausführe nur 308 z.B. usw.

Re: Dubletten herausfinden

Beitrag von L0w-RiDer (Specialist / 103 / 10 / 1 ) » 18. Mär 2019 10:54

Ja, gt_join ist ein DB-Join über 3 DB-Tabellen. Ich sortierte davor auf iban und bukrs, da ich ja alle doppelten IBAN-Nummern die verschiedene Tabkeys haben im gleichen Buchungskreis herausfinden möchte.

Hat da einer ne Idee?

Re: Dubletten herausfinden

Beitrag von a-dead-trousers (Top Expert / 3206 / 81 / 795 ) » 18. Mär 2019 11:19

L0w-RiDer hat geschrieben:Ja, gt_join ist ein DB-Join über 3 DB-Tabellen. Ich sortierte davor auf iban und bukrs, da ich ja alle doppelten IBAN-Nummern die verschiedene Tabkeys haben im gleichen Buchungskreis herausfinden möchte.

Hat da einer ne Idee?
Hi.

Das ist jetzt ein wild-quess:
Hab mir dein Coding nochmal durchgesehen. Innerhalb deiner IF-Abfrage veränderst du den Tabkey von gs_merk. Da die Sortierung den Tabkey laut deiner Aussage ja nicht einschließt, ist die Abfolge der Tabkeys innerhalb der Schleife bei mehreren verschiedenen Aufrufen des Programms nicht konsistent und könnte dafür verantwortlich sein, dass die Ergebnismenge so schwankt. Durch das Löschen der führenden Nullen könnte einmal der nächste Datensatz in gs_join mit gs_merk zusammenpassen und beim nächsten Lauf mit einer anderen Reiehenfolge wiederum nicht. Versuch mal als schnellen Test den Tabkey in die Sortierung mitaufzunehmen um zu prüfen ob dann die Schwankung in der Ergebnismenge nicht mehr auftritt. Ob das Programm damit insgesamt korrekt arbeitet ist aber nicht gesagt, weil du ja den Vergleichswert während des Vergleiches veränderst.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Dubletten herausfinden

Beitrag von ewx (Top Expert / 3941 / 161 / 359 ) » 18. Mär 2019 11:47

Das wäre mal eine schöne Aufgabe, bei der man den TDD-Ansatz (Test Driven Development) sinnvoll ausprobieren könnte.
Mit übersichtlichen, selbst zusammengestellten Testdaten.
(Diese kann man dann nämlich auch gut debuggen.)
Zusätzlich die Frage: Was soll die Methode eigentlich liefern?
  • Info, dass Dubletten vorhanden sind?
  • Info, wie viele Dubletten vorhanden sind?
  • Anzeige des jeweils doppelten/ mehrfach vorhandenen Einträge?
  • Anzeige aller doppelten/ mehrfach vorhandenen Einträge?

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
ralf.wenzelmoo_jo


Seite 1 von 2 (current) Nächste

Aktuelle Forenbeiträge

FuBa Datum -> Quartal
jetzt von DeathAndPain 4 / 40
Meldungsnr. TK332 nur in lokalen Aufträgen bearbeiten
vor 2 Stunden von autohandel7 5 / 39
ABAP Clean Code
vor 20 Stunden von ralf.wenzel 48 / 1120

Unbeantwortete Forenbeiträge

Kundenhierarchien in der Preisfindung
Gestern von SAP_ENTWICKLER 1 / 31
[GELÖST] Feld KNVV-BOIDT
vor 6 Tagen von SAP_ENTWICKLER 1 / 60
Sortierbegriffe einer Stückliste ändern
vor einer Woche von mbiesenb 1 / 46
Feiertagsklasse und Lohnart Verknüpfung entfernen
vor einer Woche von Flashtie 1 / 46