Felder multiplizieren, summieren und aktualisieren

Guten Tag,

ich arbeite an einer Datenbank, die u.a. die Tabellen Artikel und Lagerplätze hat. In der Tabelle Artikel gibt es das Feld Istlagerwert. In der Tabelle Lagerplätze sind alle Lagerplätze aufgelistet mit Artikeln und Platzmengen. Ein Artikel kann also auf mehrere Lagerplätze verteilt sein.

Per Aktualisierungsabfrage möchte ich nun von Zeit zu Zeit das Feld Istlagerbestand aktualisieren (Ich habe auch eine VBA Prozedur, die dies beim Einlagern automatisch macht, möchte aber trotzdem die Ergänzung).
Aktualisiert werden soll das Feld durch Multiplikation des gesamten jeweiligen Bestandes (von allen Lagerorten)mit dem jeweiligen Artikelpreis.

Lösung 1:
In Aktualisierungszelle: [Einzelpreis]*[Platzmenge]
Problem:
Wenn der Artikel auf mehreren Lagerplätzen liegt, wird nur DER Wert gespeichert, der das Ergebnis der letzten aufgerufenen Platzmenge*Preis ist.
-> Man müsste Aufsummieren

Lösung 2:
In Aktualisierungszelle: [Istlagerwert]+[Einzelpreis]*[Platzmenge]
nach dem Motto i=i+1!
Problem:
Da vorher schon etwas in Istlagerwert steht, wird dieser alte Wert dazuaddiert.
-> Man müsste die Spalte vorher auf 0 setzen.

Ich weiß leider nicht, wie ich meinen Wunsch in EINER AktualisierungsAbfrage einstellen kann, könnte mir aber vorstellen, dass ich nur etwas entscheidendes übersehe.

Ich freue mich über jeden Tipp. Danke!

Hallo,

„dass ich nur etwas entscheidendes übersehe.“

so ist es, genau dieses: es werden überhaupt keine berechneten Werte (akt. Werte, die sich aus Berechnungen von anderen Werten ergeben, z. B. hier der akt. Lagerbestand aus den Lagerbuchungen eines Artikels) in einer Tabelle gespeichert.

Solche „Auswertungen“ erfolgen nur über geeignete Abfragen, die dann immer bei Ausführung das genaue und akt. Ergebnis liefern.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Ich muss zugeben, dass ich Ihre Antwort in Bezug auf meine Frage nicht verstehe.

Per Aktualisierungsabfrage kann ich sehr wohl Daten in einer Tabelle ändern, dafür ist die Akt-Abfrage doch da! Mein Problem ist lediglich, dass ich nicht nur eine einfache Multiplikation ausführen möchte, sondern zusätzlich summieren möchte. Dies nimmt Access jedoch nicht an.

Evtl ein Bespiel zur Verdeutlichung (Tabellen sind verknüpft über Artikel)

Tabelle Artikel:
Artikel A - Preis 20€ - Istlagerwert

Tabelle Lagerplätze;
001 - Artikel A - Menge 20
002 - Artikel A - Menge 10

Wenn ich nun per Akt-Abfrage rechne [Preis]*[Menge] speichert er nur 10*20€ im Feld Istlagerwert.

Moin,

Ich muss zugeben, dass ich Ihre Antwort in Bezug auf meine
Frage nicht verstehe.

Franz meint wahrscheinlich, dass die Speicherung eines Wertes, der sich jederzeit berechnen lässt, als Kunstfehler anzusehen ist. Grund: Sobald sich an den Mengen auf den Lagerplätzen etwas ändert, steht in „Summenprodukt“ ein falscher Wert. Aber sei’s drum, wir schauen mal weiter.

Wenn ich nun per Akt-Abfrage rechne [Preis]*[Menge] speichert
er nur 10*20€ im Feld Istlagerwert.

Bei Aktualisierungsabfragen lohnt sich oft eine isolierte betrqachtung des Selcet-Teiles, also erstmal ohne den Update prüfen, ob die Werte richtig berechnet werden. Wenn das gesichert ist, den Select umwandeln in eine Aktualisierungsabfrage und gucken, was dann passiert - die Jet-Engine kommt mit Selbstbezügen nicht gut zurecht.

Gruß Ralf

ps: Hier im Forum ist das Duzen üblich, Siezen wird als Distanzierung aufgefasst. Ihrzen hingegen wird gern gesehen :smile:))

Ich muss zugeben, dass ich Ihre Antwort in Bezug auf meine
Frage nicht verstehe.

In der Tat habe ich auch nicht auf die Frage direkt bezogen geantwortet, weil die beschriebene Vorgehensweise nicht zielführend sein wird.

Per Aktualisierungsabfrage kann ich sehr wohl Daten in einer
Tabelle ändern, dafür ist die Akt-Abfrage doch da!

das ist auch unbestritten. Falsch ist, dynamische (berechnete) Werte in Tabellen zu speichern, egal ob über Aktualisierungsabfragen oder sonstwie (z. B. Recordsets)

Mein
Problem ist lediglich, dass ich nicht nur eine einfache
Multiplikation ausführen möchte, sondern zusätzlich summieren
möchte. Dies nimmt Access jedoch nicht an.

weil halt die SQL falsch ist. Außerdem werden Folgeprobleme auftauchen.

Evtl ein Bespiel zur Verdeutlichung (Tabellen sind verknüpft
über Artikel)

Tabelle Artikel:
Artikel A - Preis 20€ - Istlagerwert

Tabelle Lagerplätze;
001 - Artikel A - Menge 20
002 - Artikel A - Menge 10

Wenn ich nun per Akt-Abfrage rechne [Preis]*[Menge] speichert
er nur 10*20€ im Feld Istlagerwert.

Update Tabelle1 set Istlagerwert = Preis *(select Sum(Menge) as GesamtMenge from Tabelle2 where Tabelle2.Artikel=Tabelle1.Artikel)

Ersteinmal Danke für eure Hilfe! :smile:

ps: Hier im Forum ist das Duzen üblich, Siezen wird als Distanzierung :aufgefasst. Ihrzen hingegen wird gern gesehen :smile:))

Damit komme ich gut klar, sorry an Franz :wink:

das ist auch unbestritten. Falsch ist, dynamische (berechnete)
Werte in Tabellen zu speichern, egal ob über
Aktualisierungsabfragen oder sonstwie (z. B. Recordsets)

Evtl sollte ich dazu sagen, dass ich Student bin und ich Access für eine Klausur lerne. Die Aufgabe lautet jedoch, dass man anhand einer Aktualisierungsabfrage die Werte in dem Lagerwert-Feld berechnen soll.
Da dies die Aufgabe ist, versuche ich nur diese zu lösen :wink:

Ein Teil von mir versteht, warum das falsch ist, da es ja keine Stamm- oder Bewegungsdaten sind, die gespeichert werden sondern nur aktuelle Istdaten.
Andererseits, wenn jederzeit die Bestandsmenge, so wie der Bestandswert beim Ein- und Auslagern aktualisiert wird, sehe ich kein Problem in dieser Anwendung, oder doch?

Update Tabelle1 set Istlagerwert = Preis *(select Sum(Menge)
as GesamtMenge from Tabelle2 where Tabelle2.Artikel=Tabelle1.Artikel)

Dürfte ich dich hier um eine Erklärung bitten, wo ich diesen Code einfügen muss? Und, ob GesamtMenge eine Funktion ist, oder sich auf das Feld Menge bezieht?

Ersteinmal Danke für eure Hilfe! :smile:

ps: Hier im Forum ist das Duzen üblich, Siezen wird als Distanzierung :aufgefasst. Ihrzen hingegen wird gern gesehen :smile:))

Damit komme ich gut klar, sorry an Franz :wink:

Entschuldigung ist nicht nötig :wink:

das ist auch unbestritten. Falsch ist, dynamische (berechnete)
Werte in Tabellen zu speichern, egal ob über
Aktualisierungsabfragen oder sonstwie (z. B. Recordsets)

Evtl sollte ich dazu sagen, dass ich Student bin und ich
Access für eine Klausur lerne. Die Aufgabe lautet jedoch, dass
man anhand einer Aktualisierungsabfrage die Werte in dem
Lagerwert-Feld berechnen soll.

sag dem Prof oder Dozent, er soll die Aufgaben demnächst sinnvoll(er) zusammenbasteln.

Da dies die Aufgabe ist, versuche ich nur diese zu lösen :wink:

na denn…

Ein Teil von mir versteht, warum das falsch ist, da es ja
keine Stamm- oder Bewegungsdaten sind, die gespeichert werden
sondern nur aktuelle Istdaten.

das ist der wesentlich Teil…

Andererseits, wenn jederzeit die Bestandsmenge, so wie der
Bestandswert beim Ein- und Auslagern aktualisiert wird, sehe
ich kein Problem in dieser Anwendung, oder doch?

Wie man es nimmt. Latentes Gefahrenpotential besteht und kann real werden, wenn die Akt-Abfrage durch einen anderen Fehler/Defekt nicht ausgeführt wird. Nehmen wir einfach mal Multiuser-Betrieb an.

Update Tabelle1 set Istlagerwert = Preis *(select Sum(Menge)
as GesamtMenge from Tabelle2 where Tabelle2.Artikel=Tabelle1.Artikel)

Dürfte ich dich hier um eine Erklärung bitten, wo ich diesen
Code einfügen muss? Und, ob GesamtMenge eine Funktion ist,
oder sich auf das Feld Menge bezieht?

Klar: Das Ganze ist ein SQL-String, der eine Abfrage darstellt. Du kannst diesen String einfach im Abfrageentwurf unter Ansicht/SQL-Ansicht einkopieren (und nicht vergessen, die Namen anzupassen).

„GesamtMenge“ ist ein Aliasname für den Wert, den die SUM-Funktion in der Abfrage liefert. Der ist zwar nicht dringend nötig, weil Access selber einen internen produziert, dient aber der Lesbarkeit/Verständlichkeit.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Klar: Das Ganze ist ein SQL-String, der eine Abfrage
darstellt. Du kannst diesen String einfach im Abfrageentwurf
unter Ansicht/SQL-Ansicht einkopieren (und nicht vergessen,
die Namen anzupassen).

„GesamtMenge“ ist ein Aliasname für den Wert, den die
SUM-Funktion in der Abfrage liefert. Der ist zwar nicht
dringend nötig, weil Access selber einen internen produziert,
dient aber der Lesbarkeit/Verständlichkeit.

Ich habe eine neue Abfrage erstellt in der Entwurfsansicht, diese zu einer Aktualisierungsabfrage gemacht und dann unter Ansicht SQL den Code eingefügt und mit „meinen“ Namen verändert.

Dann kommt leider der Fehler: Operation muss eine aktualisierbare Abfrage enthalten.

Da SQL kein Bestandteil der Klausur ist, weiß ich, dass diese Lösung wohl nicht die gewünschte ist. (Vlt hat der Prof auch einfach nicht weiter nachgedacht O:smile: ). Wenn du mir trotzdem noch einen Tipp geben könntest, dass ich es für mich hinkriege, würd ich mich freuen. Ansonsten werde ich mich in SQL erst im Sommer einlesen, da kann ich jetzt noch kein Wissen vorweisen :wink:

Ich sage noch mal Danke für die Hilfe :smile:

Philipp

Hallo,

mhmm,

Erstell lediglich eine neue Abfrage und kopier den SQL-String gleich in die SQL-Ansicht ( und pass die Namen an)…

Update Tabelle1 set Istlagerwert = Preis *(select Sum(Menge)
as GesamtMenge from Tabelle2 where Tabelle2.Artikel=Tabelle1.Artikel)

heißt auf „deutsch“:

Aktualisiere in der Tabelle „Tabelle1“ das Feld „Istlagerwert“ so bei jedem Datensatz, als dass der Wert des Feldes „Preis“ mit dem Wert aus der Summe des Feldes (der Domäne) „Menge“ multipliziert wird, die sich aus allen Datensätzen in der Tabelle2 ergibt, bei denen der Wert des Feldes „Artikel“ mit dem Wert des Feldes "Artikel aus dem akt. DS der Tabelle1 übereinstimmt.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!