Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von Armin93 (ForumUser / 35 / 10 / 0 ) »
Hallo zusammen,

wie der Titel schon sagt würde ich gerne eine Datenbanktabelle befüllen.

Ich habe dieses Befehl dafür verwendet :

Code: Alles auswählen.

loop at itab2.
  INSERT zzsd_aufbestand FROM TABLE itab2.
  ENDLOOP.
Leider bekomme ich immer eine Laufzeitfehlermeldung mit folgender Analyse :

Es ist eine Ausnahme aufgetreten, die weiter unten näher erläutert wird.
Die Ausnahme, der die Klasse 'CX_SY_OPEN_SQL_DB' zugeordnet ist,
wurde in der Prozedur "GET_DATA" "(FORM)" weder abgefangen,
noch durch eine RAISING-Klausel propagiert.
Da der Aufrufer der Prozedur nicht mit dem Auftreten der Ausnahme
rechnen konnte, wurde das laufende Programm abgebrochen.
Der Grund für die Ausnahme ist:
Bei einem Open SQL-Array-Insert führt der Versuch, einen Satz in die
Datenbanktabelle "ZZSD_AUFBESTAND" einzufügen, zum Abbruch, wenn ein Satz mit
gleichem Schlüssel bereits existiert.


(Beim Open SQL-Einzelsatz-Insert wird in derselben Fehlersituation
nicht abgebrochen, sondern SY-SUBRC auf 4 gesetzt.)


Was kann ich hier machen ?

Vielen Dank im vorraus



LG Armin

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


Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von M@atze! (ForumUser / 92 / 6 / 21 ) »
Hi Armin,

wie in der Fehlerbeschreibung erwähnt wird versucht ein Datensatz
auf die DB zu schreiben welcher (mit gleichen Schlüsselfeldern) bereits vorhanden ist.

Mit dem aktuellen Coding ist das auch gar nicht zu verhindern, da du mit jedem Loop über die interne Tabelle itab2 den Inhalt der ganzen Tabelle (INSERT FROM TABLE) auf die DB schreiben willst.

Als erstes musst du also den Loop über itab2 entfernen.
Außerdem muss sichergestellt sein dass itab2 keine Datensätze enthält die bereits auf der DB gespeichert sind.
Du kannst anstatt INSERT auch MODIFY verwenden, dann werden Datensätze die bereits vorhanden sind ignoriert bzw. der Inhalt der Nicht-Schlüsselfelder auf der DB aktualisiert.

Grüße
Matze

Folgende Benutzer bedankten sich beim Autor M@atze! für den Beitrag:
Armin93


Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von Armin93 (ForumUser / 35 / 10 / 0 ) »
Hallo Matze,

vielen Dank für deine Nachricht.
Ich kannte das bis jetzt noch gar nicht das mann das MODIFY bei einer Datenbank auch machen kann.

Dachte das geht nur bei eine internen Tabelle.
Da habe ich wieder was dazu gelernt.

Ich habe aber das jetzt vorhin so gelöst

Code: Alles auswählen.

loop at itab2.
  INSERT zzsd_aufbestand FROM TABLE itab2 accepting duplicate keys.
  ENDLOOP.
Kann das zu irgendwelchen Problemen führen ?

LG Armin

Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von M@atze! (ForumUser / 92 / 6 / 21 ) »
Hi,
lass bitte den Loop weg wenn du mit FROM TABLE arbeitest.
Mit FROM TABLE werden alle Datensätze von itab2 auf einmal auf die DB geschrieben.

Probleme sehe ich sonst keine.
Unterschied:
Wenn ein DS bereits vorhanden ist macht ein INSERT mit ACCEPTING DUPLICATE KEYS einfach nichts,
MODIFY überschreibt den bereits vorhandenen DS (mit evtl. anderen Daten
der Nicht-Schlüsselfelder aus itab2).

Grüße
Matze

Folgende Benutzer bedankten sich beim Autor M@atze! für den Beitrag:
Armin93


Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Kann das zu irgendwelchen Problemen führen ?
Dein Ansatz macht überhaupt keinen Sinn und zeigt, dass Du die Funktionsweise der Befehle nicht verstanden hast. Mit dem ACCEPTING DUPLICATE KEYS unterdrückst Du das Auftreten von Fehlermeldungen, ohne zu wissen, wo diese überhaupt herkommen. Das ist, wie wenn bei Deinem Auto die Motorkontrollleuchte rot aufleuchtet und Du das Problem löst, indem Du die Glühbirne der Kontrollleuchte lockerdrehst.

Wie Matze schon sagte, fügt der INSERT zzsd_aufbestand FROM TABLE itab2 bereits alle Zeilen von itab2 in zzsd_aufbestand ein. Der äußere LOOP ist damit unsinnig und bewirkt nur, dass das System das Ganze so oft versucht, wie Zeilen in itab2 sind - obwohl schon beim ersten Versuch sämtliche Zeilen in die Datenbanktabelle übertragen werden!

Das ACCEPTING DUPLICATE KEYS habe ich im Leben noch nie verwendet. Vielleicht gibt es sinnvolle Anwendungsmöglichkeiten dafür, aber im Prinzip besagt es, dass Dich nicht interessiert, wenn Teile der Daten, die Du einfügen möchtest, gar nicht eingefügt werden können. Du kannst das zwar hinterher mit SY-SUBRC und SY-DBCNT prüfen, aber das finde ich äußerst pfuschlig. Bevor man in eine Datenbanktabelle schreibt, sollte man sicherstellen, dass man weiß, was man schreibt und dass das auch Sinn macht und logisch funktioniert.

Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von Armin93 (ForumUser / 35 / 10 / 0 ) »
M@atze! hat geschrieben:
28.11.2019 12:54
Hi,
lass bitte den Loop weg wenn du mit FROM TABLE arbeitest.
Mit FROM TABLE werden alle Datensätze von itab2 auf einmal auf die DB geschrieben.

Probleme sehe ich sonst keine.
Unterschied:
Wenn ein DS bereits vorhanden ist macht ein INSERT mit ACCEPTING DUPLICATE KEYS einfach nichts,
MODIFY überschreibt den bereits vorhandenen DS (mit evtl. anderen Daten
der Nicht-Schlüsselfelder aus itab2).

Grüße
Matze
Hallo Matze,

alle klar ich habe es so gemacht wie du gesagt hast.
Ich habe hier das MODIFY verwendet.

Vielen Dank für dein Hilfe.

Schöne Grüße

Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von deejey (Specialist / 418 / 128 / 45 ) »
Zu bedenken: MODIFY ist zwar komfortabel, aber in gewisser Weise unkontrolliert, hat also auch Nachteile, z.B. kannst du nicht protokollieren welcher Satz geändert oder hinzugefügt wurde, kannst keine Sperren prüfen/setzen, keine zustandsabhängigen Felder versorgen wie Erfassungsdatum/Änderungsdatum, das alles müsstest du wenn es benötigt wird noch vor dem MODIFY auf der ITab ausführen. Kannst auch keinen logisch zusammenhängenden COMMIT ausführen.

Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
deejey hat geschrieben:
28.11.2019 20:22
Kannst auch keinen logisch zusammenhängenden COMMIT ausführen.
Was meinst du damit?

Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von deejey (Specialist / 418 / 128 / 45 ) »
ewx hat geschrieben:
29.11.2019 09:33
deejey hat geschrieben:
28.11.2019 20:22
Kannst auch keinen logisch zusammenhängenden COMMIT ausführen.
Was meinst du damit?
Dass z.B. bei Massenverarbeitung kein COMMIT nach jedem fachlichen Oberbegriff wie z.B. Kundennummer abgesetzt werden kann wenn man das will. Bei einem Programmabbruch z.B. durch zu viele geänderte Zeilen im Sperr- oder Commit-Puffer würden die sauber verarbeiteten Kunden nicht zurückgedreht.

Re: Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Sorry, verstehe ich immer noch nicht...
Du kannst doch auch mit MODIFY deine Daten so "sortieren", dass du nur eine bestimmte Anzahl und nur bestimmte "Hauptobjekte" in der Tabelle hast. Wo ist da der Unterschied zu INSERT oder UPDATE?

Seite 1 von 1

Vergleichbare Themen

6
Antw.
3003
Views
Daten von interner Tabelle in Datenbanktabelle
von Gast » 21.10.2004 12:20 • Verfasst in ABAP® Core
1
Antw.
759
Views
Datenbanktabelle Daten aus interne Tabelle schreiben
von L0w-RiDer » 05.12.2018 11:13 • Verfasst in ABAP® für Anfänger
17
Antw.
4079
Views
Daten einer Tabelle über Daten aus einer internen Tabelle selektieren
von Sonne1234 » 09.12.2019 08:54 • Verfasst in ABAP® für Anfänger
2
Antw.
3334
Views
Daten aus internen Tabelle in Tabelle speichern
von Stahle71 » 03.06.2015 11:03 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

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.