Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: WIKA am September 10, 2010, 14:49:00

Titel: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: WIKA am September 10, 2010, 14:49:00
Hallo,

ich verzweifel so langsam  ???. Ich erhalte folgende Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden

Mein SQL String lautet

UPDATE dbo_parts SET dbo_parts.uid = (SELECT Artikelnummer FROM munz WHERE wintoolid = UNR)
WHERE unr = 126;

Die Selectabfrage funktioniert einzeln ohne Probleme und das Update funktiniert ohne Select Abfrage auch.

Jemand eine Idee, was ich falsch mache.

Vielen Dank für die Hilfe.

Alex
Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: DF6GL am September 10, 2010, 16:49:49
Hallo,

die select-Abfrage könnte mehrere Werte liefern...

Versuch:

UPDATE dbo_parts SET dbo_parts.uid = (SELECT top 1 Artikelnummer FROM munz WHERE wintoolid = UNR)
WHERE unr = 126;

oder

UPDATE dbo_parts SET dbo_parts.uid = (SELECT First(Artikelnummer) FROM munz WHERE wintoolid = UNR)
WHERE unr = 126;


oder

UPDATE dbo_parts SET dbo_parts.uid = Dlookup("Artikelnummer","munz","wintoolid =" & UNR)
WHERE unr = 126;

Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: WIKA am September 11, 2010, 09:59:15
Hallo DF6GL,

es hat nur mit der dritten Abfrage funktioniert. Dafür damit prächtig!  ;D

Für alle noch einmal der lauffähige SQL-Code:

UPDATE dbo_parts SET dbo_parts.uid = DLookUp("Artikelnummer","munz","wintoolid =" & UNR)
WHERE (((dbo_parts.[uid])<>"leer"));

Vielen Dank noch mal!
Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: database am September 11, 2010, 13:55:26
Hallo,

die beiden anderen Abfragevarianten sollten eigentlich auch funktionieren, wenn die Statements als String übergeben werden.

"UPDATE dbo_parts SET dbo_parts.uid = (SELECT top 1 Artikelnummer FROM munz WHERE wintoolid=" & UNR & ")"
WHERE unr = 126;

oder

"UPDATE dbo_parts SET dbo_parts.uid = (SELECT First(Artikelnummer) FROM munz WHERE wintoolid=" & UNR & ")"
WHERE unr = 126;

Grüße

Peter

Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: DF6GL am September 11, 2010, 16:51:52
Hallo

@database ??   


eigentlich wäre dieses richtig:

UPDATE dbo_parts Set inner join munz on dbo_parts.UNR  = munz.wintoolid  Set dbo_parts.uid= munz.Artikelnummer
Where dbo_parts.UNR  = 126
Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: database am September 11, 2010, 16:56:59
Hallo

@DF6GL

eigentlich habe ich die Where-Klausel NICHT mit eingepackt  :-\

"UPDATE dbo_parts SET dbo_parts.uid = (SELECT top 1 Artikelnummer FROM munz WHERE wintoolid=" & UNR & ") WHERE unr = 126;"

Sollte doch gehen oder irre ich?    z.B.   Dim strSQL as String
                                                              strSQL = "UPDATE ....  ;"
                                                              CurrentDB.Execute strSQL, dbFailOnError

In der Annahme dass UNR ein numerische Variable darstellt.
   


Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: DF6GL am September 11, 2010, 17:09:41
Hallo Peter,

das Problem liegt nicht an der Übergabe eines Wertes aus einer VBA-Variablen... Das Ganze ist ein reines SQl-Statement, wie in der SQL-Ansicht im Abfrageentwurf.

Weil Access (JET) meint, eine Auswahlabfrage bringt immer mehr als einen Wert, weiß es nicht, welcher von diesen nun zugewiesen werden muß. (Aktualiserbare Abfrage...)


Hatte gehofft, durch TOP 1 oder First kann eben nur ein Wert geliefert werden, aber JET stellt sich da etwas störrisch an.


Mit der Inner Join- Verknüpfung geht es aber auf der reinen SQL-Ebene, auch ohne die (VBA-) Dlookup-Funktion zu bemühen.


Andererseits ist String hier denke ich falsch (numerischer Wert 126 ) , bzw. nur in VBA muß der SQL-String in Gänsefüße eingeschlossen werden, so er denn mit Execute ausgeführt werden soll, wobei aber UNR gar keine VBA-Varaible ist, sondern ein Tabellenfeld, und damit wäre eine Auslagerung auch wiederum falsch.  Aber das allein führt auch nur zu einem Fehler bzgl. nicht aktualisierbarer Abfrage.



Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: database am September 11, 2010, 17:13:39
Hallo Franz,

Zitatwie in der SQL-Ansicht

dann wirds natürlich klar,

in Anlehnung an deine DLookup-Lösung, die dann offensichtlich auch für den TO die richtige Lösung war habe ich eben dann die Statements in eine Stringvariante verbastelt.
Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: DF6GL am September 11, 2010, 17:17:35
Hallo,

die Dlookup-Lösung ist halt eher "Murks"... weil man eben eine ext. ("Abfrage"-) Funktion bemüht, und Dlookup glänzt zudem auch nicht gerade für seine Schnelligkeit in der Ausführung
Titel: Re: Fehlermeldung: Operation muss eine aktualisierbare Abfrage verwenden
Beitrag von: Glaurung am Februar 24, 2011, 17:49:53
Ich habe ein ähnliches Problem, deshalb hänge ich mich mal spontan hinten dran.

update tabelle1
set spalte1 = (select max(id) from tabelle2)
where spalte2 = "x"

Dies lässt sich leider nicht über einen Join lösen. Ich habe es versucht mit einer virtuellen Tabelle:

update tabelle1 inner join (select "x" as s1, max(id) as s2 from tabelle2) t on tabelle1.spalte2 = t.s1
set tabelle1.spalte1 = t.s2

aber die Fehlermeldung ist die gleiche.
Ich löse es nun mit DLookup, aber das kann doch von Access nicht so vorgesehen sein.

Habt ihr da eine Idee mit SQL?