Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: pagru am August 13, 2024, 13:57:01

Titel: Problem mit berechneten Feldern
Beitrag von: pagru am August 13, 2024, 13:57:01
Hallo in die Runde,
ich bin Neuling in der Nutzung von Access und habe mich in den letzten 4 Wochen ein wenig in Basics eingearbeitet. Warum? Ich möchte ich ein Datenbanksystem für die Erfassung von Daten zu meinen Schülerinnen und Schülern bauen.

Vielleicht zum Grobkonzept:
Es existieren 2 Tabellen:
- eine mit Stammdaten der Lernenden
- eine mit Leistungsdaten

Beide Tabellen sind über eine Beziehung miteinander verknüpft, sodass Name, Vorname und Geburtsdatum immer in beide Tabellen geschrieben werden.

Es existieren außerdem 2 Formulare:
- eins zur Eingabe der Stammdaten
- eins zur Eingabe der Leistungsdaten

Mein Problem besteht beim Formular mit den Leistungsdaten.
Dort habe ich zunächst einmal mehrere Felder für einzelne Notenwerte eingetragen, die erfasst werden sollen. Aus einigen dieser Werte werden in zwei berechneten Feldern der jeweilige Durchschnitt errechnet, andere dienen nur der Dokumentation.

In den berechneten Feldern sieht eine Formel z.B. so aus (bei dem anderen ist jeweils "GLN" durch "SL" ersetzt):

Wenn((Wenn(IstNull([GLN1]);0;1)+Wenn(IstNull([GLN2]);0;1)+Wenn(IstNull([GLN3]);0;1)+Wenn(IstNull([GLN4]);0;1))=0;Null;(Wenn(IstNull([GLN1]);0;[GLN1])+Wenn(IstNull([GLN2]);0;[GLN2])+Wenn(IstNull([GLN3]);0;[GLN3])+Wenn(IstNull([GLN4]);0;[GLN4]))/(Wenn(IstNull([GLN1]);0;1)+Wenn(IstNull([GLN2]);0;1)+Wenn(IstNull([GLN3]);0;1)+Wenn(IstNull([GLN4]);0;1)))
[Grundlage sind also hierfür die Felder "GLN1" bis "GLN4", wobei der Durchschnitt immer nur aus an den Feldern berechnet werden soll, in denen auch tatsächlich etwas eingetragen ist.]

Außerdem will ich auf dem Formular eintragen, wenn mir etwas im Unterricht auffällt (z.B. gute Arbeitshaltung, 3x Hausaufgaben vergessen usw.).

Dafür habe ich
- ein Feld zum Eingeben der Notiz erstellt ("NeueNotiz"; das Feld wird nach der Eingabe geleert),
- ein Datumsfeld ("DatumNotiz"), aus dem das Datum der Eintragung gezogen wird,
- eine Schaltfläche, die die Eintragung speichert ("btnNotizSpeichern")
- und ein Feld, in dem alle eingegebenen Notizen untereinander festgehalten werden ("Notiz").

Der Code für den Button sieht so aus:
Private Sub btnNotizSpeichern_Click()
    On Error GoTo ErrorHandler

    ' DatumNotiz mit dem aktuellen Datum und Uhrzeit füllen
    Me!DatumNotiz = Now()

    ' Kombiniere Datum und neue Notiz
    Dim neueNotizMitDatum As String
    neueNotizMitDatum = Me!DatumNotiz & ": " & Me!NeueNotiz

    ' Überprüfe, ob bereits eine Notiz vorhanden ist
    If IsNull(Me!Notiz) Or Me!Notiz = "" Then
        ' Wenn keine Notiz vorhanden ist, setze die neue Notiz als erste Notiz
        Me!Notiz = neueNotizMitDatum
    Else
        ' Wenn schon Notizen vorhanden sind, füge die neue Notiz hinzu
        Me!Notiz = Me!Notiz & vbCrLf & neueNotizMitDatum
    End If

    ' Leere das Feld NeueNotiz
    Me!NeueNotiz = Null

    ' Änderungen speichern
    Me.Dirty = False

    Exit Sub

ErrorHandler:
    MsgBox "Fehler: " & Err.Description, vbExclamation

End Sub

Nun zu dem Problem: Das Eingeben von Noten und Berechnen von Durchnittswerten funktioniert problemlos.
Wenn ich allerdings eine Notiz speichern möchte, erhalte ich folgende Fehlermeldung:

Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Beim Klicken eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Während der Kommunikation von Microsoft Access mit dem OLE-Server oder dem ActiveX-Steuerelement ist ein Problem aufgetreten.
* Der Ausdruck gibt möglicherweise weder den Namen eines Makros noch den Namen einer benutzerdefinierten Funktion noch [Ereignisprozedur] zurück.
* Beim Auswerten einer Funktion, eines Ereignisses oder eines Makros trat möglicherweise ein Fehler auf.


Wenn ich die berechneten Felder aus dem Formular nehme, funktioniert das Eintragen der Notizen so, wie es soll. Es muss also irgendwo an der Kombination von "btmNotizSpeichern" und den berechneten Feldern liegen.

Hat jemand vielleicht eine Idee, wie ich das Problem lösen könnte?
Titel: Re: Problem mit berechneten Feldern
Beitrag von: MzKlMu am August 13, 2024, 14:29:35
Hallo,
Zitatsodass Name, Vorname und Geburtsdatum immer in beide Tabellen geschrieben werden.
Das ist falsch. In die Tabelle mit den Leistungsdaten kommt nur der Fremdschlüssel zum Schüler, sonst keine weiteren Felder.

Auch das mit den Noten ist falsch. Die Noten werden in jeweils einem Datensatz erfasst, nicht in Feldern.

Notizen sind auch falsch. Die Notizen sind in jeweils einem Datensatz zu erfassen und nicht in einem Feld.
1.Normalform, atomare Inhalte, das heißt, immer nur einen Wert in einem Feld.

Ich fürchte, der jetzige Aufbau der DB ist komplett unbrauchbar. Du brauchst hier viel mehr Tabellen.
Was ist z.B. mit dem Schuljahr ? Oder willst Du jedes Jahr eine neue DB machen ?
Was ist mit Fächern ?
In einer korrekt aufgebauten Datenbank wird man auch solche Wenn(....) Orgien nicht benötigen.
Zitat"GLN1" bis "GLN4", wobei der Durchschnitt immer nur aus an den Feldern berechnet werden soll, in denen auch tatsächlich etwas eingetragen ist.]
Das muss in eine extra Tabelle als je ein Datensatz. Und nur dann wenn ein Wert vorhanden ist. Dann hast Du für die Berechnung eine Spalte und kannst die Access Funktion Mittelwert (Avg) verwenden. Die Wenn Kaskade entfällt dann ersatzlos. Und Dein Problem löst sich in Luft auf.

Und VBA wird im Regelfall nur zum Aufbau der Bedienoberfläche benötigt. Für die Datenbearbeitung sollte kein VBA notwendig sein. Der gezeigte VBA Code für die Notizen entfällt bei korrektem Aufbau auch ersatzlos.


Zeige bitte mal ein Bild des Beziehungsfensters, aber die Tabellen so groß ziehen, dass man alle Felder sieht.

Du solltest Dich auch mit den Grundlagen zu Access beschäftigen. Hier ein Link dazu:

https://www.access-tutorial.de/
Titel: Re: Problem mit berechneten Feldern
Beitrag von: pagru am August 13, 2024, 16:39:09
Zunächst danke, dass du dich mit meinem Posting auseinandergesetzt hast :-)

ZitatDas ist falsch. In die Tabelle mit den Leistungsdaten kommt nur der Fremdschlüssel zum Schüler, sonst keine weiteren Felder.

Auch das mit den Noten ist falsch. Die Noten werden in jeweils einem Datensatz erfasst, nicht in Feldern.

Notizen sind auch falsch. Die Notizen sind in jeweils einem Datensatz zu erfassen und nicht in einem Feld.
1.Normalform, atomare Inhalte, das heißt, immer nur einen Wert in einem Feld.
Da hat es bei mir ziemlich sicher am Wording gehangen, denn aus dem, was du schreibst, war es scheinbar ansatzweise verständlich, was ich wollte.

ZitatWas ist z.B. mit dem Schuljahr ? Oder willst Du jedes Jahr eine neue DB machen ?
Was ist mit Fächern ?
Ich habe im kommenden Schuljahr 6 unterschiedlich zusammengesetzte Lerngruppen, dafür möchte ich 6 getrennte Datenbanken nutzen. Alles in einer großen Datenbank zu sammeln, ist mir zu unübersichtlich. Außerdem solls ein Testlauf sein, daher weiß ich nicht, ob ich die nächstes Jahr noch einmal nutze. Kann auch sein, dass von Stadt/Land ne bessere oder verbindliche Softwarelösung kommt.

Ich bin nicht sicher, ob dir tatsächlich ein Abbild des Beziehungsbaums hilft, denn der sagt (zumindets für mein Verständnis) nicht aus, was ich eigentlich haben will. (Die Formulare bieten mir einen Überblick über die Einzelnen Schüler, die Tabellen einen Gesamtüberblick.)
Daher daneben auch die Screenshots der Tabellen und Formulare, die ich haben will.

sc05.jpgsc01.jpgsc02.jpgsc03.jpgsc04.jpg 

Edit: Und so soll das Notizenfeld aussehen (funktioniert in nem anderen Entwurf so, wie ich es will, aber eben nur dann, wenn keine berechneten Felder im Formular sind:
sc06.jpg
Titel: Re: Problem mit berechneten Feldern
Beitrag von: MzKlMu am August 13, 2024, 18:03:19
Hallo,
das Beziehungsbild hilft mir insofern, dass man erkennt, dass das Datenmodell so unbrauchbar ist. Da helfen die Bilder auch nicht.
Name, Vorname und Geb.Datum in der Leistungstabelle ist falsch und redundant.
Für die Notizen wird eine extra Tabelle benötigt mit einem Fremdschlüssel zum Schüler (habe ich schon gesagt).
Das Notizfeld so wie Du das jetzt hast ist Unsinn und im Sinne der Datenbankregeln auch falsch.
Die Leistungstabelle ist insgesamt ohnehin falsch.
Zur Erfassung der Leistungen ist eine n:m Beziehung erforderlich. Dazu ist eine Tabelle erforderlich mit den Fächern (GLN1, GLN2, .... ) in je einem Datensatz und eine Zuordungstabelle mit FS zu den Fächern und FS zu den Schülern. Sowie die eigentliche Bewertung. Alle Bewertungen stehen in einer Spalte.
Dann (und nur dann) kannst Du die Access Aggregatfunktionen nutzen für Summen und Mittelwerte.

Wenn das alles korrekt aufgebau ist, lösen sich deine Probleme in Luft auf. Ich werde mich mit Deinem jetzigen Aufbau/Problemen nicht weiter beschäftigen zumal es falsche Vorschläge/Lösungen wären die ich nicht parat habe.

Ich habe mal ein Bild angehängt. Wenn Du willst, dass ich weiter mache, äußere Dich mal zum Bild.



Titel: Re: Problem mit berechneten Feldern
Beitrag von: pagru am August 14, 2024, 11:58:33
Uff...ich merke, dass es schwierig ist, das, was ich brauche/haben möchte, so zu kommunizieren, dass es für dich als Außenstehenden nachvollziehbar wird.

Zu deiner letzten Frage: Die ganzen Werte, die du im Bild markiert hast, sind Einzelnoten, die im Verlauf des Schuljahrs vergeben und dokumentiert werden:
Von GLN und SL brauche ich außerdem jeweils einen aktuellen Durchschnittswert, die anderen Noten werden nur einzeln dokumentiert und fließen individuell unterschiedlich gewichtet in die jeweiligen SL-Noten ein.

Es sind also keine Fächer, sondern die Noten in einem Fach. Die Datenbank bezieht sich auch ausschließlich auf ein Fach in einem Schuljahr in einer Lerngruppe. Mehr brauche ich nicht, aber genau diese Angaben, wie ich sie gemacht habe, brauche ich eben
Genau das erfüllt der Aufbau der Datenbank, obwohl er deiner Aussage nach und somit ziemlich sicher von der Grundkonzeption her falsch ist.

Das Feld "Notizen" dient dazu, spontan Bemerkungen zum jeweiligen Schüler zu notieren, die ebenfalls für Elterngespräche relevant sind und in die SL-Note einfließen (aber eben nicht als Zahlenwerte, sondern als reine Textinformationen).

Eine Lösung für das Problem, mit dem ich den Thread eröffnet habe, wäre, ein frmNotizen zu erstellen und darüber eben die Notizen zu erfassen, weil dann die berechneten Felder außen vor gelassen werden. Ist das korrekt?
Titel: Re: Problem mit berechneten Feldern
Beitrag von: MzKlMu am August 14, 2024, 12:41:39
Hallo,
ZitatIst das korrekt?
Nein, da ist garnix korrekt. Ich habe auch sehr genau verstanden was Du machen willst. Du hast nur nicht verstanden was ich Dir sagen will. Um es noch mal deutlicher zu sagen:
Die von Dir vorgesehene Tabellenstruktur ist unbrauchbar. Mit der vorgeschlagenen Umstrukturierung lassen sich alle Deine Wünsche viel leichter und problemloser erfüllen.

Zitat; daher auch dort nochmals der Eintrag von Name, Vorname und Geburtsdatum
Das ist kompletter Unsinn. Mit einer Abfrage kannst Du problemlos Name, Vorname und Geb.Datum auch mit der Leistungstabelle anzeigen.
Es ist ja Sinn der Beziehungen solche redundanten Felder zu vermeiden.

Du brauchst eine Tabelle für die Art der Einzelnoten, GLN, SL, MA, KLN, ZN als je ein Datensatz, ohne die Zahlen 1-4 bzw. 1-2. Dann brauchst Du eine n:m Zuordnungstabelle in der Du in einer Spalte beliebig viele Noten in einer Art in je einem Datensatz erfassen kannst.

GLN und SL diese Felder brauchst Du gar nicht, die Durchschnittswerte können problemlos mit der Accessfunktion AVG aktuell ermittelt und angezeigt werden. Unter der Voraussetzung dass die DB normalisiert wird.

ZitatEine Lösung für das Problem, mit dem ich den Thread eröffnet habe,
Wenn die Struktur wie vorgeschlagen geändert wird, gibt es dieses Problem erst gar nicht.
Du würdest staunen, wie einfach das alles werden würde, auch die Formulare.
Auch VBA wird bis zu dieser Stufe nicht benötigt, keinen Buchstaben.

Wenn Du nicht bereit bist, dich mit meinen Vorschlägen zu beschäftigen, werde ich mich aus dem Thema zurückziehen. Ich erarbeite keine Lösungen zu Problemen die es bei korrektem Aufbau der DB erst gar nicht gibt.

Ich mache Dir gern ein Beispiel, aber nur wenn wir die Tabellenstruktur komplett ändern.

Hast Du Dich überhaupt mal mit dem Link in meiner Antwort #1 beschäftigt ?



Titel: Re: Problem mit berechneten Feldern
Beitrag von: pagru am August 14, 2024, 13:03:50
ZitatHast Du Dich überhaupt mal mit dem Link in meiner Antwort #1 beschäftigt ?
Ich habe reingelesen, mehr nicht. Mea culpa.

ZitatMit der vorgeschlagenen Umstrukturierung lassen sich alle Deine Wünsche viel leichter und problemloser erfüllen.
[...]
Ich mache Dir gern ein Beispiel, aber nur wenn wir die Tabellenstruktur komplett ändern.
Dafür wäre ich natürlich sehr dankbar. Ich wollte auch nicht so wirken, als würde ich das, was du schreibst, nicht ernst nehmen. Wahrscheinlich überblicke ich auch einfach nicht, was alles möglich ist und wie einfach es gehen kann, wenn man einen besseren Überblick über das hat, was Access kann.
Titel: Re: Problem mit berechneten Feldern
Beitrag von: MzKlMu am August 14, 2024, 16:53:59
Hallo,
im Anhang findest Du meinen Vorschlag.

Es gibt ein Hauptformular zur Anzeige der Schüler. Dann gibt es 4 Unterformulare die über die SchülerID verknüpft sind.
Die Unterformulare sind auf 4 Registerseiten angeordnet.

- UfoGLN erfasst die Benotungen für GLN
- UfoSL erfasst die Benotungen für SL
Diese beiden Ufos zeigen auch im Formularfuß die Mittelwerte an.

- UfoMA_KLN_ZN erfasst die restlichen Benotungen in beliebiger Reihenfolge. Die Art der Benotung kann per Kombi gewählt werden.

- UfoNotizen erfasst die Notizen.

In diesem einen Formular (mit den 4 Ufos) kannst Du auch die Schüler erfassen.

DB anbei, bei Fragen melden. Bitte auch die Beziehungen ansehen.
Und beachte, dass es bis zu diesem Statium der DB noch keinen Buchstaben VBA gibt. Das läuft alles mit den normalen Standardfunktionen von Access. Beachte auch die Vereinfachung des Mittelwertes gegenüber der Wenn(......) Inflation.
Titel: Re: Problem mit berechneten Feldern
Beitrag von: pagru am August 15, 2024, 13:21:51
Hi,
zuerst einmal: Vielen Dank! Kann ich mich irgendwie erkenntlich zeigen?

Ich merke gerade, dass ich den Aufbau völlig falsch gedacht hatte. Ich bin gedanklich von dem ausgegangen, was ich in einer Tabelle (gemeint: Übersicht) haben möchte; jetzt sehe ich, dass ich eigentlich von "Kategorien" her denken muss, also was ich will ich eigentlicht erfasen? Ist wahrscheinlich wieder falsch ausgedrückt, aber ich hoffe, du verstehst, was ich meine.

"ZN" muss ich noch irgendwohin auslagern, da muss ich mir noch etwas überlegen. Bei KLN usw. passt die Note nicht rein.

Frage 1: Kann ich das Feld "SchuelerID" im Formular unsichtbar schalten? Denn eigentlich brauche ich diese Angabe nicht.
Frage 2: Wichtiger wäre, dass mir die Schüler im Formular in chronologischer Reihenfolge nacheinander angezeigt werden. Geht das bzw. was muss ich machen, damit das funktioniert?
Frage 3: Wenn ich nun eine Übersicht haben möchte, in der alle Schüler mit allen Noten angezeigt werden, mache ich das dann über eine Abfrage?
Titel: Re: Problem mit berechneten Feldern
Beitrag von: MzKlMu am August 15, 2024, 14:02:10
Hallo,
Zitat"ZN" muss ich noch irgendwohin auslagern,
Warum auslagern ?
ZitatBei KLN usw. passt die Note nicht rein.
Was heißt die Note passt nicht rein ?

ZitatKann ich das Feld "SchuelerID" im Formular unsichtbar schalten?
Das kannst Du im Formular auch löschen.
Zitatdass mir die Schüler im Formular in chronologischer Reihenfolge nacheinander angezeigt
Nach welcher Chronologie ? Für eine Chronologie gibt es ja bis jetzt nur das Geb.Datum.

ZitatWenn ich nun eine Übersicht haben möchte, in der alle Schüler mit allen Noten angezeigt werden, mache ich das dann über eine Abfrage?
Ja, mit einer Abfrage die als Datenbasis für ein Formular (oder besser einen Bericht) dient.
Titel: Re: Problem mit berechneten Feldern
Beitrag von: pagru am August 15, 2024, 14:43:47
ZitatWas heißt die Note passt nicht rein ?
Die Anordnung der Unterformulare im Hauptformular (GLN -> SL -> KLN/MA -> Notizen) ist schon richtig gut und gibt die Wertigkeit der einzelnen Bewertungen (GLN > SL > KLN/MA > Verbalbeurteilung) gut wieder.
ZN sind jedoch die beiden Zeugnisnoten (Halbjahr 1 und Halbjahr 2). Die passen hinsichtlich ihrer Wertigkeit daher nicht in die Kategorie mit KLN und MA, zumal KLN und MA die beiden "niedrigsten" Notenkatergorien sind, aus denen sich die beiden ZN ergeben.

[Instinktiv würde ich hierfür einfach zwei zusätzliche Felder im Hauptformular (und in der tblSchueler) anlegen, aber wahrscheinlich wäre das nicht sinnvoll...?]

ZitatNach welcher Chronologie ? Für eine Chronologie gibt es ja bis jetzt nur das Geb.Datum.
Primär in alphabetischer Reihenfolge A->Z bei Name; sekundär in alphabetischer Reihenfolge A->Z bei Vorname.

ZitatJa, mit einer Abfrage die als Datenbasis für ein Formular (oder besser einen Bericht) dient.
Okay, da werd ich mich erst einlesen und ausprobieren müssen. Danke.
Titel: Re: Problem mit berechneten Feldern
Beitrag von: MzKlMu am August 15, 2024, 15:17:59
Hallo,
ZitatPrimär in alphabetischer Reihenfolge A->Z bei Name; sekundär in alphabetischer Reihenfolge A->Z bei Vorname.
Das ist ja keine chronologische Reihenfolge, sondern wie Du selbst sagst Alphabetisch. Das geht natürlich.
Erstelle eine Abfrage (mit der Schülertabelle) und sortiere wie gewünscht diese Abfrage. Speichere die Abfrage mit einem Namen (z.B. qryErfassung) und verwende statt der Tabelle diese Abfrage als Datenquelle für das Hafo (Schüler).

Im Regelfall verwendet man keine Tabellen direkt als Datenherkunft für Formulare und Berichte.
Sobald Sortierungen ins Spiel kommen, muss zwingend eine Abfrage verwendet werden.
Eine Tabelle ist immer als unsortierte Menge zu sehen. Eine Tabelle wird in der Reihenfolge des Primärschlüssels angezeigt, das kann absteigend und aufsteigend sein.

ZitatZN sind jedoch die beiden Zeugnisnoten (Halbjahr 1 und Halbjahr 2). Die passen hinsichtlich ihrer Wertigkeit daher nicht in die Kategorie 
Wieso nicht ?
Lege in der Tabelle "tblLeistungen" noch ein Feld an (Anmerkung z.B.) und dort schreibst Du rein "Halbjahr 1" bzw. "Halbjahr 2".