Was meinst Du mit "Handvoll Felder"? Meinst Du a) "Handvoll Spalten" oder meinst Du b), dass Du nur wenige Zeilen bearbeiten willst?von der DBTAB_A benötige ich im Programmverlauf nur eine Handvoll Felder, weshalb ich nur ungern die ganze Tabelle selektieren möchte.
lausek hat geschrieben:Mit "keine konstanten Werte" meinst du dass sich die Spalten ändern können, oder?
Ein bisschen Code würde vielleicht helfen, die Problematik etwas klarer zu machen.
Code: Alles auswählen.
DATA: gt_ztable_150 type STANDARD TABLE OF ztable150. "Tabelle mit ca 150 Spalten
*Variante 1
Select * from ztable into TABLE gt_ztable_150 where field in so_fieldoption. "gehen wir mal von 1000 Zeilen aus
Perform ein_großes_wunder. "hier werden jetzt die u.a. die Felder 120 & 121 (Feld / Spalte)
"mit verschiedensten Werten gefüllt (kaum Zeilen gleich)
Perform db_locks.
UPDATE ztable150 from gt_ztable_150.
**************************************************************************************************************
*Variante 2
Select Feld_1 Feld_10 Feld_11 Feld_12 Feld_13 Feld_14 Feld_15 Feld_120 Feld_121
from ztable150 into TABLE gt_ztable_150_short. "gt_ztable_150_short könnte ein angepasster Datentyp sein
Perform ein_großes_wunder. "hier werden jetzt die u.a. die Felder 120 & 121 (Feld / Spalte)
"mit verschiedensten Werten gefüllt (kaum Zeilen gleich)
Perform db_locks.
LOOP AT gt_ztable_150_short ASSIGNING <fs>.
UPDATE ztable150 set Feld_120 = <fs>-feld_120
Feld_121 = <fs>-feld_121
where Feld_1 eq <fs>-feld_1.
ENDLOOP.
Eine Mischung aus a & b, in jedem Programmlauf werden zwischen 1000 und 30000 Zeilen selektiert, ich benötige für mein "großes Wunder" nicht all zu viele Spalten der Gesamtbreite, aber für ein Update from Table würde ich eben leider alle spalten benötigen. Der Zugriff auf die Einträge per Key/Index ist Gewährleistet.DeathAndPain hat geschrieben: Wenn a): Mach keinen SELECT *, sondern führe die Spalten, die Du brauchst, explizit auf. Das ist sowieso ordentlicher Programmierstil.
Wenn b): Selektiere halt die Zeilen, die Du brauchst, in eine interne Tabelle. Wenn Du nicht über den Primärschlüssel selektieren solltest, kannst Du ggf. darüber nachdenken, einen zusätzlichen Datenbankindex auf der Datenbanktabelle anzulegen, der zu Deinem Zugriff passt. (Muss natürlich von der Nutzungshäufigkeit her gerechtfertigt sein.)
Letztlich läuft es auf einen LOOP hinaus, bei dem Du die interne Tabelle mit den selektierten Spalten durchhechelst und die zu verändernden Spalten berechnest. Ob Du dann einen UPDATE FROM TABLE oder einen UPDATE SET nimmst, müsste man antesten. UPDATE FROM TABLE wird vermutlich schneller sein, aber in seiner herkömmlichen Form erfordert er, dass Du vorher doch per SELECT * die ganzen anderen Spalten einliest.
SAP ECC 6.0lausek hat geschrieben: Btw, welche Release Version hast du?
Wann hättest Du da was wählen wollen? Viele Daten = mehr Hauptspeicher, aber auch mehr laufzeitfressende UPDATE SET-Befehle. Wenn Du Deine Puffertabelle wieder freigibst, bevor Du den ALV anzeigst, dann gibt es technisch keinen relevanten Unterschied zwischen der Ausführung im Hintergrund und der im Dialogbetrieb.Im Dialogmodus hätte ich eventuell 2 Varianten programmiert und dann je nach Selektierter Datenmenge das Update Set im Loop oder eben Update from Table gewählt.
Folgende Benutzer bedankten sich beim Autor Daniel für den Beitrag (Insgesamt 3):
black_adept • DeathAndPain • RIG