Automatische Berechnung in Formularen

Liebe Wissende,

eine Frage von einem Access-Anfänger (MS Access 2003), also bitte nicht lachen.

Ich habe eine Tabelle, die über ein Formular mit Daten aktualisiert werden soll.
Nun sollen im Formular bspw. Werte wie Selbstkosten und Verkaufspreis „von Hand“ eingeben werden, der aus diesen Werten resultierende Gewinn oder Verlust soll in entsprechenden Textfeldern automatisch errechnet werden.
Soweit so gut. Es funktioniert auch alles - man kann also Werte im Formular eingeben und verschiedene Textfelder berechnen daraus auch automatisch Werte, nur speichert Access bei den Datensätzen nur die „von Hand“ eingegebenen und nicht die automatisch berechneten Felder (Gewinn bzw. Verlust)in die Tabelle ab.

Bei der automatischen Berechnung habe ich entsprechenden Summenformeln bei den Textfeld-Eigenschaften unter Steuerelementinhalt eingegeben.

Ich möchte nun wissen, wie ich es hinbekomme, dass alle („von Hand“ UND automatisch berechneten) Textfelder als ein Datensatz in die Tabelle in die entsprechende (neue) Zeile eingegeben wird.

Denke für Euch ist das ein einfache Angelegenheit und ich freue mich schon auf Eure Antworten. Vielen Danke vorab,

Mike

Liebe Wissende,

eine Frage von einem Access-Anfänger (MS Access 2003), also
bitte nicht lachen.

Ich habe eine Tabelle, die über ein Formular mit Daten
aktualisiert werden soll.
Nun sollen im Formular bspw. Werte wie Selbstkosten und
Verkaufspreis „von Hand“ eingeben werden, der aus diesen
Werten resultierende Gewinn oder Verlust soll in
entsprechenden Textfeldern automatisch errechnet werden.
Soweit so gut. Es funktioniert auch alles - man kann also
Werte im Formular eingeben und verschiedene Textfelder
berechnen daraus auch automatisch Werte,

ist doch hervorragend. So soll es ja auch sein!

nur speichert Access bei den Datensätzen nur die „von Hand“ eingegebenen und nicht
die automatisch berechneten Felder (Gewinn bzw. Verlust)in die
Tabelle ab.

besser geht es doch nicht. Berechnete Felder sollten niemals gespeichert werden! (von ein paar wenigen Ausnahmen mal abgesehen!)
Bei der von dir beschriebenen Situation liegen die Werte, die du für die Berechnung heranziehst, bereits in der Tabelle vor. Daraus werden die berechneten Felder gefüllt. Die Berechnung sollte ohne Weiteres jederzeit wiederholbar sein. Ein Speichern der berechneten Werte bedeutet, dass du dir selbst eine Redundanz erzeugst… und nebenbei unnötigen Speicherplatz verschwendest.
Zudem, wenn nur ein Ausgangswert verändert wird, die berechneten Werte aber nicht aktualisiert werden, stimmt irgendwann dein Datenbestand nicht mehr…
Dass Access die Werte der Felder nicht in die Tabellen übergibt, liegt daran, dass du die Berechnungen in den Steuerelementinhalt der Felder eingebaut hast. somit sind das ungebundene Felder, denen kein Tabellenfeld zugrunde liegt. Access weiß daher auch nicht, dass der Wert in die Tabelle eingefügt werden sollte, was IMHO aber vollkommen der Datenbanknormalisierung entspricht.

Bei der automatischen Berechnung habe ich entsprechenden
Summenformeln bei den Textfeld-Eigenschaften unter
Steuerelementinhalt eingegeben.

Ich möchte nun wissen, wie ich es hinbekomme, dass alle („von
Hand“ UND automatisch berechneten) Textfelder als ein
Datensatz in die Tabelle in die entsprechende (neue) Zeile
eingegeben wird.

Wenn’s unbedingt sein muss…
Steuerelementinhalt auf das Tabellenfeld stellen, in dem der jeweilige Wert gespeichert werden soll.
In den Ereignissen „Beim Anzeigen/Current“(Formular) und „Nach Aktualisierung/After Update“ der Felder mit manueller Eingabe kannst du die Berechnung hinterlegen und an die Zielfelder die Ergebnisse übergeben…ich würd es aber so lassen, wie es jetzt ist.

Denke für Euch ist das ein einfache Angelegenheit und ich
freue mich schon auf Eure Antworten. Vielen Danke vorab,

Mike

Hi Jan,

und Danke für Deine schnelle Antwort.

Bei der von dir beschriebenen Situation liegen die Werte, die
du für die Berechnung heranziehst, bereits in der Tabelle vor.

Vielleicht habe ich mich falsch ausgedrückt, aber die Werte liegen nicht als Tabelle, sondern als Hardcopy-Datenblatt vor und sollen nun über ein Access-Formular in eine Datenbank eingetippt werden.

Da es in der Vergangenheit öfters zu Fehlern bei der Eingabe kam, sollen nun die Spalten „Gewinn“ und „Verlust“ vom System selbst berechnet werden, was ausserdem die Eingabezeit durch den Einsatz von Formeln verringern soll.

Ein Speichern der berechneten Werte bedeutet, dass du dir selbst
eine Redundanz erzeugst…

Eine Daten-Redundanz kann ich nur eingeschränkt erkennen, weil zwar der Unterschied zwischen Verkaufspreis und Selbstkosten schon dem Gewinn in diesem Fall entspricht, dieser jedoch explizit und einzeln in der Datenbank (in einer entsprechenden Spalte) für jeden Datensatz ausgewiesen werden soll.

Zudem, wenn nur ein Ausgangswert verändert wird, die
berechneten Werte aber nicht aktualisiert werden, stimmt
irgendwann dein Datenbestand nicht mehr…

Für die Dateneingabe soll nur das Formular genutzt werden, bedeutet nach meinem (Anfänger-:smile: )-Verständnis, dass wenn ein manueller Wert im Eingabeformular nachträglich in einem Datensatz geändert wird, sich die automatischen Wert gleichzeitig mitändern.

Dass Access die Werte der Felder nicht in die Tabellen
übergibt, liegt daran, dass du die Berechnungen in den
Steuerelementinhalt der Felder eingebaut hast. somit sind das
ungebundene Felder, denen kein Tabellenfeld zugrunde liegt.
Access weiß daher auch nicht, dass der Wert in die Tabelle
eingefügt werden sollte,…

Ok, das ist der Grund, aber:

Wenn’s unbedingt sein muss…

Ja bitte…

Steuerelementinhalt auf das Tabellenfeld stellen, in dem der
jeweilige Wert gespeichert werden soll.

Ok, also Ausgangssituation wiederherstellen.

In den Ereignissen „Beim Anzeigen/Current“(Formular)

Habe ich leider nirgends gefunden…

„Nach Aktualisierung/After Update“ der Felder mit manueller Eingabe
kannst du die Berechnung hinterlegen und an die Zielfelder die
Ergebnisse übergeben…

Klingt nach VBA, oder? Besonders der Teil mit „An die Zielfelder übergeben“. Kenn mich da leider (noch…?) nicht wirklich aus und werd das so wohl nicht umsetzen können…

Aber trotzdem Danke für Deine Antwort…

Werd noch ein wenig rumbasteln. Vielleicht klappt es ja noch.

Mike

Hi Jan,

und Danke für Deine schnelle Antwort.

Vielleicht habe ich mich falsch ausgedrückt, aber die Werte
liegen nicht als Tabelle, sondern als Hardcopy-Datenblatt vor
und sollen nun über ein Access-Formular in eine Datenbank
eingetippt werden.

hast dich nicht falsch ausgedrückt, genau so hab ich das verstanden.
Du gibst im Form die vorhandenen Werte ein und der Rest soll von Acc. berechnet werden. Die eingegebenen Werte werden sofort an die Tabelle übergeben (macht Access!).

Da es in der Vergangenheit öfters zu Fehlern bei der Eingabe
kam, sollen nun die Spalten „Gewinn“ und „Verlust“ vom System
selbst berechnet werden, was ausserdem die Eingabezeit durch
den Einsatz von Formeln verringern soll.

Dafür werden die Felder nun ja berechnet.
Mal ein einfaches Beispiel! In Feld1 steht der Wert „1“ in Feld2 steht der Wert „2“. In Feld3 wird der Wert errechnet aus Feld1+Feld2, ergibt als Anzeigewert „3“. Da durch die Eingabe in Feld1 und Feld2 die Ursprungswerte vorhanden sind, ist es überflüssig in der Tabelle das Feld3 noch zu speichern. Schliesslich ist bekannt, dass das Ergebnis sich aus den vorhandenen beiden Feldern berechnen lässt.
Gleiches gilt auch bei deinem Formular. Die Formeln für die Berechnung hast du. Gut! Die können bei Bedarf doch immer wieder verwendet werden, um aus den vorhandenen Tabellenfeldern das Ergebnis neu zu berechnen. Klingt aufwändig, ist es aber nicht wirklich.

Eine Daten-Redundanz kann ich nur eingeschränkt erkennen, weil
zwar der Unterschied zwischen Verkaufspreis und Selbstkosten
schon dem Gewinn in diesem Fall entspricht, dieser jedoch
explizit und einzeln in der Datenbank (in einer entsprechenden
Spalte) für jeden Datensatz ausgewiesen werden soll.

und genau das ist der Punkt. Warum den Gewinn explizit speichern, wenn der Verkaufspreis und die Selbstkosten bereits vorhanden sind…

Für die Dateneingabe soll nur das Formular genutzt werden,
bedeutet nach meinem (Anfänger-:smile: )-Verständnis, dass wenn ein
manueller Wert im Eingabeformular nachträglich in einem
Datensatz geändert wird, sich die automatischen Wert
gleichzeitig mitändern.

Wenn ausschliesslich über dieses Form Daten verändert werden, hast du recht!

Dass Access die Werte der Felder nicht in die Tabellen
übergibt, liegt daran, dass du die Berechnungen in den
Steuerelementinhalt der Felder eingebaut hast. somit sind das
ungebundene Felder, denen kein Tabellenfeld zugrunde liegt.
Access weiß daher auch nicht, dass der Wert in die Tabelle
eingefügt werden sollte,…

Ok, das ist der Grund, aber:

Wenn’s unbedingt sein muss…

Ja bitte…

Steuerelementinhalt auf das Tabellenfeld stellen, in dem der
jeweilige Wert gespeichert werden soll.

Ok, also Ausgangssituation wiederherstellen.

In den Ereignissen „Beim Anzeigen/Current“(Formular)

Habe ich leider nirgends gefunden…

Formular in Entwurfsansicht öffnen (sollte logisch sein), im linken oberen Eck des Formularfensters ist ein Kästchen mit einem schwarzen Quadrat drin. Darauf doppelklicken. Es öffnet sich das Formular-Eigenschaftenfenster. Hier solltest du die Zeile „Beim Anzeigen“ im Register „Ereignis“ finden. Dieses Ereignis kannst du aber vernachlässigen, wenn die berechneten Werte wirklich in der Tabelle gespeichert werden…das dient mehr zur Berechnung der Felder, wenn das Formular geöffnet oder der Datensatz gewechselt wird…

„Nach Aktualisierung/After Update“ der Felder mit manueller Eingabe
kannst du die Berechnung hinterlegen und an die Zielfelder die
Ergebnisse übergeben…

Klingt nach VBA, oder? Besonders der Teil mit „An die
Zielfelder übergeben“. Kenn mich da leider (noch…?) nicht
wirklich aus und werd das so wohl nicht umsetzen können…

VBA ist korrekt.
Ich nehme nochmal das Beispiel von oben!

Me!Feld3=Me!Feld1+Me!Feld2

Dadurch wird nicht nur die Berechnung durchgeführt, sondern das Ergebnis an das Zielfeld übergeben.(In diesem wird dann als Steuerelementinhalt das Tabellenfeld stehen und der Wert direkt in die Tabelle geschrieben.)
Um jetzt aber einen Fehler gleich auszuschliessen, würde ich zusätzlich noch prüfen, ob die Quellfelder 1 und 2 überhaupt einen Wert ungleich NULL und ungleich 0 haben. Je nach Rechnenfunktion ergibt das sonst nur eine Meldung von Access.

Aber trotzdem Danke für Deine Antwort…

Werd noch ein wenig rumbasteln. Vielleicht klappt es ja noch.

Mike

1 Like

ganz vergessen…
Hier eine weitere Möglichkeit
FAQ 4.11 von Karl Donaubaur http://www.donkarl.com/FAQ/FAQ4Formulare.htm#4.11

Funktioniert…
Hi Jan,

nochmals Danke für Deine Mühe (s. Bewertungspunkte, die leider zu selten vergeben werden).

Hab jetzt noch ein wenig rumgetüftelt und nun funktioniert es ohne Probleme. Ich hab wohl ein wenig zu kompliziert gedacht, weil im nachhinein war es recht einfach (nachdem Du mir den Grund für das „Nicht-Funktionieren“ in Deinem ersten Posting genannt hast).

Beste Grüße

Mike