Update Datenbanktabelle


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

Update Datenbanktabelle

Beitragvon L0w-RiDer » 03.12.2018, 13:23

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??
L0w-RiDer
ForumUser
 
Beiträge: 46
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Update Datenbanktabelle

Beitragvon ralf.wenzel » 03.12.2018, 15:50

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
ralf.wenzel
Top Expert
 
Beiträge: 3301
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 200 mal
Ich bin: Freiberufler/in

Re: Update Datenbanktabelle

Beitragvon deejey » 03.12.2018, 16:32

glaube der Tabellenname ist zu lang :P
deejey
Specialist
 
Beiträge: 150
Registriert: 31.07.2016, 11:20
Dank erhalten: 10 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon DeathAndPain » 03.12.2018, 18:03

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.
DeathAndPain
Expert
 
Beiträge: 844
Registriert: 05.05.2006, 10:14
Dank erhalten: 197 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon L0w-RiDer » 04.12.2018, 10:15

Nein, es sollte wirklich geupdatet werden, aber irgendwie funktioniert es so nicht ... hat jemand ne andere Idee?
L0w-RiDer
ForumUser
 
Beiträge: 46
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon ralf.wenzel » 04.12.2018, 10:22

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
ralf.wenzel
Top Expert
 
Beiträge: 3301
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 200 mal
Ich bin: Freiberufler/in

Re: Update Datenbanktabelle

Beitragvon L0w-RiDer » 04.12.2018, 10:26

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....
L0w-RiDer
ForumUser
 
Beiträge: 46
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon ralf.wenzel » 04.12.2018, 10:32

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
ralf.wenzel
Top Expert
 
Beiträge: 3301
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 200 mal
Ich bin: Freiberufler/in

Re: Update Datenbanktabelle

Beitragvon a-dead-trousers » 04.12.2018, 10:34

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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3106
Registriert: 07.02.2011, 13:40
Dank erhalten: 767 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon L0w-RiDer » 04.12.2018, 10:37

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.
L0w-RiDer
ForumUser
 
Beiträge: 46
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon ralf.wenzel » 04.12.2018, 10:46

GIBT es denn deine Datensätze schon auf der DB? Nur dann ist ein UPDATE sinnvoll.....


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3301
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 200 mal
Ich bin: Freiberufler/in

Re: Update Datenbanktabelle

Beitragvon L0w-RiDer » 04.12.2018, 10:50

Ja... okay, nun hat es funktioniert :D.

Keine Ahnung was vorhin war :).

Vielen Dank.
L0w-RiDer
ForumUser
 
Beiträge: 46
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon DeathAndPain » 04.12.2018, 10:56

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.
DeathAndPain
Expert
 
Beiträge: 844
Registriert: 05.05.2006, 10:14
Dank erhalten: 197 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon L0w-RiDer » 05.12.2018, 10:14

hmm wie funktionert es denn, wenn ich wirklich den gesamten Inhalt meiner internen Tabelle in die Datenbanktabelle schreiben möchte?
L0w-RiDer
ForumUser
 
Beiträge: 46
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Update Datenbanktabelle

Beitragvon a-dead-trousers » 05.12.2018, 10:16

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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3106
Registriert: 07.02.2011, 13:40
Dank erhalten: 767 mal
Ich bin: Entwickler/in

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
Applikations-Toolbar dynamisch erzeugen
vor 9 Stunden von ralf.wenzel 0 Antw.
CP_BD_DIRECT_INPUT_PLAN
Gestern von Gottschall 0 Antw.
Logische Datenbank: Selektieren mit Loop
vor 4 Stunden von deejey 12 Antw.
Globale Konstanten - Organisationseinheiten
vor 13 Stunden von ralf.wenzel 5 Antw.
Kein Zugriff auf Dateien im Applikationsserver
Gestern von zzcpak 1 Antw.

  Ähnliche Beiträge beta
update Datenbanktabelle
10.09.2007, 10:15 von edwin 4 Antw.
Datenbanktabelle Update
11.04.2011, 08:20 von km216 5 Antw.
gelöst Update DB set expr
18.02.2016, 15:28 von Icke0801 2 Antw.
gelöst Update ZTabelle
01.05.2017, 13:13 von gtoXX 4 Antw.
Dynamische Update Anweisung
20.03.2007, 17:01 von edwin 2 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]