gelöst Dubletten herausfinden


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Dubletten herausfinden

Beitragvon L0w-RiDer » 14.03.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.03.2019, 21:28, insgesamt 1-mal geändert.
L0w-RiDer
ForumUser
 
Beiträge: 63
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Dubletten herausfinden

Beitragvon nikibert » 14.03.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/viewtopic.php?f=1&t=16475&start=15

Vielleicht hilft es dir ja weiter!

Gruss
nikibert
nikibert
ForumUser
 
Beiträge: 78
Registriert: 31.10.2007, 14:02
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Dubletten herausfinden

Beitragvon qyurryus » 14.03.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.
qyurryus
ForumUser
 
Beiträge: 15
Registriert: 27.08.2018, 12:12
Dank erhalten: 3 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon a-dead-trousers » 14.03.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
a-dead-trousers
Top Expert
 
Beiträge: 3181
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon black_adept » 14.03.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
black_adept
Top Expert
 
Beiträge: 3198
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 560 mal
Ich bin: Freiberufler/in

Re: Dubletten herausfinden

Beitragvon ralf.wenzel » 15.03.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

Für diese Nachricht hat ralf.wenzel einen Dank bekommen :
DeathAndPain
ralf.wenzel
Top Expert
 
Beiträge: 3374
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 213 mal
Ich bin: Freiberufler/in

Re: Dubletten herausfinden

Beitragvon Thomas R. » 15.03.2019, 06:35

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

MfG
Thomas R.
Thomas R.
Expert
 
Beiträge: 676
Registriert: 11.12.2002, 08:04
Dank erhalten: 26 mal

Re: Dubletten herausfinden

Beitragvon ralf.wenzel » 15.03.2019, 06:46

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


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3374
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 213 mal
Ich bin: Freiberufler/in

Re: Dubletten herausfinden

Beitragvon a-dead-trousers » 15.03.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
a-dead-trousers
Top Expert
 
Beiträge: 3181
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon DeathAndPain » 15.03.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.
DeathAndPain
Expert
 
Beiträge: 972
Registriert: 05.05.2006, 10:14
Dank erhalten: 222 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon ralf.wenzel » 15.03.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
ralf.wenzel
Top Expert
 
Beiträge: 3374
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 213 mal
Ich bin: Freiberufler/in

Re: Dubletten herausfinden

Beitragvon L0w-RiDer » 15.03.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.
L0w-RiDer
ForumUser
 
Beiträge: 63
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon L0w-RiDer » 18.03.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?
L0w-RiDer
ForumUser
 
Beiträge: 63
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon a-dead-trousers » 18.03.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
a-dead-trousers
Top Expert
 
Beiträge: 3181
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in

Re: Dubletten herausfinden

Beitragvon ewx » 18.03.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?

Für diese Nachricht hat ewx 2 Dankeschön bekommen :
moo_jo, ralf.wenzel
ewx
Top Expert
 
Beiträge: 3885
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 343 mal

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
Steuerliches Abgangsland in Verkaufsbeleg ändern
vor 4 Stunden von Julia611 0 Antw.
XML hochladen, Abschnitte suchen, Abschnitte als XML zurück
vor 3 Stunden von deejey 1 Antw.
(LKW)Bedarfsvorschau je Debitor
vor 2 Tagen von wreichelt 5 Antw.
Lieferplan, Einteilungen, Feinabrufe
vor 3 Tagen von bapimueller 0 Antw.
gelöst Smartforms Struktur rechtsbündig
vor 3 Tagen von qyurryus 3 Antw.

  Ähnliche Beiträge beta
Dubletten
08.12.2006, 09:27 von DeathGuardian 2 Antw.
Dubletten
25.07.2011, 09:03 von Tron 8 Antw.
Tabellennamen herausfinden
30.05.2005, 12:03 von MichaelP 8 Antw.
Primärschlüssel herausfinden
31.10.2007, 16:21 von m.schwertle 3 Antw.
Tabellennamen herausfinden
07.09.2011, 18:57 von black_adept 2 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder