PDA

Vollständige Version anzeigen : Durchschnittsberechnung


phun
20.09.2001, 12:45
hallo!

folgendes Problem, ich habe eine Tabelle mit verschiedenen Schulfächern als Felder. Jeder Datensatz hat also eine Note pro Schulfach. Nun möchte ich in einem Formular alle Noten für einen Datensatz anzeigen lassen und die Durchschnittsnote für diesen einen Datensatz.

Problem dabei ist, dass nicht in jedem Datensatz alle Fächer auch eine Note haben, das jeweilige Feld ist dann einfach leer.

ich vermute, dass der Ausdrucksgenerator dafür nicht mächtig genug ist... leider kenne ich mich mit VBA überhaupt nicht aus, noch nie was mit gemacht...

Der Asudruck:
=([Noten].[Fach1]+[Noten.Fach2])/2
kann bei einem leeren Fach ja nicht funktionieren...

Das ganze soll wie gesagt in einem Formular stattfinden

schonmal danke für Hilfe!
christian (phun)

Xena
20.09.2001, 13:01
Hi,

evtl. geht es, wenn du zu jedem Feld eine 0 hinzuaddierst.
=((0+[Noten].[Fach1])+(0+[Noten.Fach2]))/2

Obwohl es theoretisch dann auch schon so gehen müsste, da du den ausdruck ja geklammert hast.

Probiers einfach mal aus :)

Gruß Xena ^_^°

phun
20.09.2001, 13:15
danke Xena,

aber da kommt ja dann ein falsches Ergebnis raus, weil er immernoch durch 2 teilt. was ich brauche ist ein Ausdruck oder VBA-code der folgendem Algorithmus entspricht (in etwa)

"teile die Summe aller Noten durch die Anzahl der *belegten* Fächer"

kama
20.09.2001, 13:15
Hallo
=(NZ([Fach1];0)+NZ(Fach2];0)/2

Das müßte im Formular klappen
Aber wenn um den durchschnitt über alle Fächer geht ist das vom Ansatz nicht ganz richtig. Beispiel=
Fach1=6
Fach2=Istleer weil kein Unterricht, es wird mit der Formel 0 gesetzt
Also Summe =6
Durchschnitt=3 (Das finde ich aus der Sicht des Schülers gut)
Am Besten wäre es wenn du dein DB Design nochmal überdenken würdest
Zwei tabellen
Schüler>>Felder>>ID+Persönliche daten

Noten>>>Felder
ID/Fach/Note
das ganze über eine 1:n über die ID verbinden
Das erlaubt dir vielfältige Abfrageoptionen
Da wo keine Noten zu vergeben sin gibts dann auch für den Jeweiligen Schüler keinen Eintrag und Anzahl=tatsächliche Anzahl Fächer.
Und so kommt mann wieder zu seiner 6

Ikke
20.09.2001, 13:30
hallo Christian,
leider habe ich für Dich nur eine Lösung mit Code, dafür aber mit einer recht genauen Anleitung. Leider arbeite ich gar nicht mit den Berechnungsausdrücken, wie Du es beschrieben hast, so daß ich Dir leider keine andere Lösung liefern kann, aber probier es einfach mal so.
Dein Problem ist wohl, daß die leeren Notenfelder das Ergebnis der Durchschnittsberechnung verfälschen.
Also gehe im Datenbankfenster auf Module und lege ein Modul an.
In dieses Modul kopiere die folgende Funktion:

Public Function MittelwertBerechnen()
Dim i As Integer, Zähler As Integer, Feld As String
Zähler = 0
Forms("DerNameDesFormulars")("Durchschnitt") = 0
For i = 1 To 5
Feld = "Fach" & i
If Not IsNull(Forms("DerNameDesFormulars")(Feld)) Then
If Not IsNull(Forms("DerNameDesFormulars")("Durchschnitt")) Then
Forms("DerNameDesFormulars")("Durchschnitt") = Forms("DerNameDesFormulars")("Durchschnitt") + Me(Feld)
Zähler = Zähler + 1
End If
End If
Next i
Forms("DerNameDesFormulars")("Durchschnitt") = Forms("DerNameDesFormulars")("Durchschnitt") / Zähler
End Function

Die Zeilen die schon in dem leeren Modul stehen solltest Du nicht überschreiben!
In dem Code mußt Du noch DerNameDesFormuars durch den Namen Deines Formulares ersetzen, aber lass die Anführungszeichen stehen!
In dem Code gehe ich von dem Folgenden aus:
1. Das Feld mit der Note heißt "Fach1" bis "FachX"
2. Es gibt nicht mehr als 5 Fächer. Wenn es mehr gibt, dann mußt Du in der Zeile
For i = 1 to 5
die 5 durch die Anzahl der Fächer ersetzen.
3. Das das Ergebisfeld "Durchschnitt" heißt und als Format ein Zahlenformat eingestellt wurde.
Nun bitte das Modul speichern.
Jetzt solltest Du eigentlich nur noch in das Formular gehen müssen und dort bei dem Ereignis "Nach Aktualisierung" von Fach1 den Ausdrucksgenerator aufrufen. Hier wählst Du unter Funktionen den unteren Punkt. Nun sollte ganz rechts der Name der eben geschrieben Funktion stehen. Diese bitte doppelklicken und mit OK bestätigen.
Jetzt sollte was hinter "Nach Aktualisierung" stehen, daß bitte kopieren und bei jedem Noten-Feld bei dem gleichen Ereignis wieder einfügen.
So müßte das eigentlich klappen.
Wenn das zu kompliziert klingt, dann probier es einfach mal, und wenn es dann zu kompliziert ist, dann mußt Du leider auf jemanden warten, der das auf Deine angedachte Methode machen kann.... ;)

Ikke
20.09.2001, 13:32
Vom Ansatz her kann ich kama nur zustimmen. Mit den von ihm beschriebenen Tabellen bist Du viel flexibler, weil Du Dich nicht in der Anzahl der Fächer festlegen mußt! ;)
Allerdings wird es dadurch nur noch komplizierter.... :(
Kommt halt drauf an, was Du mit der Datenbank machen willst!

phun
20.09.2001, 13:58
wow, hey danke!

werde gleich mal versuchen das umzusetzen!
würde mich gern irgendwie revangieren, weiß aber nicht wie :-/

Ikke
20.09.2001, 16:27
Wie wär's z.B. mit 'nem Kasten Bier?

*Nee das war jetzt ein Scherz*!!!! ;)

Sascha Trowitzsch
20.09.2001, 17:12
@phun:

Um bei deinem obigen Beispiel zu bleiben:

=([Noten].[Fach1]+[Noten.Fach2])/-(Not(IsNull([Noten].[Fach1])) + Not(IsNull([Noten].[Fach2])))

Problem: Wenn alle Fächer leer sind...

Eine Abfrage wäre natürlich sinnvoller.


Ciao, Sascha

kama
21.09.2001, 07:36
Abenteuerlich, aber es klapt doch nicht!!!

=Wenn(IstNull([fach1]);[Fach1]+0,000000000000001;[fach1]+Wenn(IstNull([fach2]);[Fach2]+0,000000000000001;[fach2]))/(Abs(Nicht (IstNull([fach1])))+Abs(Nicht (IstNull([fach2]))))

Aber ich arbeite noch dran