Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Speichern berechneter Werte in der zugrundeliegenden Tabelle

Begonnen von Jochen1, Oktober 08, 2018, 17:49:37

⏪ vorheriges - nächstes ⏩

Jochen1

Hallo,

nach langem Experimentieren mit meinem Problem benötige ich Eure Unterstützung, da ich nicht weiterkomme und wäre dankbar, wenn Ihr mir (erneut) helfen könntet.

Ich nutze Access 2010 und besitze ein Formular frmA, dessen Datenherkunft auf Tabelle tblA beruht. Das frmA besitzt für bessere Übersichtlichkeit auch mehrere Registerkarten. Die in das frmA (bzw. dessen Registerkarten) eingegebenen Daten werden (neben den Daten weiterer Tabellen) in mehreren unterschiedlichen Abfragen, Formularen und Berichten weiterverarbeitet.

Der Ausgangspunkt meines Problems liegt darin, dass es mir bisher nicht gelungen ist, die in frmA (in einem Steuerelement auf einer Registerkarte) vorgenommene Berechnungen mit den Ergebnissen XY in den entsprechenden Feldern der zugrundeliegenden Tabelle (tblA) zu speichern.

Mir ist bewusst, dass dieses Vorhaben unüblich und idR nicht zu empfehlen ist, aber in meinem Fall sinnvoll, denn die Werte XY werden nur einmal berechnet und dann nicht mehr verändert. Sie sollen aber für einen späteren Vergleich in  bzw. für diesen Datensatz weiterhin zur Verfügung stehen.

Weil ich die Werte XY bisher nicht speichern kann, berechne ich diese Werte statt in dem frmA nun in der qryA, in der auch sonst alle weiteren Berechnungen zentral durchgeführt werden. Die Daten gelangen dann in das frmA per DomWert-Abfrage. Die Daten werden in frmA angezeigt, da sie eine Entscheidungsgrundlage für die Eingabe der weiteren Daten bilden.

Diese Vorgehensweise ist leider nicht optimal, denn zum einen wird die qryA aufgebläht und die Berechnung erfolgt für XY unnötigerweise stets aufs Neue. Das Rückspielen von XY in das frmA per DomWert ist auch zeitraubend und die Performance insgesamt leidet.

Folgendes habe ich bisher versucht:

1. Mittels einer Ereignisprozedur im berechneten Steuerelement:

a) Berechnung XY im frmA; in Eigenschaften ,,NachAktualisieren" des berechneten Steuerelementes habe ich
Me![MeinTabellenfeld] = Me![MeinBerechnetesSteuerelement]
eingegeben (Quelle: DonKarl FAQ 4.11). Das funktioniert leider nicht. ,,VorAktualisieren" hilft auch nicht. Was mache ich falsch ?
b) Liegt dies evtl daran, dass das berechnete Steuerelement sich auf einer Registerkarte befindet und ich es anders ansteuern muss ? Ich habe allerdings in Erinnerung, dass Registerkarten für die Ansteuerung bzw. Verwendung eines Steuerelementes keine Bedeutung besitzen.

2.) Berechnetes Feld in tblA

Eine gute Lösung für mich wäre ein berechnetes Tabellenfeld, auch wenn die Nutzung eines berechneten Feldes nicht den üblichen Konventionen entspricht. Daher habe ich meine ursprüngliche Access-mdb (2000) in das Format Access 2007-2010 konvertiert und alles importiert. Das hat grundsätzlich (bis auf wenige Ausnahmen) gut geklappt.
Einzelne Felder in der Tabelle liessen sich testweise auch reibungslos berechnen, also grundsätzlich eine gute Alternative für mich.

Leider bestehen die Wertermittlungen für XY auch aus komplexen Formeln (Wenn...dann etc.). Leider erhalte ich dann die Fehlermeldung: ,,Die Eigenschaftseinstellung kann nicht grösser als 2KB sein, Fehler 3309." Dies stellt mich vor neue ungeahnte Herausforderungen.... Kann man die Speichergrösse für die ,,Eigenschaften" irgendwo (in der Registry ?) ändern, und wie ?

3. Datenherkunft frmA ändern

Es ist leider idF auch keine Lösung, die Datenherkunft von frmA auf eine qry umzustellen, da ich dann überhaupt keine eingegebenen Werte aus frmA mehr in tblA speichern kann. Das hatte ich vorher und auf Anraten in diesem Forum in tblA geändert http://www.access-o-mania.de/forum/index.php?topic=21298.msg121015#msg121015.

4. Separate Tabelle für XY

Ich könnte vermutlich auch die Felder für XY in eine separate Tabelle tblB auslagern und die Tabellen verküpfen, dennoch muss ich die Berechnungen dann auch erst einmal in tblB bekommen....

Lange Rede kurzer Sinn:
Wie bekomme ich die in frmA errechneten Werte in die Datenfelder der tblA, bevorzugt mittels einem der Lösungsansätze aus 1. oder 2. ?

Ich hoffe, ich habe mein Problem verständlich geschildert und würde mich freuen, wenn mir jemand aus diesem Forum den entscheidenden Lösungshinweis für diesen Schlamassel geben könnte !

Vielen Dank und Grüße,
Jochen
_______________
Access 2010

MzKlMu

#1
Hallo,
Du hast viel geschrieben, aber nichts gesagt.
Me![MeinTabellenfeld] = Me![MeinBerechnetesSteuerelement]Das müsste funktionieren. Beide Felder müssen aber auf dem Formular vorhanden sein und das Formularfeld "MeinTabellenfeld" muss an das entsprechende Tabellenfeld gebunden sein. Die Registerkarten spielen keine Rolle. Das Speichern von berechneten Werten ist aber zu vermeiden, wie Du ja bereits erkannt hast.
ZitatLeider bestehen die Wertermittlungen für XY auch aus komplexen Formeln (Wenn...dann etc.).
Formeln mit wenn ... Dann sind fast immer ein Hinweis auf ein nicht normalisiertes Datenmodell. Auch Domwert sollte in einer korrekt aufgebauten Datenbank nicht erforderlich sein.

Ich denke, da ist bereits die Grundstruktur ungeeignet und eher excellastig.
Kannst Du mal ein Bild des Beziehungsfensters posten.
Auch in Deinem (verlinkten Thema) ist zum Datenmodell nichts zu finden.
Gruß Klaus

PhilS

#2
Ich beschränke mich hier mal auf einen Kommentar zu dem berechneten Tabellenfeld...
Zitat von: Jochen1 am Oktober 08, 2018, 17:49:37
Eine gute Lösung für mich wäre ein berechnetes Tabellenfeld,
[....]
Eigenschaftseinstellung kann nicht grösser als 2KB sein, Fehler 3309." Dies stellt mich vor neue ungeahnte Herausforderungen.... Kann man die Speichergrösse für die ,,Eigenschaften" irgendwo (in der Registry ?) ändern, und wie ?
Nein, das Limit für die Textlänge des Ausdrucks lässt sich nicht ändern.
Macht aber auch nichts, weil dir ein Berechnetes Feld in der Tabelle nicht wirklich weiterhilft. Das Berechnete Feld wird bei einer Änderung der Ausgangswerte immer automatisch neu berechnet. Bringt dir also gar nichts, wenn du das in der Vergangenheit errechnete Ergebnis als Referenz speichern willst.

Grundsätzlich schließe ich mich Klaus' Meinung an. Dass dein Ausdruck länger als 2000 Zeichen sein muss, kann ein Anzeichen für ein suboptimales Datenmodell sein.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

Berechnungen -  was steckt wirklich dahinter?
Eine Multiplikation mit 1 würde ich nicht speichern, das berechnete Klima für die nächsten 10 Jahre schon (weil es einfach Riesenaufwand ist).

Zitatwird die qryA aufgebläht
Wie darf man sich das vorstellen?
Ich habe schon einige Abfragen geschrieben und andere bei solchen unterstützt, ein solches Phänomen ist mir noch nie begegnet.
ZitatLeider bestehen die Wertermittlungen für XY auch aus komplexen Formeln (Wenn...dann etc.).
Auch da fehlt mir eine Vorstellung. Was ist an Wenn-Dann komplex?
Formeln sind eine Anleihe aus Excel, Wenn-Dann-Kaskaden auch. Wenn Du also versuchst, Excellogik in einer Datenbank 1:1 umzusetzen, so kann das durchaus anstrengend sein. Vielleicht versucht man es mit Datenbanklogik ...? Es könnte die Herausforderungen in ganz andere Bereiche verschieben.
Mit freundlichem Glück Auf!

Eberhard

Jochen1

Hallo,

vielen Dank für die Antworten.

ZitatCode: [Auswählen]

Me![MeinTabellenfeld] = Me![MeinBerechnetesSteuerelement]

Das müsste funktionieren. Beide Felder müssen aber auf dem Formular vorhanden sein und das Formularfeld "MeinTabellenfeld" muss an das entsprechende Tabellenfeld gebunden sein.

Vielen Dank für diesen Hinweis, ich hatte bisher [MeinTabellenfeld] nicht zusätzlich auf dem Formular, das habe ich nun nachgeholt. Das Feld besitzt den gleichen "Namen" und "Steuerelementinhalt" wie das Feld der zugrundeliegenden Tabelle (damit ist es doch an diese Tabelle gebunden ?).

In den Eigenschaften von [MeinBerechnetesSteuerelement] steht in "NachAktualisieren" die obige Formel.

Leider funktioniert die Speicherung des Wertes in [MeinTabellenfeld] (immer noch) nicht, in tblA wird nichts geschrieben.

Meine Vermutung ist, dass durch "NachAktualisieren" das Ereignis nicht ausgelöst wird.

Zu Euren Anmerkungen:
Vielen Dank dafür. Es mag sein, dass die Datenbankstruktur (nach Euren Massstäben) nicht optimal ist, ich glaube aber, dass dies in diesem Fall und für meine Frage zunächst von untergeordneter Bedeutung ist. Ich denke selbstverständlich darüber nach, sie zu verbessern (was aber zu anderen Problemen und Mehraufwand an anderer Stelle führt).

Die "Wenn Dann Berechnung" benötige ich für die Berechnung unterschiedlicher Werte, je nach zugrundeliegendem Datensatz. Beispiel "Positionsgrössenberechnung" für Wertpapiere: Die Anzahl der zu erwerbenden Wertpapiere ermittelt sich nach einer anderen Formel, je nachdem, ob es sich um eine Aktie oder z.B. ein Zertifikat (wg. Basispreis und Bezugsverhältnis) handelt. Dieser ermittelte Wert, nämlich die "Plan-Anzahl" wird im Formular angezeigt (und für die Ermittlung voraussichtlicher Anschaffungskosten weiterverwendet). Er soll für einen späteren Vergleich gespeichert werden. Wie bereits geschrieben, ändern sich die Ausgangswerte in der Zukunft nicht mehr. Das Ergebnis muss daher auch nicht stets neu in der Abfrage qryA berechnet werden (in qryA). Dann entfällt auch die DomWert-Zurückspiegelung ins Formular.

M.E. ist daher die Wenn..Dann Formel m.E. nicht excellastig, sondern der Berechnungsstruktur geschuldet. Für ein berechnetes Tabellenfeld ist sie allerdings offensichtlich zu lang (nicht zu "komplex"), so dass die Summe der Eigenschaften dann die 2KB überschreitet.

Daher wäre ich Euch wirklich sehr dankbar, wenn Ihr mir helft, den Wert irgendwie in die Tabelle zu speichern. Evtl. teile ich die Tabelle später weiter auf, um die Struktur zu verbessern, zunächst muss ich aber dieses Problem lösen.

Viele Grüße,
Jochen
_______________
Access 2010

DF6GL

Hallo,

es ist (mir) nicht klar, wie und wo diese Berechnungen denn nun gemacht werden...

Das Ergebnis steht in einem Feld namens "MeinBerechnetesSteuerelement",  aber wo und wie gibst Du die Anfangswerte und den Algorithmus ein?


Lachtaube

Bei allen Steuerelementen, die in die Berechnung einfließen, muss das Nach Aktualisierung Ereignis herangezogen werden, damit der Feldinhalt in das berechnete Feld eingetragen wird. Hast Du z.B. Einzelpreis, Steuersatz und Mengenangabe, um den Gesamtpreis zu ermitteln, müsste für jedes der drei Steuerelemente das Nach Aktualisierung Ereignis genutzt werden, weil jede Änderung in einem der Steuerelemente das Ergebnis der Berechnung beeinflusst. Im Feld mit dem Rechenausdruck findet kein Aktualisieren statt.
Die zweite Variante ist bei vielen abhängigen Feldern weitaus weniger aufwendig.
Eine andere Methode wäre, die Berechnung von einer Aktualisierungsabfrage erledigen zu lassen.

PS: Es muss kein Steuerelement im Formular für den Emmpfang der Berechnung bereitgestellt werden. Es genügt, wenn das Feld in der Datenherkunft (bei einer Tabelle ist das immer der Fall, bei einer Abfrage ist das Feld in die Feldliste aufzunehmen) vorhanden ist.
Grüße von der (⌒▽⌒)

Jochen1

#7
Hallo,

danke für Eure Antworten.

@Klaus:
Das frmA ist an die tblA gebunden. Die Tabellenfelder A, B, und C befinden sich jeweils als Steuerelement auf dem Formular. Hier werden die Ausgangsdaten eingegeben (und mithin in der Tabelle in A, B, und C gespeichert). D ist ein Tabellenfeld. Das berechnete Steuerelement "E_Berechnet"] befindet sich auch auf dem Formular. Steuerelementinhalt von E_Berechnet: 'A+B+C'. Das Ergebnis soll gespeichert werden.

@Lachtaube:
Das klingt nach einem echten Lichtblick ! Etwas Ähnliches hatte ich schon einmal in einem anderen Forum gelesen, aber irgendwie nicht verstanden, es umzusetzen.
Wenn ich es nun richtig verstehe, muss ich nun in allen zugrundeliegenden Feldern auf dem Formular (d.h. hier den Feldern A, B und C) jeweils in "NachAktualisierung" eingeben:

Me![D] = Me![E_Berechnet]

Stimmt das so ? Dann werde ich es so ausprobieren.

Die Aktualisierungsabfrage ist auch eine gute Idee.

Viele Grüße,
Jochen
_______________
Access 2010

Jochen1

@Lachtaube:
Bei "NachAktualisieren" passiert in "E_Berechnet" leider nichts.
Wenn ich aber den Ausdruck  "Me![D] = Me![E_Berechnet]" in "BeiFokusverlust" eingebe, erhalte ich eine Fehlermeldung:

ZitatDieser Ausdruck hat einen Fehler verursacht: Das Objekt enthält das Automatisierungsobjekt `Me`nicht.

Die Erläuterung zu dem Fehler (Eigenschaft des Formulars bei OnOpen steht auf "Field") verstehe ich auch nicht, denn ich sehe in den Eigenschaften des Formulars nichts diesbezügliches, oder wo muss ich nachsehen ?

Viele Grüße,
Jochen


_______________
Access 2010

Beaker s.a.

Hallo Jochen,
ZitatMe![D] = Me![E_Berechnet]
Stimmt das so ? Dann werde ich es so ausprobieren.
Nein.
Me!E_Berechnet = DeinBerechnungsergebnis
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)

Jochen1

Hallo ekkehart,

danke, nur: Das verstehe ich nicht. Um im Beispiel zu bleiben, bedeutet es im Feld A (und B,C) dann unter "NachAktualisieren":

Me!E_Berechnet = A+B+C
oder vielmehr
Me!D = A+B+C

(denn E_Berechnet ist ja kein Tabellenfeld) ? Und 'Me!E_Berechnet = A+B+C' wird ja nicht benötigt, denn das Feld wird ja bereits auf dem Formular automatisch mit A+B+C berechnet und muss ja nicht extra durch "NachAktualisieren" angestossen werden.

Ich stehe auf dem Schlauch, vielleicht, weil ich nicht weiss, was mit "DeinBerechnungsergebnis" in diesem Beispiel gemeint ist.
Jochen
_______________
Access 2010

Lachtaube

@Jochen,

damit wir vom selben sprechen. Alle hier und in den bei Don Karl gezeigten/erwähnten Anweisungen stellen VBA-Code dar. Du musst also für die Ereignisse jeweils eine Ereignisprozedur einstellen (über den Dropdown-Pfeil im Eigenschaftsblatt) und danach auf den Knopf rechts daneben mit der Ellipse (...) klicken. Dann bist Du (anfangs einmalig nach kurzer Wartezeit) im VBA-Editor. Access erstellt dabei den Rumpf der Ereignisprozedur selbstständig. Der Code gehört dann in eine leere Zeile zwischen Private Sub Steuerelementname_AfterUpdate() und End Sub.
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo Jochen,
Zitatbedeutet es im Feld A (und B,C) dann unter "NachAktualisieren":
Ja bzw.
Me!DeinTabellenFeldMitErgebnis = A+B+C
(NULL-Werte müssten dabei noch abgefangen werden)

Zitatweil ich nicht weiss, was mit "DeinBerechnungsergebnis
Na, dies
ZitatDie "Wenn Dann Berechnung" benötige ich für die Berechnung unterschiedlicher Werte
Hier kommt doch ein Wert zurück, den du speichern willst; - oder habe
ich das falsch verstanden?
Vielleicht zeigst uns diesen Code auch einmal.

gruss ekkehard

edit:
Gerade Lachtaubes Post gelesen, also
Private Sub FeldA_AfterUpdate()   ' oder B oder C
    Me!DeinTabellenFeldMitErgebnis = DeinBerechnungsergebnis
End Sub
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)

Jochen1

Hallo,

danke, das klappt leider nicht. Ich glaube, es ist am Einfachsten, ich erstelle eine kleine Beispielsdatenbank mit Formular und Werten und lade sie morgen früh hoch. Dann wird mein Fehler wahrscheinlich deutlich.

Danke,
Jochen 
_______________
Access 2010

Beaker s.a.

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)