Autor Beitrag
JVS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 09.03.11 19:51 
Hallo an alle DB-Spezialisten,

eine Access-DB ist über Delphi-ADOs verbunden.
Die Tabelle KOPF besitzt ein Feld GESAMTWERT, in welches die Summe der zugehörigen Einzelpositionen
(Feld WERT) aus Tabelle EINZELPOS geschrieben werden soll.

Variante 1 (Funktioniert)

Schritt 1:
Update Kopf Set GesamtWert=0

Schritt 2:
Update Kopf
Inner Join
(Select kopfid,wert from EinzelPos) as ep
on ep.kopfid=kopf.id
set GesamtWert=GesamtWert+ep.wert

Variante 2 (Funktioniert nicht)

Das Ganze soll in einem Rutsch passieren, ohne die separate Feldnullung am Anfang.
Die Idee ist wie folgt:

Update Kopf
Inner Join
(Select kopfid,sum(wert) as dieSumme from EinzelPos
Group by kopfid) as ep
on ep.kopfid=kopf.id
set GesamtWert=ep.dieSumme


Das erzeugt den Fehler:
---------------------------
EOleException
Operation muss eine aktualisierbare Abfrage verwenden
---------------------------

Warum?
Verhindert die Verknüpfung der beiden Tabellen über die GROUP BY Klausel die Editierung der Tabelle KOPF?
Hat jemand eine Lösung für die gewünschte 1-Schritt-Aktualisierung?

Gruß und Danke,
JVS
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 10.03.11 08:41 
Mal kurz, ohne lange nachzudenken:
ausblenden SQL-Anweisung
1:
2:
Update Kopf
set Gesamtwert = (Select sum(wert) from EinzelPos where Kopf.id = KopfId)

So würde es zumindest unter Oracle funktionieren. Der join muss auf deiner DB evtl. anders beschrieben werden. Oracle macht es einem da etwas einfacher. :wink:
JVS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 10.03.11 09:00 
Hi jasocul,

dein Vorschlag erzeugt den gleichen Fehler (EOleException: Operation muss eine aktualisierbare Abfrage verwenden).
Grundsätzlich ist die Syntax also richtig.
Auch Abfragen mit derartigen Verknüpfungen laufen problemlos.

Nur beim UPDATE da hakt es: Warum kann ADO das Feld nicht aktualisieren?
Mystisch...
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Do 10.03.11 09:03 
Ich denke, dass ADO da weniger das Problem ist... :mrgreen:
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 10.03.11 10:02 
Versuch es doch mal ohne Delphi/ADO.
Also einfach mal wirklich NUR das SQL-Statement ausführen.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 10.03.11 16:15 
ich habe gerade unseren lokalen SQL-Experten gefragt, er denkt auch (wie ich), dass es einfach das Problem ist, dass das Group By statement nur für SELECT ist. Ein UPDATE ist keine aktualisierbare Datenmenge :)

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 10.03.11 16:28 
@HelgeLange:
Du hast aber gesehen, dass in meinem Beispiel kein "Group By" enthalten ist, oder?
Und nach Aussage von user profile iconJVS bringt das bei ihm den selben Fehler.

Übrigens funktioniert dieses Statement bei mir ohne Fehlermeldung, wenn ich es direkt ausführe.