Update Datenbanktabelle

Getting started ... Alles für einen gelungenen Start.
31 Beiträge • Seite 1 von 3 (current) Nächste
31 Beiträge Seite 1 von 3 (current) Nächste

Update Datenbanktabelle

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Hallo!

Ich möchte eine Datenbanktabelle updaten.

Folgender Gedankengang:

Update zcd_diese_Tabelle_soll_geupdatet_werden
Set spalte1 = gt_tab1-spalte1
spalte2 = gt_tab1-spalte2
spalte3 = gt_tab1-spalte3.

allso ich habe eine interne Tabelle (gt_tab1) und diese Werte möchte ich nun in eine Datenbanktabelle(zcd_diese_Tabelle_soll_geupdatet_werden) schreiben. Sollte es so funktionieren??

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


Re: Update Datenbanktabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Nein, weil du einen LOOP brauchst, um das so umzusetzen. Eigentlich ist die Hilfe doch selbsterklärend. Und wenn nicht: Welche konkrete Frage hast du dazu (also zur Hilfe)?


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Update Datenbanktabelle

Beitrag von deejey (Specialist / 419 / 128 / 45 ) »
glaube der Tabellenname ist zu lang :P

Re: Update Datenbanktabelle

Beitrag von DeathAndPain (Top Expert / 1797 / 214 / 396 ) »
Also ich möchte Ralf insofern widersprechen, als das so durchaus funktionieren kann. Dazu müsste man allerdings wissen, wie die Frage genau gemeint ist; die ist nämlich leider etwas unpräzise formuliert. Ich kann sie schon auch so deuten, dass es funktioniert. Wenn man nämlich

Code: Alles auswählen.

Update zcd_diese_Tabelle_soll_geupdatet_werden
Set spalte1 = gt_tab1-spalte1
spalte2 = gt_tab1-spalte2
spalte3 = gt_tab1-spalte3.
ausführt, dann werden die Werte aus der Kopfzeile von gt_tab1 bei sämtlichen Zeilen von zcd_diese_Tabelle_soll_geupdatet_werden in die entsprechenden Spalten geschrieben. Damit ist zcd_diese_Tabelle_soll_geupdatet_werden geupdatet. Von daher: ja. :D

Wenn man die Frage etwas wohlwollender liest, was Ralf vermutlich gemacht hat, dann würde ich dennoch zu einem anderen Ergebnis kommen als er. Gewollt ist ja anscheinend, dass die Zeilen der internen Tabelle in die Datenbank geschrieben werden. Dafür ist aber UPDATE grundsätzlich ungeeignet; dafür käme nur INSERT oder allenfalls noch MODIFY in Betracht. Dann kann man aber schon ohne LOOP auskommen; dafür reicht dann ein INSERT FROM TABLE-Befehl.
Sollte natürlich wirklich ein UPDATE gemeint sein, also passende Zeilen bereits in der Datenbanktabelle existieren und darin nur bestimmte Spalten auf der Basis der internen Tabelle verändert werden sollen, ja, dann kommt man um einen LOOP nicht herum.

Re: Update Datenbanktabelle

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Nein, es sollte wirklich geupdatet werden, aber irgendwie funktioniert es so nicht ... hat jemand ne andere Idee?

Re: Update Datenbanktabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
L0w-RiDer hat geschrieben:Nein, es sollte wirklich geupdatet werden, aber irgendwie funktioniert es so nicht ... hat jemand ne andere Idee?
Was genau funktioniert denn nicht?


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Update Datenbanktabelle

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
LOOP at gt_ausgabe INTO gs_ausgabe.
UPDATE ZCD_TAB_SUCHE
SET MANDT = gs_ausgabe-mandant
XX = gs_ausgabe-xx
YYYY = gs_ausgabe-yyyy
Anzahl_XX = gs_ausgabe-anzahl_xx
Prozent_XX = gs_ausgabe-prozent_xx
Anzahl_YYYY = gs_ausgabe-anzahl_yyyy
Prozent_YYYY = gs_ausgabe-prozent_yyyy.
* where XX = gt_ausgabe-xx
* and YYYY = gt_ausgabe-yyyy.
ENDLOOP.

Ich bin jetzt mal in Debugger reingegangen und der geht nur auf Update und dann gleich runter aber nicht ins Set rein und es schreibt auch nicht auf die Datenbanktabelle....

Re: Update Datenbanktabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Nicht ins SET rein? SET ist *Teil* von UPDATE, da gibt es nichts reinzugehen.

Was sagt der sy-subrc im Debugger?

Achso, öhm, machst du irgendwo einen COMMIT?


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Update Datenbanktabelle

Beitrag von a-dead-trousers (Top Expert / 4285 / 214 / 1141 ) »
Das WHERE fehlt, sonst werden ALLE vorhandenen Zeilen der Tabelle mit den gleichen Werten überschrieben.
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.18
Basis: 7.50

Re: Update Datenbanktabelle

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Ja, nach dem Loop mach ich noch Commit Work.

Ich bin gerade bloß noch am überlegen, ob ich so nicht einfach in die Datenbanktabelle reinschreib oder ob so wirklich ein Update stattfindet??

Ich möchte eigentlich einen wirklichen Update nur vollziehen.

Re: Update Datenbanktabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
GIBT es denn deine Datensätze schon auf der DB? Nur dann ist ein UPDATE sinnvoll.....


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Update Datenbanktabelle

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Ja... okay, nun hat es funktioniert :D.

Keine Ahnung was vorhin war :).

Vielen Dank.

Re: Update Datenbanktabelle

Beitrag von DeathAndPain (Top Expert / 1797 / 214 / 396 ) »
Der Commit ist wahrscheinlich das unwichtigste hier. Wenn das Programm endet, dann macht er von sich aus einen Commit (sofern das Programmende nicht durch einen ABAP Dump oder ähnliches herbeigeführt worden ist).

@L0w-RiDer: An Deinem UPDATE-Befehl gefallen mir gleich mehrere Sachen nicht. Eine davon hat adt angemerkt: Du hast kein WHERE drin. Das heißt, beim ersten LOOP-Durchlauf werden sämtliche Zeilen Deiner Datenbanktabelle mit der ersten Zeile Deiner internen Tabelle überschrieben. Beim nächsten LOOP-Durchlauf werden sie dann aber gleich wieder überschrieben, nämlich von der nächsten Zeile Deines LOOPs. Deine Idee ist vermutlich, dass Du zu jeder Zeile aus Deiner internen Tabelle genau eine zugehörige Datenbankzeile überschreiben willst. Dazu musst Du dem UPDATE-Befehl aber sagen, welche Zeile der Datenbanktabelle er denn anpassen soll. Da Du kein WHERE in Deinem UPDATE-Befehl drin hast, werden bei jedem einzelnen LOOP-Schleifendurchlauf alle Zeilen der Datenbanktabelle überschrieben!

Dass das in der Praxis bei Dir nicht funktioniert hat, liegt an der zweiten Sache: Du überschreibst den Primärschlüssel. Um die Zeilen, die Du ändern willst, überhaupt finden zu können, sind in Deiner Datenbanktabelle bestimmte Spalten als Primärschlüsselspalten definiert. Über diese unterscheidet die Datenbank die Zeilen. Daraus folgt die Tatsache, dass man die Spalten, die zum Primärschlüssel gehören, niemals updaten kann!!! Ich weiß zwar nicht, wie Deine Tabelle ZCD_TAB_SUCHE in der SE11 definiert ist, aber ich bin mir sehr sicher, dass zumindest die Spalte MANDT zum Primärschlüssel gehört. Da Du in Deinem Update versuchst, diese Spalte zu ändern (auch wenn Du nur wieder denselben Wert reinschreiben möchtest), wird Dir der UPDATE schon deshalb mit einem SY-SUBRC ungleich Null aussteigen und gar nichts machen (mal abgesehen davon, dass man die Spalte MANDT gar nicht angeben darf, wenn man nicht zugleich den Zusatz CLIENT SPECIFIED bringt).

Sei mir nicht böse, aber dieser Fall zeigt doch recht deutlich, dass Dein derzeitiges Verständnis relationaler Tabellen und Datenbanken gegen Null geht. Ich kann Dir nur dringend empfehlen, Dir da erst mal die wesentlichen Grundlagen anzulesen. Bis dahin wird es Dir noch nicht mal gelingen, sinnvolle SELECTs zu bauen, geschweige denn UPDATEs. Und wie dieses Beispiel zeigt, kannst Du mit einem einzigen UPDATE-Befehl den Inhalt einer ganzen Datenbanktabelle vernichten. Genau das würde Dein Update nämlich tun, wenn ABAP sich nicht wegen des Änderungszugriffs auf Primärschlüsselspalten weigern würde, ihn überhaupt auszuführen.

Re: Update Datenbanktabelle

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
hmm wie funktionert es denn, wenn ich wirklich den gesamten Inhalt meiner internen Tabelle in die Datenbanktabelle schreiben möchte?

Re: Update Datenbanktabelle

Beitrag von a-dead-trousers (Top Expert / 4285 / 214 / 1141 ) »
L0w-RiDer hat geschrieben:hmm wie funktionert es denn, wenn ich wirklich den gesamten Inhalt meiner internen Tabelle in die Datenbanktabelle schreiben möchte?
INSERT für das reine Anlegen.
MODIFY für Anlegen oder Ändern (in anderen DB-Systemen auch als UPSERT bekannt)
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.18
Basis: 7.50

Vergleichbare Themen

5
Antw.
16436
Views
Datenbanktabelle Update
von km216 » 06.04.2011 10:29 • Verfasst in ABAP® für Anfänger
4
Antw.
3265
Views
update Datenbanktabelle
von LittleT » 10.09.2007 09:47 • Verfasst in ABAP® für Anfänger
11
Antw.
569
Views
UPDATE Datenbanktabelle
von ABAPlerv » 28.03.2022 16:34 • Verfasst in ABAP® für Anfänger
9
Antw.
8617
Views
DBTab Update from Table oder in Loop mit "Update Set" Oder ?
von RIG » 09.03.2018 11:27 • Verfasst in ABAP® Core
6
Antw.
1084
Views
Datenbanktabelle
von HH_ABAP » 29.03.2019 15:10 • Verfasst in ABAP® für Anfänger

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.