Hallo Leute,
ich arbeite an einer Datenbank die zur Anmeldung von Vorlesungen dienen soll. Dafür habe ich insgesamt 3 Tabellen, eine mit den Studentendaten, eine mit den Daten über die Vorlesung und eine die beide verknüpft über die jeweiligen Primärschlüssel. Dann habe ich eine Abfrage erstellt, in der der Vorlesungstitel, die max Teilnehmeranzahl (vom Dozenten vorgegeben) und die gezählten Matrikelnummern, die sich für diese Vorlesung angemeldet haben.
Mein Problem ist jetzt, dass ich bei der Ausführung der Anmeldung für eine Vorlesung überprüfen will, ob die Spalte Max Teilnehmeranzahl
Hallo Constanze,
ich arbeite an einer Datenbank die zur Anmeldung von
Vorlesungen dienen soll. Dafür habe ich insgesamt 3 Tabellen,
eine mit den Studentendaten, eine mit den Daten über die
Vorlesung und eine die beide verknüpft über die jeweiligen
Primärschlüssel. Dann habe ich eine Abfrage erstellt, in der
der Vorlesungstitel, die max Teilnehmeranzahl (vom Dozenten
vorgegeben) und die gezählten Matrikelnummern, die sich für
diese Vorlesung angemeldet haben.
Mein Problem ist jetzt, dass ich bei der Ausführung der
Anmeldung für eine Vorlesung überprüfen will, ob die Spalte
Max Teilnehmeranzahl = Me.Auswahl.Column(2) Then
MsgBox „Die zulässige Teilnehmerzahl ist bereits erreicht, wählen Sie bitte eine andere Vorlesung!“
DoCmd.GoToControl „Auswahl“
Else
MsgBox „Zu dieser Vorlesung können Sie sich noch anmelden!“
DoCmd.Close ’ dieses Formular schließen
DoCmd.OpenForm „Anmeldeformular“ ’ neues Anmeldeformular öffnen.
End If
End Sub
so, das war’s. Die Funktion DSUM summiert die Anzahl der Datensätze in Abhängigkeit der Bedingung.
!!WICHTIG!! die Zählung der Column (Spalten) beginnt immer mit 0!
Column(0) = Spalte1
Column(1) = Spalte2
Column(2) = Spalte3
Grüße aus Essen
Wolfgang
(Netwolf)
Hallo Netwolf,
ich habe deinen Vorschlag letzte Woche ausprobiert und auch noch ein wenig an meiner Datenbank geändert, aber die Prozedur funktioniert nicht. Ich musste mich auch erst mal zurecht finden, wo man das alles einstellt, was recht schnell ging, aber entweder liegt es an meiner Änderung der Bezeichnung oder, was ich aber nicht glaube, an dem was du mir gegeben hast.
Private Sub Auswahl_LostFocus()
If DSum(„Teilnehmername“, „Teilnehmertabelle“, "[Vorlesungs_ID]
= " & Me.Auswahl) >= Me.Auswahl.Column(2) Then
MsgBox „Die zulässige Teilnehmerzahl ist bereits erreicht,
wählen Sie bitte eine andere Vorlesung!“
DoCmd.GoToControl „Auswahl“
Else
MsgBox „Zu dieser Vorlesung können Sie sich noch anmelden!“
DoCmd.Close ’ dieses Formular schließen
DoCmd.OpenForm „Anmeldeformular“ ’ neues Anmeldeformular
öffnen.
End If
End Sub
In der Zeile If Dsum … erhalte ich immer wieder die Fehlermeldung 2471 „Der Ausdruck, den sie als Abfrageparameter eingegeben haben, hat folgenden Fehler verursacht: „Das Objekt enthält nicht das Automatisierungsobjekt ‚VO4’ “.“
Ich habe nun ziemlich viel rumprobiert, ob "[Vorlesungs_ID] = " meiner speziellen Vorlesungsnummer bspw. VO4 entspricht oder ob es die allgemeine Bezeichnung meiner Spalte Vo-Nummer ist, aber das hat alles nicht funktioniert und ich war dann leicht gefrustet und habe anderen Lernsachen den Vorrang gegeben, weswegen meine Antwort etwas spät kommt. Ich finde keinen Fehler, was an meinen mangelnden Programmierkenntnissen liegt und die Access-Hilfe war mir auch ein guter Ratgeber wie diese Dsum-Funktion aussehen muss. Teilnehmername ist bei mir die Matrikelnummer, weil ich eine Tabelle VO-Anmeldung als Verknüpfung, der beiden anderen habe, in der die Primärschlüssel Matrikelnummer und Vorlesungsnummer drin stehen, sprich die Matrikelnummer und die VO-Nummer zu der sich der Student angemeldet hat. Also ist Teilnehmername bei mir die Matrikel, Teilnehmertabelle, die Tabelle Vo-Anmeldung und Vorlesungs-ID dann die VO-Nummer. Ist daran etwas falsch? Vielleicht kann mir da noch mal jemand helfen? Bin wirklich ratlos und weiß nicht weiter.
Vielen Dank auf jeden Fall an Netwolf, ohne dich wäre ich wohl nicht auf die Ereignisprozedur gekommen J
Constanze
Hallo Constanze,
If DSum(„Teilnehmername“, „Teilnehmertabelle“,
"[Vorlesungs_ID]
= " & Me.Auswahl) >= Me.Auswahl.Column(2) Then
In der Zeile If Dsum … erhalte ich immer wieder die
Fehlermeldung 2471 „Der Ausdruck, den sie als Abfrageparameter
eingegeben haben, hat folgenden Fehler verursacht: „Das Objekt
enthält nicht das Automatisierungsobjekt ‚VO4’ “.“
ok, das ist abhängig vom Feldtyp deines Vorlesungs_ID Feldes.
Probiere folgende Variante aus:
If DSum(„Teilnehmername“, „Teilnehmertabelle“,
„[Vorlesungs_ID]
= '“ & Me.Auswahl & „’“) >= Me.Auswahl.Column(2) Then
Grüße aus Essen
Wolfgang
(Netwolf)
Hallo Netwolf,
die neue Variante hat funktioniert, also zumindest gibt er mir keinen Syntaxfehler mehr an dieser Stelle aus, aber dafür dann bei DoCmd.Close, und DoCmd.OpenForm.
Private Sub Kombinationsfeld8_LostFocus()
If DSum(„MatrikelNr“, „Vo-Anmeldung“, „[Vo-Nummer]= '“ & Me.Kombinationsfeld8 & „’“) >= Me.Kombinationsfeld8.Column(2) Then
MsgBox „Die zulässige Teilnehmerzahl ist bereits erreicht. Wählen Sie bitte eine andere Vorlesung!“
DoCmd.GoToControl „Kombinationsfeld8“
Else
MsgBox „Zu dieser Vorlesung können Sie sich noch anmelden!“
DoCmd.Close
DoCmd.OpenForm „Studentische Daten“
End If
Beim ersten habe ich jetzt stehen Close ([acForm]) , aber dann meckert er immer an DoCmd.Close rum und da habe ich auch schon die verschiedensten Varianten ausprobiert, aber er will nicht.
Dann habe ich festgestellt, dass die Ereignisprozedur zwar durchlaufen wird, aber sie funktioniert nicht richtig, denn wenn ich in meine Abfrage schaue, dann habe ich bspw. 11 Matrikelnummern, obwohl da nur 10 stehen dürften, es wird aber immer noch ausgegeben, dass man sich für diese Vorlesung noch anmelden kann. Da bin ich doch leicht verwirrt.
Ich habe dann mal in einem Buch von Microsoft Press geblättert und da die Funktion Dcount gefunden, geht das nicht auch? (habe das auch schon ausprobiert, aber da können sich trotzdem so viele anmelden, wie sie wollen).
Mir ist auch aufgefallen, dass sich ein Student mehrmals für die gleiche Vorlesung anmelden kann, was auch nicht sein dürfte. Kannst du mir noch mal helfen?
Bis dann,
Constanze *sichdoofanstellt*
Hallo Constanze,
die neue Variante hat funktioniert, also zumindest gibt er mir
keinen Syntaxfehler mehr an dieser Stelle aus, aber dafür dann
bei DoCmd.Close, und DoCmd.OpenForm.
ok, welche Fehlermeldung kommt da genau?
Dann habe ich festgestellt, dass die Ereignisprozedur zwar
durchlaufen wird, aber sie funktioniert nicht richtig, denn
wenn ich in meine Abfrage schaue, dann habe ich bspw. 11
Matrikelnummern, obwohl da nur 10 stehen dürften,
dann dürfte in der Abfrage ein „Fehler“ vorliegen!?
es wird aber
immer noch ausgegeben, dass man sich für diese Vorlesung noch
anmelden kann. Da bin ich doch leicht verwirrt.
möglicher Weise mußt du erst ein Requery des Pulldownfeldes ausführen.
Ich habe dann mal in einem Buch von Microsoft Press geblättert
und da die Funktion Dcount gefunden, geht das nicht auch?
(habe das auch schon ausprobiert, aber da können sich trotzdem
so viele anmelden, wie sie wollen).
ja, diese Funktion kannst du auch verwenden. Lese dir dazu aber auch die Hilfe von Access durch.
Mir ist auch aufgefallen, dass sich ein Student mehrmals für
die gleiche Vorlesung anmelden kann, was auch nicht sein
dürfte. Kannst du mir noch mal helfen?
gut, dann müßtest du vorher prüfen (z.B. mit der Dcount - Funktion), ob für den Studenten schon eine Anmeldung vorhanden ist.
Constanze *sichdoofanstellt*
Grüße aus Essen
Wolfgang
(Netwolf)
*derauchmalangefangenhat*
*undheutenochnichtallesweiß*
Hallo Netwolf,
also ich habe meine kleinen Problemchen jetzt in den Griff bekommen.
Meine If-Bedingung ist jetzt etwas einfacher:
If Me.Kombinationsfeld6.Column(2) >= Me.Kombinationsfeld6.Column(3) Then
Das funktioniert einwandfrei, weil ich meine Abfrage unter das Kombinationsfeld gesteckt habe und er nur die jeweiligen Felder vergleichen muss.
Meine Fehlermeldung bin ich jetzt so umgangen, in dem ich einfach eine Schaltfläche eingefügt habe, die das Formular schließt, wenn man das wünscht und dann werde ich noch eine einfügen, damit man zu einem leeren Datensatz kommt. Das ist vielleicht nicht die programmiertechnisch eleganteste Lösung, aber für mich reicht es
Vielen Dank nochmal für deine Hilfe, sie hat mich sozusagen inspiriert
Access ist doch nicht ganz so doof, wie ich dachte, man muss nur kreativ genug denken können
Bye,
Constanze