Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

DLookup-Problem

Begonnen von Klausurenverwaltung, Mai 30, 2010, 19:14:13

⏪ vorheriges - nächstes ⏩

Klausurenverwaltung

Hallo,
ich habe folgendes Problem in der selben Datenbank.

Ich habe eine Abfrage mit ALLEN Fächern, die JEDER EINZELNE Student schreiben darf.
Matrikel-Nr wird aufgelistet, daneben die Fach-Nr von den Fächern, die er schreiben darf.

Bei der Anmeldung soll er schauen, ob beide Nr in dieser Kombination in der Abfrage vorhanden sind.
Ich habe es bislang versucht mit dlookup und folgenden Zeilen:

Dim test As Variant
test = DLookup([Matrikel-Nr] And [Fach-Nr], "kopie", "[Matrikel-Nr] = " & Me![Matrikel-Nr] & " and [Fach-Nr] = " & Me![Fach-Nr])

If IsNull(test) Then
MsgBox "Anmeldung nicht OK!"
Me.Undo
Cancel = True
Else
MsgBox "Anmeldung OK!"
end if

Allerdings sagt er mir, dass jeder Student die Kriterien erfüllt und jeder Student darf sich anmelden...
:-\

MzKlMu

Hallo,
analog zu Deinem anderen Beitrag solltest Du das auch mit DCount() machen und nicht mit DLookup().
Gruß Klaus

Klausurenverwaltung

Mit DCount habe ich es schon probiert, da habe ich aber das selbe Problem...

MzKlMu

Hallo,
und wie sah Dein DCount() Versuch aus?
Der DLookup() Versuch ist schon mal ganz falsch aufgebaut, Du kannst diese Funktion aber nicht verwenden.
Du brauchst Ja eine Anzahl, nähmlich 0 (noch nicht angemeldet) oder 1 (angemeldet).
Ich würde mal annehem, dass das funktioniert:

If DCount("*", "Teilnahme", "[Matrikel-Nr]= " & Me![matrikel-nr] & " and [Fach-Nr] = " & Me![Fach-Nr]) = 1 Then

Ist direkt aus dem anderen beitrag kopiert, versuche es mal.
Wenn es nicht klappt, zeieg bitte den kompletten Code den Du mit DCount() versucht hast.
Gruß Klaus

Klausurenverwaltung

If DCount("*", "Teilnahme", "[Matrikel-Nr]= " & Me![Matrikel-Nr] & " and [Fach-Nr] = " & Me![Fach-Nr]) = 1 Then
    MsgBox "Anmeldung OK!"
    Else
    MsgBox "Anmeldung nicht OK!"
    Me.Undo
    Cancel = True
    End If


Das ist mein Code, bei dem jeder sich anmelden darf...

MzKlMu

#5
Hallo,
lasse Dir mal mit Debug.Print den Wert ausgeben (im Direktbereich), vor dem If einfach mal diese beiden Zeilen einfügen:
Debug.Print DCount("*", "Teilnahme", "[Matrikel-Nr]= " & Me![Matrikel-Nr] & " and [Fach-Nr] = " & Me![Fach-Nr])
Stop

Wie ist der Wert, wenn die Person nicht angemeldet ist und wenn angemeldet.
Gruß Klaus

Klausurenverwaltung

Ich kann ihn im private sub nicht ausgeben.
Oder bin ich einfach nur intellent genug?  ???

DF6GL

Hallo,

wieso nicht?  (Frage zum ersten Satz  ;D ;)  )


Ich sehe auch nicht, in welcher Ereignisprozedur das stattfinden soll. Ich vermute, Du willst es etwa so machen:

Sub Form_BEFOREUPDATE(Cancel as Integer)

If isnull (Me![Matrikel-Nr] ) or isNull(Me![Fach-Nr]) then
Msgbox "Matrikel-Nr oder Fach-Nr fehlt"
Exit Sub
End if

If DCount("*", "Teilnahme", "[Matrikel-Nr]= " & Me![Matrikel-Nr] & " and [Fach-Nr] = " & Me![Fach-Nr]) > 0  Then
    MsgBox "Anmeldung nicht OK!"
    Me.Undo
    Cancel = True
    End If
End Sub




MatrikelNr und FachNr sind von Datentyp Zahl,Long

Die Textfelder im Form müssen natürlich die entspr. Werte auch anzeigen, bzw. es muß dort etwas eingetragen sein

Und:  Auf Sonderzeichen und Leerzeichen DRINGEND verzichten, ich wiederhole mich...   ::)

Klausurenverwaltung

Alle Varianten schon probiert, =1, >0 und auch von der anderen Seite her.
Ich habe fast den selben Code für die Anzahl der Versuche, da gibt er mir richtig wieder, wenn man mehr als 3 Versuche hat.
Allerdings greift er auf eine andere Abfrage zu. Hier ist er so nett zu den Studenten, dass sich ALLE anmelden dürfen...

Daten sind im selben Formular vorhanden, allerdings ausgeblendet.
Gibt es noch eine andere Funktion, bei der er nach den Werten in der Abfrage schaut?

DF6GL

Hallo,

wir reden aneinander vorbei.


Ich spreche von der Tabelle "Teilnahme"..

Welche Abfrage willst Du denn benutzen ? Wie heißt deren SQL-String?

Du solltest aber besser den akt. Lösungsweg beschreiten, und nicht mitten drin umkehren und eine andere Route suchen, die dann auch nicht zum Ziel führt...

Klausurenverwaltung

SELECT *
FROM [4 Studenten mit möglichen Anmeldungen] AS A
WHERE (((Exists (SELECT * FROM [0 - Student Fach bestanden] AS B WHERE B.[Matrikel-Nr] = A.Matrikelnummer AND B.[Fach-Nr] = A.[Fach-Nr]))=False));


Das ist der SQL-Code von der Abfrage. Die Abfrage "4" sagt, welche Studenten sich anmelden können, also die Voraussetzungen erfüllt haben. Sie ist eine Union-Abfrage, aus vier anderen Abfragen.
Die Abfrage "0" schließt die Studenten aus, die das Fach schon bestanden haben.

Sonst noch Informationen notwendig?

DF6GL

Hallo,


mhmm,  bin geneigt zu sagen:  Überdenke Dein Tabellenmodell eingehend...

Solche Abfragemonster (dazu noch Union-Abfragen) trüben eher den Blick als dass sie nützlich sind.

Klausurenverwaltung

Die Werte, die die Abfrage liefert, sind 100%ig richtig.
Allerdings kommt halt bei der Dcount-Funktion nur Mist raus.

database

Hallo,

wieso Mist - was gibt denn die DCount-Funktion aus?
Die Funktion zählt kompromisslos die Anzahl der Datensätze, die den eingegebenen Kriterien entsprechen und nichts anderes!
Leider hast du nach MzKlMu in #5 keine Angaben gemacht.
Hast du das Direktfenster angezeigt - dann wird der Wert auch nach MzKlMu's Funktion ausgegeben.

Abber dennoch ...
Wenn also in deiner Tabelle 'Teilnahme' (und ich gehe davon aus, dass es sich um eine Tablle handelt) die Kombination Matrikel-Nr und Fach-Nr wie sie aus deinem Formular kommen existiert, wird sie die Anzahl der Übereinstimmungen liefern - da fährt die Eisenbahn drüber.

Kann es sein, dass sie deshalb fehlerhaftes bzw. nichts liefert, weil die Feldnamen nicht stimmen?
Ich frage das wegen...
Zitat...SELECT * FROM [0 - Student Fach bestanden] AS B WHERE B.[Matrikel-Nr] = A.Matrikelnummer ...
... weil mir die unterschiedliche Schreibweise des Feldnamens f. Matrikel-Nr aufgefallen ist.


Greets
Peter

Klausurenverwaltung

TATSÄCHLICH!
Bei der Abfrage ist es ohne Bindestrich, jetzt funktioniert es!
Seit WOCHEN bin daran am arbeiten, vielen Dank!  :)