PDA

Vollständige Version anzeigen : UPDATE in Access


Joachim Hofmann
29.01.2002, 18:52
Hallo,
ich habe Schwierigkeiten bei eine Access-Aktualisierungsabfrage (muß in SQL sein.)
Access hat für UPDATE ja eine andere Syntax als SQL Server.

Gegeben sind 3 Tabellen TAB_ZU_UPDATEN, TAB_JOIN_EINS und TAB_JOIN_ZWEI.

Ich will das Feld *Rueckwert* derTabelle TAB_ZU_UPDATEN updaten
auf eine Summe resultierend aus dem Join der Tabellen TAB_JOIN_EINS und TAB_JOIN_ZWEI.
Dabei soll bei obigem Join nur DS mit dem Kriterium '2002_01' für TAB_JOIN_EINS.Periode mitgenommen werden
Also etwa so:


<FONT color=#804040>UPDATE</FONT> TAB_ZU_UPDATEN
<FONT color=#804040>SET</FONT> TAB_ZU_UPDATEN.Rueckwert = Sum(TAB_JOIN_ZWEI.Anzahl)
<FONT color=#6a5acd>FROM</FONT> TAB_JOIN_EINS <FONT color=#6a5acd>INNER</FONT> <FONT color=#6a5acd>JOIN</FONT> TAB_JOIN_ZWEI
<FONT color=#6a5acd>ON</FONT> TAB_JOIN_EINS.Lauf_Key = TAB_ZU_UPDATEN.Lauf_Key
<FONT color=#6a5acd>WHERE</FONT> TAB_JOIN_EINS.EVU_Key = TAB_ZU_UPDATEN.EVU_Key
<FONT color=#804040>AND</FONT> TAB_JOIN_EINS.Periode = <FONT color=#ff00ff>'2002_01'</FONT>


so gehts nicht.

Wie geht es?


Vielen Dank

MarioR
30.01.2002, 07:00
Hallo Achim,

wie ist denn die Tab TAB_JOIN_ZWEI mit den anderen verbunden?

Joachim Hofmann
30.01.2002, 10:03
Hallo,


ein Fehler war noch drin, der Tip war richtig, aber es wurde immer noch nicht geschluckt.
Ich versuche mal einen neuen Ansatz mit den Originaltabellennamen. Vielleich ist das auch "nur" ein Join über 3 Tabellen, aber wie gehts?. Diese Tabellen mit den drunterliegenden Felder gibt es.<TABLE WIDTH="100%" CELLPADDING="1" CELLSPACING="1" BORDER="1">
<TR>
<TD WIDTH="33%" VALIGN=TOP>T_LErgebnis</TD>
<TD WIDTH="33%" VALIGN=TOP>Lauf</TD>
<TD WIDTH="33%" VALIGN=TOP>Ruecklauf</TD>
</TR>
<TR>
<TD WIDTH="33%" VALIGN=TOP>Hinlauf | Ruecklauf | EVU_Key </TD>
<TD WIDTH="33%" VALIGN=TOP> EVU_Key | Periode | Lauf_Key</TD>
<TD WIDTH="33%" VALIGN=TOP>Lauf_Key | Anzahl</TD>
</TR>
</TABLE>


In der Tabelle<font face="Courier New" size="2"> T_LErgebnis</font> sind schon Zeilen drin, jeweils EINE pro <font face="Courier New" size="2">EVU_Key</font>, und das Feld Hinlauf ist schon gefüllt. Ich will nun das Feld <font face="Courier New" size="2">Ruecklauf </font>updaten, und zwar:

Ich möchte
- die Summe von <font face="Courier New" size="2">Anzahl </font>in <font face="Courier New" size="2">Ruecklauf </font>bilden, nur für die <font face="Courier New" size="2">EVU_Key</font>s (die stehen wiederum in Lauf), die auch in <font face="Courier New" size="2">T_LErgebnis</font> vorhanden sind, und außerdem sollen dabei nur Sätze mit einer bestimmten <font face="Courier New" size="2">Periode </font>(in Lauf) behandelt werden.


Hoffentlich kann man das besser verstehen?

MarioR
30.01.2002, 13:03
Hallo Achim,

ich hab jetzt 2 Ansätze mit folgender Bedingung:

Wenn in der Tab "Lauf" zu gleichen "EVU_Key" und "Periode" verschiedene "Lauf_Key" existieren, dann wird aus "Anzahl" in der Tab "Ruecklauf" für alle betreffenden "Lauf_Key" die Gesamtsumme berechnet und in das Feld "Ruecklauf" in der Tab "T_LErgebnis" geschrieben. Damit dabei keine Fehler entstehen, muss für die betreffenden DS das Feld "Ruecklauf" eine 0 enthalten (bevor die Abfrage gestartet wird).

1. Lösung (geht ganz sicher):

UPDATE T_LErgebnis INNER JOIN Lauf
ON T_LErgebnis.EVU_Key = Lauf.EVU_Key
SET T_LErgebnis.Ruecklauf = T_LErgebnis.Ruecklauf+DSum("Anzahl","Ruecklauf"," Ruecklauf.Lauf_Key=" & Lauf.Lauf_Key)
WHERE Lauf.Periode=[DeinePeriode];



2. Lösung (geht nicht unter A97, könnte aber unter höheren Versionen funktionieren):

UPDATE T_LErgebnis INNER JOIN Lauf
ON T_LErgebnis.EVU_Key = Lauf.EVU_Key
SET T_LErgebnis.Ruecklauf = T_LErgebnis.Ruecklauf+(Select Sum(Anzahl) FROM Ruecklauf
WHERE Ruecklauf.Lauf_Key = Lauf.Lauf_Key)
WHERE Lauf.Periode=[DeinePeriode];

MarioR
30.01.2002, 18:02
Vergiss die 2. Lösung. Die funktioniert auch in höheren Versionen nicht.

Mario

Joachim Hofmann
30.01.2002, 20:09
Das muß ich nochmal testen.


(schon wieder an anderem Datenbank-Projekt arbeitet, was genauso "Top-Lebens-wichtig" ist wie das erste, es geht hier zu wie im Tollhaus.)

Vielen Dank erstmal.