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 / 1197 / 1 / 197 ) »
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 / 4099 / 128 / 941 ) »
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.
1765
Views
Aus Catch zurückkehren
von ostpower » 21.07.2014 14:21 • Verfasst in ABAP® für Anfänger
1
Antw.
1063
Views
TRY CATCH RETRY ENDTRY
von SAP_ENTWICKLER » 09.02.2015 12:16 • Verfasst in ABAP® Core
6
Antw.
8171
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

Regex in where
vor 18 Stunden von tar 8 / 364
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1636
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 285
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 528

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

Regex in where
vor 18 Stunden von tar 8 / 364
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1636
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 285
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 528

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 2 Tagen von snooga87 1 / 221
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 3403
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9953