Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

update anweisung mt abfrage!

Begonnen von ReneB, Januar 29, 2019, 12:23:43

⏪ vorheriges - nächstes ⏩

ReneB

Hallo,

möchte gern eine update Anweisung über VBA erstellen und Mengen in einer Tabelle ändern. Die Daten stehen in einer Abfrage und das ist auch mein Problem. Kann man sich überhaupt auf Werte aus einer Abfrage beziehen?
Aktuell sieht mein Code so aus und liefert eine Fehlermeldung."Variable nicht definiert"

DoCmd.RunSQL "UPDATE Lagerbestand_tbl SET Tonnage = [Bunkerbestand_qry]![DAP gran]"

Kann vielleicht jemand weiterhelfen?

Danke vorab.
Rene


Lachtaube

Hallo Rene,

wenn die Abfrage updatebar ist, führt diese AbfrageUPDATE Lagerbestand_tbl,
       Bunkerbestand_qry b
SET    Tonnage = b.[DAP gran];
zum Ziel, wobei alle Datensätze, wenn nicht anders angegeben-und das ist hier der Fall, dann den Wert von DAP gran erhalten.
Grüße von der (⌒▽⌒)

ReneB

Hallo Lachtaube,

Sorry das versteh ich nicht. Soll ich das so in das VBA statement schreiben?
DoCmd.RunSQL "UPDATE Lagerbestand_tbl, Bunkerbestand_qry ...., Was bedeuted das "b"? Eigentlich habe ich die Update Anweisung schon verstanden, aber Dein Vorschlag sieht so völlig anders aus. Kannst Du mir da mal auf die Sprünge helfen?

Entschuldige meine Unwissenheit und Danke
Rene

PhilS

Zitat von: ReneB am Januar 29, 2019, 19:26:24
DoCmd.RunSQL "UPDATE Lagerbestand_tbl, Bunkerbestand_qry ...., Was bedeuted das "b"?
Das b ist nur ein Alias, der dann anstelle des eigentlichen Tabellen- bzw. Abfragenamens Bunkerbestand_qry verwendet werden kann.
Du kannst das SQL-Statement dann einfach analog zu deinem ursprünglichen Statement über DoCmd.RunSql ausführen lassen, oder als Abfrage speichern.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ReneB

Hallo Phils,

leider klemmts gerade komplett. Ich möchte das Feld "Tonnage" in der Tabelle "Lagerbestand_tbl" aktualisieren mit dem Wert aus Abfrage "Bunkerbestand_qry", Feld "DAPgran". Eigentlich klar, aber ich verstehe Eure Vorschläge leider gar nicht. Kann mir das jemand so erklären, daß das ein Anfänger versteht?

Danke sehr
Rene

PhilS

Jetzt ist mir wiederum unklar, was dir unklar ist.
Du ersetzt einfach dein ursprüngliches SQL-Statement, durch das von Lachtaube. Also so:
DoCmd.RunSQL "UPDATE Lagerbestand_tbl, " & _
              "      Bunkerbestand_qry b " & _
              " SET    Tonnage = b.[DAP gran];"

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

Hallo,
Zitatdaß das ein Anfänger versteht?
Unabhängig von den Vorschlägen und Deinem Vorhaben, noch ein Hinweis da Du Dich als Anfänger bezeichnest.

In einer Datenbak speichert man keine Bestandsmengen. Die Mengen führt man in einer Tabelle.
Zugänge als positive Zahl und Abgänge als negative Zahl.
Der Bestand ist dann einfach die Summe. Wie bei den Kontoauszügen Soll (-) und Haben (+). Der Saldo (=Bestand) ist einfach die Summe aller Beträge. Immer automatisch aktuell.
Gruß Klaus

PhilS

Zitat von: ReneB am Januar 29, 2019, 20:36:14
...daß das ein Anfänger versteht?
Ein wichtiger Hinweis noch auf einen Sachverhalt, der eigentlich klar sein sollte, aber dir als Anfänger möglicherweise nicht bewusst ist...
Schon in deiner ursprünglichen Abfrage und somit auch in dem Vorschlag von Lachtaube ist keinerlei Beziehung zwischen den beiden Tabellen/Abfragen definiert. D.h. die Aktualisierungsabfrage wird in allen Datensätzen der Tabelle Lagerbestand_tbl das Feld Tonnage auf den gleichen Wert setzen. - Wenn das nicht deine Absicht ist, muss eine Where-Condition oder ein Join zwischen den beiden Tabellen ergänzt werden.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

#8
Hallo Rene,
Und noch ein Hinweis, - ".RunSQL" wird IMO kaum noch verwendet.
Verwende lieber
CurrentDb.Execute "DeinSQL-String, dbFailOnError
mit der Option "dbFailOnError" bekommst du damit auch eine
aussagekräftige Fehlermeldung, wenn die Abfrage fehl schlägt.
Da du die Abfrage ja in VBA absetzen willst, und wegen der, von
Lachtaube und Philipp erwähnten WHERE-Condition liest du vielleicht
mal dies http://www.donkarl.com?FAQ6.16.
Und, wenn du irgendwann etwas umfangreichere Abfragen mit VBA
zusammenstellen willst/musst, ist dieses SqlDebugPrint ein sehr
bequemes Werkzeug zum Testen der SQL-Strings.
gruss ekkehard

[Edit von PhilS: Ich habe mir erlaubt den Link auf SqlDebugPrint zu reparieren bzw. ergänzen]
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneB

Hallo an Alle,

danke für die Hilfestellung und die Erklärungen dazu. Ich habe es nun wie folgt gemacht.

DoCmd.RunSQL "UPDATE Lagerbestand_tbl SET Tonnage ='" & DLookup("[DAP gran]", "Bunkerbestand_qry") & "'" & _
        "WHERE Materialbeschreibung ='DAP_gran'"
Funktioniert super.
Viele Dinge sind mir immer noch suspekt, aber ich arbeite daran.

Alles Gute für Euch

Rene

MzKlMu

Hallo,
ZitatViele Dinge sind mir immer noch suspekt, aber ich arbeite daran.
Dann würde ich auch mal über meinen Einwand/Hinweis in meiner Antwort weiter oben (#6) nachdenken.
Du machst gleich zu Beginn der Datenbank handwerkliche Fehler. Man speichert keine Bestände in einer Datenbank, Bestände werden errechnet.
Nur dann kannst Du Dich auch darauf verlassen.
Gruß Klaus

Beaker s.a.

Hallo Philipp,
Danke, aber was fehlte denn da?
Ich kopiere mir den aus einer Textdatei. Hab's gerade noch mal probiert,
und der Link wie gepostet funzt nicht. Die herauskopierte Adresse direkt
im Browser eingegeben funzt.
Deine Änderung funzt natürlich auch, nur der Unterschied will sich mir
leider nicht zu erkennen geben.  >:(
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)