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
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;
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!
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
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
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.
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.
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.
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
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?