Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aktualisierungsabfrage klappt nicht

111 views
Skip to first unread message

Maik Hollmann

unread,
Sep 14, 2009, 3:29:22 PM9/14/09
to
Hallo NG,

folgende Situation: Habe eine Tabelle mit Produktdatens�tzen (mit
eindeutiger ProduktID und einem Feld 'Endtermin') und eine andere
Tabelle, in der verschiedene Fertigungsschritte (Feld 'FSID',
'ProduktID' und Fertigstellungsdatum) abgelegt sind. Da es mehrere
Fertigungsschritte je Produkt gibt, sind in dieser Tabelle mehrere
Datens�tze einer ProkuktID, aber unterschiedlicher 'FSID' gespeichert.

Ich m�chte nun das sp�teste Fertigstellungsdatum zu einem Produkt
(unabh�ngig von der FSID) zur�ck in das Feld 'Endtermin' der Tabelle mit
den Produktdatens�tzen schreiben.

Habe dazu eine Gruppierungsabfrage mit dem h�chsten Datum je ProduktID
erstellt und damit eine Aktualisierungsabfrage erstellt, die �ber die
ProkuktID zur Tabelle mit den Produktdatens�tzen verkn�pft. Leider
meldet Access: 'Operation muss eine aktualisierbare Abfrage verwenden' ?

Danke, Gru� Maik

Bernd Gilles

unread,
Sep 14, 2009, 4:43:39 PM9/14/09
to
Hallo Maik,

Maik Hollmann schrieb:


> Habe dazu eine Gruppierungsabfrage mit dem h�chsten Datum je ProduktID
> erstellt und damit eine Aktualisierungsabfrage erstellt, die �ber die
> ProkuktID zur Tabelle mit den Produktdatens�tzen verkn�pft. Leider
> meldet Access: 'Operation muss eine aktualisierbare Abfrage verwenden' ?

eine gruppierte Abfrage ist grunds�tzlich nicht aktualisierbar.

Du k�nntest aber nur die Produkttabelle aktualisieren und daf�r
DMax("Fertigstellungsdatum", "tbl_Fertigungsschritte", "ProduktID=" &
[ProduktID])
verwenden.

--
Gru�, Bernd
------------------------------------------------------
Access goes Subversion - http://oasis.gilles-family.de

Josef Poetzl

unread,
Sep 14, 2009, 4:56:10 PM9/14/09
to
Hallo!

Maik Hollmann schrieb:


> folgende Situation: Habe eine Tabelle mit Produktdatens�tzen (mit
> eindeutiger ProduktID und einem Feld 'Endtermin') und eine andere
> Tabelle, in der verschiedene Fertigungsschritte (Feld 'FSID',
> 'ProduktID' und Fertigstellungsdatum) abgelegt sind. Da es mehrere
> Fertigungsschritte je Produkt gibt, sind in dieser Tabelle mehrere
> Datens�tze einer ProkuktID, aber unterschiedlicher 'FSID' gespeichert.
>
> Ich m�chte nun das sp�teste Fertigstellungsdatum zu einem Produkt
> (unabh�ngig von der FSID) zur�ck in das Feld 'Endtermin' der Tabelle mit
> den Produktdatens�tzen schreiben.

Ist diese doppelte Datenhaltung �berhaupt notwendig?

> Habe dazu eine Gruppierungsabfrage mit dem h�chsten Datum je ProduktID
> erstellt und damit eine Aktualisierungsabfrage erstellt, die �ber die
> ProkuktID zur Tabelle mit den Produktdatens�tzen verkn�pft. Leider
> meldet Access: 'Operation muss eine aktualisierbare Abfrage verwenden' ?

Bei Access/Jet-SQL musst du auf DMax oder eine VBA-Funktion in der
SQL-Anweisung ausweichen, da die komplette SQL-Anweisung als nicht
aktualisierbar angesehen wird, sobald eine Unterabfrage oder eine per
join verkn�pfte Abfrage nicht aktualisierbar ist.

UPDATE Produkte AS P
LEFT JOIN
(
select ProduktID, Max(Fertigstellungsdatum) AS MaxDatum
from Fertigungsschritte
group by ProduktID
) FS
ON FS.ProduktID = P.ProduktID
SET P.Enddatum = FS.MaxDatum

=> nicht aktualisierbar.


UPDATE Produkte AS P
SET P.Enddatum = (
select Max(Fertigstellungsdatum) From tblFertigungsschritte FS
where FS.ProduktID = P.ProduktID
)

Anm.: auch ein DISTINCTROW hilft hier nicht weiter.


Variante mit DMax:
UPDATE Produkte AS P
SET P.Enddatum =
DMax("Fertigstellungsdatum", "Fertigungsschritte",
"ProduktID = " & P.ProduktID)

=> das sollte funktionieren.

mfg
Josef

--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Maik Hollmann

unread,
Sep 15, 2009, 2:41:23 PM9/15/09
to
Hallo Josef,

Josef Poetzl schrieb:

> Variante mit DMax:
> UPDATE Produkte AS P
> SET P.Enddatum =
> DMax("Fertigstellungsdatum", "Fertigungsschritte",
> "ProduktID = " & P.ProduktID)
>
> => das sollte funktionieren.

Das funktioniert! Vielen Dank. Leider ist die Performance (einige 1000
DS) sehr schlecht...

Ich hatte das schon mittels VBA und Recordsets (Schleife) probiert.
Funktionierte auch, war aber �hnlich langsam.

H�ttest Du vielleicht noch einen anderen Ansatz ?

@Bernd: Auch Dir vielen Dank.

Gru� Maik

Maik Hollmann

unread,
Sep 15, 2009, 3:10:01 PM9/15/09
to
Maik Hollmann schrieb:
... Leider ist die Performance (einige 1000

> DS) sehr schlecht...
>
> Ich hatte das schon mittels VBA und Recordsets (Schleife) probiert.
> Funktionierte auch, war aber �hnlich langsam.
>
> H�ttest Du vielleicht noch einen anderen Ansatz ?

Habe jetzt per Tabellenerstellungsabfrage die Max-Werte in eine neue
Tabelle geschrieben und diese per Aktualisierungsabfrage benutzt:

Das geht hinreichend schnell :-)

Danke Euch !

Gru� Maik

Josef Poetzl

unread,
Sep 15, 2009, 3:13:07 PM9/15/09
to
Hallo!

Maik Hollmann schrieb:


> Josef Poetzl schrieb:
>
> > Variante mit DMax:
> > UPDATE Produkte AS P
> > SET P.Enddatum =
> > DMax("Fertigstellungsdatum", "Fertigungsschritte",
> > "ProduktID = " & P.ProduktID)
> >
> > => das sollte funktionieren.
>
> Das funktioniert! Vielen Dank. Leider ist die Performance (einige 1000
> DS) sehr schlecht...

Musst du jedes Mal mehrere 1000 DS aktualisieren?

> Ich hatte das schon mittels VBA und Recordsets (Schleife) probiert.
> Funktionierte auch, war aber �hnlich langsam.
>
> H�ttest Du vielleicht noch einen anderen Ansatz ?

Du k�nntest auf die doppelte Datenhaltung verzichten. :-)


Ansonsten:
Hast du es schon mit einer Recordset-Ersatzfunktion f�r DMax probiert?
Auf ProduktID in der Tabelle "Fertigungsschritte" sollte auf jeden
Fall ein Index gesetzt sein.

Thomas Möller

unread,
Sep 15, 2009, 4:17:56 PM9/15/09
to
Hallo Maik,

Maik Hollmann schrieb:


>
> > Variante mit DMax:
> > UPDATE Produkte AS P
> > SET P.Enddatum =
> > DMax("Fertigstellungsdatum", "Fertigungsschritte",
> > "ProduktID = " & P.ProduktID)
> >
> > => das sollte funktionieren.
>
> Das funktioniert! Vielen Dank. Leider ist die Performance (einige 1000
> DS) sehr schlecht...
>
> Ich hatte das schon mittels VBA und Recordsets (Schleife) probiert.
> Funktionierte auch, war aber �hnlich langsam.
>
> H�ttest Du vielleicht noch einen anderen Ansatz ?

probier es doch mal mit "reinem" SQL:

UPDATE Produkte AS P
SET P.Enddatum =

SELECT MAX(F.Fertigstellungsdatum)
FROM Fertigungsschritte AS F
WHERE F.ProduktID = P.ProduktID)


HTH
--
Thomas

Homepage: www.Team-Moeller.de

Maik Hollmann

unread,
Sep 15, 2009, 4:18:40 PM9/15/09
to
Hallo Josef,

Josef Poetzl schrieb:
>

> Du k�nntest auf die doppelte Datenhaltung verzichten. :-)

Ja, ja ich wei�, die Normalformen... Aber so ist es f�r mich
�bersichtlicher ;-)

> Ansonsten:
> Hast du es schon mit einer Recordset-Ersatzfunktion f�r DMax probiert?
> Auf ProduktID in der Tabelle "Fertigungsschritte" sollte auf jeden
> Fall ein Index gesetzt sein.

:-O Oh, das hatte ich nat�rlich nicht, und siehe da: das Ding rast....

Besten Dank, so werde ich das jetzt umsetzen.


Gru� Maik

Josef Poetzl

unread,
Sep 15, 2009, 4:38:29 PM9/15/09
to
Hallo!

Maik Hollmann schrieb:
> Josef Poetzl schrieb:

>> Hast du es schon mit einer Recordset-Ersatzfunktion f�r DMax probiert?
>> Auf ProduktID in der Tabelle "Fertigungsschritte" sollte auf jeden
>> Fall ein Index gesetzt sein.
>
> :-O Oh, das hatte ich nat�rlich nicht, und siehe da: das Ding rast....

Bez�glich Index noch ein Nachtrag: falls du eine Beziehung mit
referentieller Integrit�t erstellt hast, legt Access im Hintergrund
automatisch einen Index an. Diesen siehst du aber nur, wenn du die
Indizes per VBA auflistest. Im Indexfenster vom Tabellenentwurf werden
diese Indizes leider nicht angezeigt.

Maik Hollmann

unread,
Sep 15, 2009, 4:36:11 PM9/15/09
to
Hallo Thomas,

Thomas M�ller schrieb:


> probier es doch mal mit "reinem" SQL:
>
> UPDATE Produkte AS P
> SET P.Enddatum =
> SELECT MAX(F.Fertigstellungsdatum)
> FROM Fertigungsschritte AS F
> WHERE F.ProduktID = P.ProduktID)
>

Danke f�r die Info. Hatte das so probiert, leider kam auch die Meldung:

'Operation muss eine aktualisierbare Abfrage verwenden'

Habe aber nun eine L�sung gefunden: VBA und Recordsets (nun mit Index
;-) siehe Post weiter oben...

Trotzdem Danke,

Gru� Maik

0 new messages