Access-Forum > Tabelle/Abfrage

Speichern berechneter Werte in der zugrundeliegenden Tabelle

(1/5) > >>

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

MzKlMu:
Hallo,
Du hast viel geschrieben, aber nichts gesagt.

--- Code: ---Me![MeinTabellenfeld] = Me![MeinBerechnetesSteuerelement]
--- Ende Code ---
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.

--- Zitat ---Leider bestehen die Wertermittlungen für XY auch aus komplexen Formeln (Wenn...dann etc.).
--- Ende Zitat ---
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.

PhilS:
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 ?
--- Ende Zitat ---
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.

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).


--- Zitat ---wird die qryA aufgebläht
--- Ende Zitat ---
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.

--- Zitat ---Leider bestehen die Wertermittlungen für XY auch aus komplexen Formeln (Wenn...dann etc.).
--- Ende Zitat ---
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.

Jochen1:
Hallo,

vielen Dank für die Antworten.


--- Zitat ---Code:

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.
--- Ende Zitat ---

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

Navigation

[0] Themen-Index

[#] Nächste Seite

Beim Bedanken trat ein Fehler auf
Bedanken...
Zur normalen Ansicht wechseln