Füllen einer Datenbanktabelle mit den Daten aus der internen Tabelle Thema ist als GELÖST markiert

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 / 27 / 9 / 0 ) » 28.11.2019 10:15

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


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

Beitrag von M@atze! (ForumUser / 90 / 6 / 20 ) » 28.11.2019 11:13

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 (28.11.2019 12:34)


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

Beitrag von Armin93 (ForumUser / 27 / 9 / 0 ) » 28.11.2019 12:14

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 / 90 / 6 / 20 ) » 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

Folgende Benutzer bedankten sich beim Autor M@atze! für den Beitrag:
Armin93 (28.11.2019 15:25)


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

Beitrag von DeathAndPain (Top Expert / 1270 / 139 / 291 ) » 28.11.2019 14:19

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 / 27 / 9 / 0 ) » 28.11.2019 15:27

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 / 276 / 77 / 22 ) » 28.11.2019 20:22

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 / 4126 / 183 / 418 ) » 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?

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

Beitrag von deejey (Specialist / 276 / 77 / 22 ) » 29.11.2019 11:00

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 / 4126 / 183 / 418 ) » 29.11.2019 11:27

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