Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" 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,

nun glaube ich, dass ich es Dank Eurer Hilfe nun hinbekommen habe, der Hinweis von Lachtaube hat auch geholfen, denn ich hatte vorher offensichtlich keine Ereignisprozedur (sondern den Ausdruck nur in das Feld geschrieben).

Das zu berechnende Tabellenfeld D gibt den in E berechneten Wert wieder, das klappt also  :).

Noch eine kleine Frage: Wie kann ich vermeiden, dass das berechnete Feld E erst den Focus erhalten muss, damit die Speicherung im Feld D erfolgt (zumindest war das bei mir so) ?

Schon mal vielen Dank, das war ein grosser Schritt nach vorne.

Jochen

P.S.: Ich nehme auch mit, dass es zielführender ist, das Problem zunächst anhand einer Beispieldatenbank nachzustellen. Leider kann ich sie nicht nicht hochladen, da (Access 2010) im accdb-Format. Wie kann ich das bewerkstelligen ?
_______________
Access 2010

MzKlMu

Hallo,
ZitatWie kann ich das bewerkstelligen ?
Beispieldb erstellen > Komprimieren/reparieren > Zipfile erstellen > Zipfile hochladen.
Gruß Klaus

Lachtaube

Verwende das Vor Aktualisierung Ereignis des Formulars. Und wie gesagt, genügt es, wenn das Zielfeld in der Datenherkunft des Formulars vorhanden ist. Du musst kein Steuerelement dafür verwenden. Dasselbe Ergebnis zweimal anzuzeigen bringt ja schließlich keinen Mehrwert.
Grüße von der (⌒▽⌒)

Jochen1

Guten Morgen,

so, nun die gezippte Beispieldatenbank.

Im Formular ist -für Testzwecke- noch das Tabellenfeld D enthalten, um zu sehen, in welchem Zeitpunkt der Wert in die Tabelle geschrieben wird.

Ich habe die Formel nun in der Ereignisprozedur "VorAktualisierung" (der einzelnen Felder), nur leider scheint auch in diesem Fall D erst nach Fokusverlust von E aktualisiert zu werden.

Wenn wir das noch lösen könnten, wäre es perfekt.

Schon jetzt vielen Dank für Eure Geduld und Unterstützung !

Jochen

P.S. Nun hoffe ich auch, dass es keine Zeichenbeschränkung gibt.....

_______________
Access 2010

DF6GL

#19
Hallo,


siehe Anhang

btw:
wie schon erwähnt, ist das Speichern  berechneter Werte Unsinn.

Lachtaube

#20
@Jochen,

die Berechnung in VBA zu wiederholen ist dann doch etwas kontraproduktiv.

VBA-Modul des Formulars
Option Compare Database
Option Explicit

Private Sub A_BeforeUpdate(Cancel As Integer)
   'Me!D = [A] + [B] + [C]
   Me.Text24 = Me.E 'über den Namen des Steuerelements
End Sub

Private Sub B_BeforeUpdate(Cancel As Integer)
   'Me!D = [A] + [B] + [C]
   Me.D = Me.E 'das sieht man erst nach dem Speichern des Datensatzes
End Sub

Private Sub C_BeforeUpdate(Cancel As Integer)
   'Me!D = [A] + [B] + [C]
   Me.Text24 = Me.E
End Sub

'Mit einem weiteren Feld 'F' als Zielfeld der Berechnung
'in der Tabelle, ohne dass es an ein Steuerelement gebunden
'ist, erfordert weitaus geringeren Aufwand.''Datenherkunft neu setzen, damit das Formular 'F' kennenlernt.
Private Sub Form_BeforeUpdate(Cancel As Integer)
   Me.F = Me.E
End Sub


Eine Aktualisierungsabfrage für ein Feld G, könnte so aussehen. (In die SQL-Ansicht einer neuen Abfrage kopieren.)
UPDATE tbl_A AS a
SET    G = a.A + a.B + a.CWHERE  G Is Not Null;


PS:wenn Deine Ausgangsfelder auch Null-Werte enthalten können, verwende in den Ausdrücken die Nz()-Funktion. Also in E: =Nz([A];0)+Nz(;0)+Nz([C];0). In der SQL-Ansicht wäre das Semikolon gegen ein Komma auszutauschen.

PPS: und findet eine Änderung von A, B oder C außerhalb des Formulars statt, ist das Ergebnis garantiert falsch und muss durch eine Aktualisierungsabfrage erneuert werden. Besser sicherer wäre es jedoch, ab Access 2010 ein Datenmakro zu verwenden.


Generell sei noch angemerkt, dass die Datenform im Beispiel der Aufzählungsfelder A, B, C wegen, besser in eine andere Struktur übergeführt werden sollte, um dann z.B. mit der Sum()-Aggregatfunktion das Ergebnis ermitteln zukönnen.
IDHerkunftA
1
A
10
3
A
20
4
A
40
5
A
50
1
B
20
3
B
30
4
B
50
5
B
60
1
C
30
3
C
40
4
C
60
5
C
70
Grüße von der (⌒▽⌒)

Jochen1

Hallo,

zunächst vielen Dank für die überarbeitete Datenbank und die Vielzahl von Anregungen, die ich mir als Access-Laie noch zu Gemüte führen muss.

@Klaus:
Danke, ich habe auch grundsätzlich verstanden, keine berechneten Werte in der Tabelle zu speichern.

Vielleicht ist mein Ausgangspunkt aber ein etwas anderer:
Den berechneten Wert E müsste ich (ausserhalb von Access) zunächst mit Excel oder einem Taschenrechner ermitteln. Es ist in der Tat keine Aufgabe für Access. Ich benötige dieses Berechnungsergebnis jedoch, um mit ihm weiterzuarbeiten. Folglich müsste ich also sowieso dafür ein Tabellenfeld definieren und den Wert dann manuell in mein Ausgangsformular (und damit die Tabelle) eingeben. Um mir aber Arbeit zu sparen und gleichzeitig etwaige Berechnungsfehler zu vermeiden, dachte ich, dies gleich durch Access in einer Art Vorstufe in einer Registerkarte erledigen zu lassen. Und der Wert muss auch nicht stets aufs Neue z.B. in einer Abfrage ermittelt werden. Daher denke ich, dass meine Idee in diesem Ausnahmefall erlaubt sein sollte...

@Lachtaube:
Auch Dir vielen Dank auch für die Aktualisierungsabfrage und die VBA Darstellung. Mir glüht nun der Kopf zwischen Ereignisprozedur, VBA und Datenmakro.... Ich muss nun sehen, was das Beste wäre, aber mir gefällt die Lösung mit der Ereignisprozedur in der Beispielsdatenbank ziemlich gut; da ich nicht so bewandert bin, suche ich auch etwas, was ich auch nach einem Jahr noch nachvollziehen kann, sollte ich etwas ändern wollen.

Danke auch für den Strukturhinweis -Das Beispiel und die Zahlen waren jedoch rein fiktiv, ich wollte nur den Mechanismus und die Aktualisierung testen. Dein Vorschlag und der Thread insgesamt ermahnt mich, regelmässig über die Struktur nachzudenken.

Zum PPS: Mir ist klar, dass eine Berechnug dort keinen Sinn macht, wenn sich Daten ändern und dann der Wert im Tabellenfeld "veraltet" ist. Aber: Die Werte ändern sich nicht. Und wenn doch, dann nutze ich ja ausschliesslich dieses Formular. Der Wert, den ich übrigens ermittele, steht ausschliesslich in einer 1:1-Beziehung im Datensatz.

Also nochmals vielen Dank für die Geduld und Hilfe, Ihr habt mir sehr weitergeholfen.

Jochen
_______________
Access 2010

MzKlMu

Hallo,
Zitat@Klaus:
Danke, ich habe auch grundsätzlich verstanden, keine berechneten Werte in der Tabelle zu speichern.
wieso ich, ich habe ja gar nichts mehr dazu gesagt.
Gruß Klaus

Jochen1

Entschuldigung Klaus, ich habe den Franz gemeint.
Jochen
_______________
Access 2010