Eigentlich ist es ganz einfach: ich habe 1 Tabelle, dort sind z.B. 10 Datensätze = Namen von Schülern also 10 Schüler. Jedem Schüler werden 6 Schulnoten zugeordnet, d.h. es gibt die Spalten: Mathe, Deutsch, Biologie, Chemie, Sport und Geschichte. Nun soll für jeden Schüler die Gesamtdurchschnittsnote berechnet werden. Das Problem ist hierbei, das noch nicht alle Felder gefüllt sind, d.h. es fehlen noch Noten. Trotzdem soll schon ein Durchschnittswert angezeigt werden…Man kann also nicht einfach durch 6 teilen wenn nur 5 Noten eingetragen sind, das verfälscht den Durchschnitt.
Leider bin ich ein Acess Anfänger, habe allerdings schon im Netz nach Lösungen gesucht und ausprobiert. Trotzdem erhalte ich - egal was ich programmiere - immer irgendwelche Fehlermeldungen…Wer kann helfen???
Hallo erstmal!
Es gibt wie so oft mehr als eine Lösung aber eine schnelle, wenn auch nicht sehr professionelle wäre in Deiner Abfrage 3 zusatzliche Felder anzeigen zu lassen. Erstes Feld Summe der Noten, zweites Feld Anzahl der Fächer wo Note > 0 und als drittes Feld das Ergebnis der Divison von Feld 1 / Feld 2.
Gruß Andreas
Vielen Dank für die schnelle Antwort!!!
1.Erstes Feld Summe der
Noten, - habe ich angelegt
aber wie stelle ich das zweite Feld dar?bzw. wie ist der Code oder die Syntax?
Das dritte Feld ist wieder klar
???zweites Feld Anzahl der Fächer wo Note > 0 ???
Gruß Rosali
aber wie stelle ich das zweite Feld dar?bzw. wie ist der Code
oder die Syntax?
Ok, einfach gehts leider nicht aber mach folgendes: Erstell ein neues Modul mit beliebigen Name. Füge den Verweis auf die Microsoft DAO 3.6 Object Library hinzu falls noch nicht vorhanden.
Dann kopierst Dir folgenden Code in das Modul:
Function Notendurchschnitt(ByVal desSchülers As String) As Single
On Error GoTo Err_Notendurchschnitt
Dim dbs As Database
Dim rst As Recordset
Dim sql As String
Dim lngAnzNoten As Long
Dim lngSumNoten As Long
sql = "SELECT Tabelle1.* " _
& "FROM Tabelle1 " _
& „WHERE (((Tabelle1.Schüler)=’“ & desSchülers & „’));“
'sql bitte Tabellenname und Feldname anpassen
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(sql)
With rst
If !Deutsch > 0 Then
lngAnzNoten = lngAnzNoten + 1
lngSumNoten = lngSumNoten + !Deutsch
End If
If !Englisch > 0 Then
lngAnzNoten = lngAnzNoten + 1
lngSumNoten = lngSumNoten + !Englisch
End If
If !Mathe > 0 Then
lngAnzNoten = lngAnzNoten + 1
lngSumNoten = lngSumNoten + !Mathe
End If
'usw. für die anderen Fächer
.Close
End With
dbs.Close
Notendurchschnitt = lngSumNoten / lngAnzNoten
Set rst = Nothing
Set dbs = Nothing
Exit Function
Err_Notendurchschnitt:
MsgBox Err.Number & " " & Err.Description, , „Fehler bei Notendurchschnittsberechnung:“
End Function
In Deiner Abfrage brauchst Du nur das Feld mit dem Schüler Namen und das Feld für den Notendurchschnitt z.B. Durchschnitt: Notendurchschnitt([Dein Feldname für den Schüler])
Habs eben erfolgreich getestet wenns nicht geht, überprüfe ob du die SQL entsprechend Deinen Tabellen- u. Feldnamen angepasst hast.
Gruß Andreas
Hallo Andreas - erstmal viele Dank für die Hilfe - leider klappt es nicht so ganz - möglicherweise weil ich einiges nicht verstehe:
z.B. "Füge den Verweis auf die Microsoft DAO 3.6 Object "???
Ich habe das Modul angelegt und die Feldnamen verändert.
Was bedeutet aber „Tabelle1.Schüler“ wozu brauche ich den Feldnamen „Schüler“? Ich bekomme bei öffnen der Abfrage immer das Fenster „Parameter eingeben“???
Irgendetwas mache ich wohl falsch…
Gruß Rosali
r folgenden Code in das Modul:
Function Notendurchschnitt(ByVal desSchülers As String) As
Single
On Error GoTo Err_NotendurchschnittDim dbs As Database
Dim rst As Recordset
Dim sql As StringDim lngAnzNoten As Long
Dim lngSumNoten As Longsql = "SELECT Tabelle1.* " _
& "FROM Tabelle1 " _
& „WHERE (((Tabelle1.Schüler)=’“ & desSchülers &
„’));“
'sql bitte Tabellenname und Feldname anpassenSet dbs = CurrentDb
Set rst = dbs.OpenRecordset(sql)With rst
If !Deutsch > 0 Then
lngAnzNoten = lngAnzNoten + 1
lngSumNoten = lngSumNoten + !Deutsch
End If
If !Englisch > 0 Then
lngAnzNoten = lngAnzNoten + 1
lngSumNoten = lngSumNoten + !Englisch
End If
If !Mathe > 0 Then
lngAnzNoten = lngAnzNoten + 1
lngSumNoten = lngSumNoten + !Mathe
End If
'usw. für die anderen Fächer
.Close
End Withdbs.Close
Notendurchschnitt = lngSumNoten / lngAnzNoten
Set rst = Nothing
Set dbs = NothingExit Function
Err_Notendurchschnitt:
MsgBox Err.Number & " " & Err.Description, , „Fehler bei
Notendurchschnittsberechnung:“End Function
In Deiner Abfrage brauchst Du nur das Feld mit dem Schüler
Namen und das Feld für den Notendurchschnitt z.B.
Durchschnitt: Notendurchschnitt([Dein Feldname für den
Schüler])Habs eben erfolgreich getestet wenns nicht geht, überprüfe ob
du die SQL entsprechend Deinen Tabellen- u. Feldnamen
angepasst hast.Gruß Andreas
Hallo again,
zunächst muß ich Dich fragen mit welcher Access Version Du arbeitest (z.B. AccessXP, …2003, …2007 oder …2010)
Dann kann ich Dir erklären wie Du den genannten Verweis
z.B. "Füge den Verweis auf die Microsoft DAO 3.6 Object "???
einfügen bzw. prüfen kannst ob er bereits existiert.
Der Verweis ist nötig um, in der Funktion welche im Modul hinzugefügt wurde, auf die Tabelle mit Deinen Daten zugreifen zu können und den Durchschnitt berechnen zu können.
OHNE Verweis auf DAO 3.6 KEIN Durschnittswert
Ich habe das Modul angelegt und die Feldnamen verändert.
Gut
Was bedeutet aber „Tabelle1.Schüler“ wozu brauche ich den
Feldnamen „Schüler“? Ich bekomme bei öffnen der Abfrage immer
das Fenster „Parameter eingeben“???
Irgendetwas mache ich wohl falsch…
Klar, wenn Du Tabelle1.Schüler nicht durch den Tabellennamen Deiner Tabelle, in der die Daten der Noten gespeichert sind, ersetzt und statt .Schüler mußt Du den Feldnamen eintragen in dem die Namen Deiner Schüler gespeichert sind.
Mit dieser SQL-Abfrage wird auf Deine Daten zugeriffen. Die Noten, für den Übergabeparameter „desSchülers“ der Funktion, ausgelesen und der Durchschnitt berechnet, welcher dann der Funktionsvariable Notendurchschnitt übergeben wird und in Deiner ursprünglichen Abfrage dann den Durchschnittswert anzeigt.
Ich kann Dir leider nur Abends helfen, da ich Tagsüber arbeiten (programmieren) bin.
Also wenn Du nicht klar kommst möglichst bis 21:00 zurückschreiben, dann kriegst auch noch am selben Tag noch eine Antwort.
Gruß
Andreas
tut mir leid, da kann ich dir nicht weiterhelfen.
Hallo Andreas,
wiedermal vielsten Dank!!!
Nun leider komme ich noch nicht weiter. Ich arbeite mit Access 2003. So nun habe ich eine gan kleine neue Datenbank angelegt- zu Testzwecken. Tabelle1 mit 4 Spalten:Name, Deutsch, Mathe, Englisch und habe 3 Datensätze eingefügt. Danach habe ich das Modul 1 genau wie oben von Dir erzeugt 1:1
Danach habe ich eine Abfrage mit allen 4 Feldern angelegt und im Enwurf eine weiter Spalte mit Namen: Durchschnitt:[Notendurchschnitt]
Leider funktioniert es nicht…Muss ich die Zeichenfolge „des Schülers“ ändern??? oder muss in der Abfrage „Durchschnitt:[Name]“ stehen? oder bin ich total auf dem falschem Dampfer?
Danke im Voraus!!!ich bin am verzweifel…
Gruß Rosali
Hallo deiche,
hier weiß ich leider auch keine Antwort. Versuchs doch mal im MS-ACCESS-FORUM.
Gruß tuenty
guten Abend Rosali!
Zunächst einmal, Du machst richtig zu versuchen in einem kleinen Projekt das nachzustellen um dem Problem selbst auf die Spur zu kommen
Aber laß uns erstmal prüfen ob der Verweis angelegt ist.
Öffne dafür Deine Datenbank und das Modul. Im Code-Editor-Fenster (Microsoft Visual Basic) klickst im Menü oben auf Extras dann auf Verweise.
Im Verweis Fenster sollte oben bei den angehakten Einträgen „Microsoft DAO 3.6 …“ stehen. Ist hier nur 3.5 angehakt sollte es aber auch funktionieren. Um 3.6 weiter unten auswählen zu können mußt aber erst den Haken bei 3.5 oben wegnehmen. Sonst gibts beim Schließen des Verweisfensters eine Fehlermeldung.
Nachdem dies geklärt ist, zu Deiner fast korrekten Umsetzung:
So nun habe ich eine gan kleine neue Datenbank angelegt-
zu Testzwecken. Tabelle1 mit 4 Spalten:Name, Deutsch, Mathe,
Englisch und habe 3 Datensätze eingefügt. Danach habe ich das
Modul 1 genau wie oben von Dir erzeugt 1:1
Danach habe ich eine Abfrage mit allen 4 Feldern angelegt und
im Enwurf eine weiter Spalte mit Namen:
Durchschnitt:[Notendurchschnitt]Leider funktioniert es nicht…
Muss ich die Zeichenfolge „desSchülers“ ändern???
NEIN
oder muss in der Abfrage „Durchschnitt:[Name]“ stehen?
Nicht ganz, denn Notendurschnitt ist ein Funktion kein Feld.
Du schreibst einfach Durchschnitt: Notendurchschnitt([Name])
Dann sollte es auch funktionieren.
Im übrigen möchte ich darauf hinweisen, dass der Feldname „Name“ nicht besonders glücklich gewählt ist. Dies kann im System zu Verwechslungen führen, da „Name“ auch von Access als Schlüsselwort benutzt wird. Deshalb habe ich in meinem Beispiel auch statt „Name“ die Feldbezeichnung „Schüler“ gewählt.
Aber das nur am Rande.
Hoffe diesmal klappst bei Dir.
Gruß Andreas
Sorry - ich schon wieder
es funzt einfach nicht.
Gebe ich im Entwurf der Abfrage bei Feld:
Durchschnitt: Notendurchschnitt ein (ich habe die Spalte in der Tabelle in Schüler umbenannt) erhalte ich beim Öffnen der Abfrage die Fehlermeldung:
„Undefinierte Function '[Notendurchschnitt]'in Ausdruck“
Lasse ich „([Schüler])“ weg, erhalte ich beim Öffnen der Abfrage ein Fenster „Parameter eingeben“ Notendurchschnitt und kann irgendeine Zahl eingeben. Die Abfrage öffnet sich und die eingegebene Zahl taucht in der gesamten Spalte Durchschnitt auf. Es findet also keine Berechnung statt…
Eine Idee habe ich noch …Ist mir vielleicht beim Copy&:stuck_out_tongue_winking_eye:aste ein Fehler unterlaufen - ich habe ja einfach Deinen Code in ein Modul kopiert…???
Gruß Rosali
Hallo !
Durchschnitt: Notendurchschnitt ein (ich habe die
Spalte in der Tabelle in Schüler umbenannt) erhalte ich beim
Öffnen der Abfrage die Fehlermeldung:„Undefinierte Function '[Notendurchschnitt]'in Ausdruck“
Klar, laß die eckigen Klammern um ([)Notendurchschnitt(]) weg. Nur Feldnamen werden in [] gesetzt. Ein Funktionsaufruf nicht. Also richtig ist
Durchschnitt: Notetndurchschnitt([Schüler])
Der Schüler in () muß aber wieder in [] stehen, da wir damit den Namen des Schülers an die Funktion übergeben.
Dann läufts auch
Meld Dich bitte wenns geklappt hat.
Hurrrrrrrrrra! Es klappt!!!
Vielen lieben Dank, ich hatte schon fast nicht mehr damit gerechnet: Jetzt bin ich happy und werde mir einen guten Tropfen badischen Rotwein gönnen…
Leider kann man so etwas (noch)nicht direkt durchs Netz schicken…
Grüßle Rosali
Freut mich, dass es geklappt hat
Laß Dir den Wein schmecken.
Du hast ihn Dir verdient.
Schönen Abend noch und gute Nacht.
Hallo.
Tut mir leid, müsste es erst selbt probieren, hab aber im Moment keine Zeit.
Tipp: In der Access-Hilfe nach Mittelwert suchen oder direkt in’s Forum einstellen.
Gruß, Joe
Da Problem lässt sich einfach über ein Formular mit folgender Funktion lösen:
Function NotenschnittErrechnen()
Dim intCounter As Integer
Dim intNotensumme As Integer
Dim inNotenschnitt As Integer
'initialisiere Variablen mit 0
intCounter = 0
intNotensumme = 0
'zähle Felder größer 0 und summiere Noten
If Me.txtMathe > 0 Then
intCounter = intCounter + 1
intNotensumme = intNotensumme + Me.txtMathe
End If
If Me.txtDeutsch > 0 Then
intCounter = intCounter + 1
intNotensumme = intNotensumme + Me.txtDeutsch
End If
If Me.txtBiologie > 0 Then
intCounter = intCounter + 1
intNotensumme = intNotensumme + Me.txtBiologie
End If
If Me.txtChemie > 0 Then
intCounter = intCounter + 1
intNotensumme = intNotensumme + Me.txtChemie
End If
If Me.txtSport > 0 Then
intCounter = intCounter + 1
intNotensumme = intNotensumme + Me.txtSport
End If
If Me.txtGeschichte > 0 Then
intCounter = intCounter + 1
intNotensumme = intNotensumme + Me.txtGeschichte
End If
Me.txtCounter = intCounter
Me.txtNotenschnitt = intNotensumme / intCounter
End Function