TRY-CATCH für Blockinsert

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

TRY-CATCH für Blockinsert

Beitrag von 3xplor3r (ForumUser / 2 / 0 / 0 ) »
Hallo,

ich arbeite an einer rekursiven Belegflussselektion, die in der 2. Version auch problemlos funktioniert. Der Nachteil ist, dass ich sortierte interne Tabellen mit non-unique key nutze, die ich immer wieder um doppelte Einträge bereinige. Diese Schritt möchte ich eigentlich einsparen.

Ich versuchte eine TRY-CATCH Anweisung, um über die Ausnahmeklasse cx_sy_itab_duplicate_key. Der Insert dient zum Wegschreiben bereits rekursiv bearbeiteter Sätze in eine sortierte unique key Prüftabelle.

Code: Alles auswählen.

TRY.
  INSERT LINES OF zgt_tb_a_vbfk
    FROM zgv_tb_idx0 TO zgv_tb_idx1
    USING KEY primary_key
    INTO TABLE zgt_tb_h_vbfk.
  CATCH cx_sy_itab_duplicate_key INTO oref.
    text = oref->get_text( ).
  ENDTRY.
Beim Einfügen bekomme ich dann einen DUMP wegen doppelter Schlüssel.

Die grundsätzliche Frage ist erst einmal, wie ich doppelte Schlüssel bei Blockinserts abfangen kann. Bei einem doppelten Schlüssel soll einfach gar nichts geschehen und der nächste Satz prozessiert werden. Sollte die Antwort sein, dass dies nicht möglich ist, frage ich mich, warum im DUMP der Schlüssel angegeben ist, der zu duplikativen Sätzen führt. Daraus folgt für mich, dass diese Sätze sehr wohl erkennbar sind.

LG

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


Re: TRY-CATCH für Blockinsert

Beitrag von JHM (Top Expert / 1188 / 1 / 195 ) »
3xplor3r hat geschrieben:Die grundsätzliche Frage ist erst einmal, wie ich doppelte Schlüssel bei Blockinserts abfangen kann. Bei einem doppelten Schlüssel soll einfach gar nichts geschehen und der nächste Satz prozessiert werden. Sollte die Antwort sein, dass dies nicht möglich ist, frage ich mich, warum im DUMP der Schlüssel angegeben ist, der zu duplikativen Sätzen führt. Daraus folgt für mich, dass diese Sätze sehr wohl erkennbar sind.
Die F1-Hilfe im Editor beschreibt das Verhalten doch ausreichend:
F1-Hilfe hat geschrieben: 1. Wenn beim Versuch eine Einzelzeile über den Primärschlüssel einzufügen, Duplikate betreffs des eindeutigen Primärschlüssels entstehen würden, wird keine Zeile eingefügt und sy-subrc auf den Wert 4 gesetzt.


2. Wenn bei einem Versuch eine Einzelzeile über den Schlüssel oder den Index einzufügen, Duplikate betreffs eines eindeutigen Sekundärschlüssels entstehen würden, wird eine behandelbare Ausnahme der Klasse CX_SY_ITAB_DUPLICATE_KEY ausgelöst.


3. Wenn beim Versuch eine einzelne Zeile über einen Index oder mehrere Zeilen als Block einzufügen, Duplikate betreffs eines eindeutigen Primär- oder Sekundärschlüssels entstehen würden, kommt es zu einem Laufzeitfehler.
Eine Schleife über die Quell-ITAB und dann jeden Einzelsatz in die Ziel-ITAB einfügen würde das Problem also lösen.
Gruß Hendrik

Re: TRY-CATCH für Blockinsert

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Ich wuerde versuchen an dem Punkt anzusetzen, wo die doppelten Saetze in die interne Tabellen kommen und dort erst gar keine doppelten Saetze in die interne Tabelle einfuegen.
Damit hast Du auch den Schritt gespart immer wieder die interne Tabelle um die doppelten Eintraege zu bereinigen.

Warum ist die interne Tabelle ohne unique key? Anscheinend gibt es den doch bzw. koennte es den doch geben?!?!

Re: TRY-CATCH für Blockinsert

Beitrag von 3xplor3r (ForumUser / 2 / 0 / 0 ) »
Eine Schleife über die Quell-ITAB und dann jeden Einzelsatz in die Ziel-ITAB einfügen würde das Problem also lösen.
Die F1-Hilfe ist mir des Inhaltes bekannt. Ich habe nach einer Lösungsmöglichkeit gefragt, die es offensichtlich nicht gibt. Ein einzelner Insert ist zu kostspielig.
Ich wuerde versuchen an dem Punkt anzusetzen, wo die doppelten Saetze in die interne Tabellen kommen und dort erst gar keine doppelten Saetze in die interne Tabelle einfuegen.
Damit hast Du auch den Schritt gespart immer wieder die interne Tabelle um die doppelten Eintraege zu bereinigen.

Warum ist die interne Tabelle ohne unique key? Anscheinend gibt es den doch bzw. koennte es den doch geben?!?!
In der Belegflusstabelle sind die Positionen mit hinterlegt. Hier ist eine potentielle Quelle doppelter Schlüssel, die ich mittlerweile über die GROUP BY Klausel ausschließe. Allerdings kann man nicht feststellen, ob bspw. eine Teillieferung, die einen gemeinsamen Auftrag haben, Ergebnis der rekursiven Selektion sind. Daher kann es bei den verschiedenen Durchläufen zu einer Mehrfachselektion bereits selektierter Aufträge und damit zu doppelten Schlüsseln kommen.

LG

Re: TRY-CATCH für Blockinsert

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
3xplor3r hat geschrieben:...
Beim Einfügen bekomme ich dann einen DUMP wegen doppelter Schlüssel.

Die grundsätzliche Frage ist erst einmal, wie ich doppelte Schlüssel bei Blockinserts abfangen kann. Bei einem doppelten Schlüssel soll einfach gar nichts geschehen und der nächste Satz prozessiert werden. Sollte die Antwort sein, dass dies nicht möglich ist, frage ich mich, warum im DUMP der Schlüssel angegeben ist, der zu duplikativen Sätzen führt. Daraus folgt für mich, dass diese Sätze sehr wohl erkennbar sind.
Weil dir nur das 1. Duplikat angezeigt wird, aber nicht geprüft wird, ob es weitere Duplikate gibt.
3xplor3r hat geschrieben:.... Ein einzelner Insert ist zu kostspielig.
So, so. Könntest du mal genauer erläutern, wo du diese Information her hast?
Und warum ein hypothetisch im Kernel implementierter Blockinsert nicht genau das selbe Problem hätte? Denn hier scheinst du bereit solch kostspielige Inserts zu akzeptieren?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

4
Antw.
1669
Views
Aus Catch zurückkehren
von ostpower » 21.07.2014 14:21 • Verfasst in ABAP® für Anfänger
1
Antw.
983
Views
TRY CATCH RETRY ENDTRY
von SAP_ENTWICKLER » 09.02.2015 12:16 • Verfasst in ABAP® Core
6
Antw.
7952
Views
Fehler bei CATCH-Abfangung
von STDIN » 02.04.2020 12:48 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Zugriff auf Daten via Webdav
vor einer Stunde von msfox 2 / 36
Interne Tabelle
vor 18 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

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.

Aktuelle Forenbeiträge

Zugriff auf Daten via Webdav
vor einer Stunde von msfox 2 / 36
Interne Tabelle
vor 18 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141