Hallo,
ich bin in Access ein ziemlicher Neuling und komme mit der Anmeldung nicht mehr weiter. Für ein Schulprojekt im Rahmen von AccessVBA soll ich ein Filmbewertungsportal erstellen. Die DB steht so weit auch und es funktioniert auch alles soweit, nur eben die Anmeldung nicht.
Als Startbildschirm gibt es die Möglichkeit sich entweder als Admin anzumelden, welcher "alles" in der DB darf oder als registrierter Benutzer, welcher Filme aus der Liste auswählen und auch bewerten darf.
Des Weiteren gibt es die Möglichkeit sich als Gastnutzer anzumelden, welcher aber lediglich Infos und Bewertungen/Kommentare von Filmen lesen darf, nicht aber selbst bewerten/kommentieren darf.
Zu guter Letzt gibt es noch die Möglichkeit sich zu registrieren, wobei die Mail-Adresse = Nutzername sein soll, da zuerst eine E-Mail an den Admin geht, welcher den jeweiligen Nutzer erst freischalten muss.
Es geht in erster Linie darum dass ich drei Textfelder habe. In das erste Textfeld soll eine gültige E-Mail-Adresse geschrieben werden, in das zweite Textfeld kommt das Passwort und in das dritte Textfeld die Wiederholung des Passworts. Über den Button Abschicken, soll zunächst geprüft werden ob die beiden Passwörter übereinstimmen. Ist dies der Fall, soll ein Datensatz in der Tabelle "tBenutzer" angelegt und eine Mail an den DB-Admin geschickt werden. Noch bevor der Datensatz gespeichert wird, soll das Passwort in einen MD5 Hash umgewandelt werden (und so auch gespeichert werden).
Hier mal ein Bsp. Code, den ich von meinem Projektbetreuer bekommen habe. Dieser Code soll die beiden Passwörter überprüfen:
Function auth(ByRef freigabe As Boolean)
If Len(txtKennwort) > 0 And Len(cmdAnmelden) > 0 Then
vglpw = DLookup("passwort", "benutzer", "login ='" & cmdAnmelden & "'")
If vglpw = DigestStrToHexStr(txtKennwort) Then
freigabe = True
'MsgBox "OK"
Else
freigabe = False
MsgBox "Benutzername oder Kennwort falsch!"
End If
Else
MsgBox "Unvollständige Angaben!"
End If
End Function
Und mit folgendem Code-Beispiel soll eine Mail verschickt werden:
Option Compare Database
Option Compare Database
Sub emailversand()
Set EMail = CreateObject("CDO.Message")
With EMail
.From = "absender@absender.de"
.To = "name @gmx.de"
.Subject = "Betreff"
.TextBody = "Dies ist eine Access-Testmail"
With .Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.absender.de"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "benutzername" '"vlw_rlp@eduinf.de" 'web415p4
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "passwort"
'ZUSÄTZE:
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
.Update
End With
.Send
End With
End Sub
Ich habe beide Code-Fragmente in das Klick-Ereignis des Buttons geschrieben, weil ja beides mit einem Klick ausgelöst werden soll.
Allerdings bekomme ich immer die Fehlermeldung das ein "End Sub" fehlt, obwohl ich eins drin stehen haben.
Und ich glaube von meinen Anpassungen stimmt auch noch was nicht.
Ich hoffe ich habe alles einigermaßen verständlich erklärt und das mir jemand ein paar Tipps geben kann.
Gruß
AccessNewbie2013
Hi,
Zitat von: AccessNewbie2013 am Juni 08, 2013, 10:42:40
Ich habe beide Code-Fragmente in das Klick-Ereignis des Buttons geschrieben, weil ja beides mit einem Klick ausgelöst werden soll.
ewbie2013
In das Klick-Ereignis schreibst Du den Aufruf der beiden Programmteile.
In der Art:
call auth ' warum Du hier einen Wert übergibst hat sich mir nicht erschlossen.
call emailversand
Harald
Hallo,
ZitatIch habe beide Code-Fragmente in das Klick-Ereignis des Buttons geschrieben, weil ja beides mit einem Klick ausgelöst werden soll.
Das funktioniert SO nicht...
Bei einem Klick auf ein Steuerelement (z. B. einen Button) wird die dazugehörende und fest benamste Ereignisprozedur aufgerufen, z. B.:
Sub btnButton_Click()
.
.
.
End Sub
Wenn also die Funktion "auth" ausgeführt werden soll, dann muss das so lauten:
Sub btnButton_Click()
Dim freigegeben as Boolean
auth freigegeben
End Sub
Die Funktion selber muss im gleichen Klassenmodul wie die Ereignisprozedur stehen, weil darin auf Formular-Textfelder referenziert wird.
Gleiches gilt für die Sub emailversand(), wenn darin auch Formular-Textfelder Anwendung finden.
Normalerweise werden solche Funktionen/Subs in ein Standard-Modul platziert und Variablen mittels Übergabeparameter an die Funktions-Argumente übergeben.
Ich gehe jetzt nicht auf weitere Unzulänglichkeiten am Code und der Konstruktion ein, die eigentlich korrigiert werden sollten.
(Referenzierung der Formular-Steuerelemente, Verwendung globaler Variablen anstatt Übergabeparameter wie auch "magic numbers", bzw. "magic strings" in Form von Literal-Konstanten usw.)
PS: Crossposting ist allerdings nicht so gern gesehen.....
Hallo,
das klingt ja doch alles ziemlich kompliziert. Wie schon kurz erwähnt sind diese Code-Fragmente lediglich Beispiele die ich an meine DB anpassen muss.
Was Access angeht bin ich eben noch ein Neuling und von VBA habe ich auch so gut wie keine Ahnung.
ZitatNormalerweise werden solche Funktionen/Subs in ein Standard-Modul platziert und Variablen mittels Übergabeparameter an die Funktions-Argumente übergeben.
Also wenn ich das jetzt richtig verstehe, "lagere" ich meine beiden Funktionen in ein Modul aus und übergebe lediglich die beiden Variablen an das Klickereignis?
Hinzu kommt noch (habe ich vergessen zu erwähnen), dass das Passwort, bevor is in der Tabelle gespeichert wird in einen MD5 Hash umgewandelt werden soll.
Das würde ich dann ja auch "auslagern" oder?
So, ich hab jetzt versucht mal ein wenig "aufzuräumen" und die einzelnen Code-Fragmente, in einzelne Module gepackt.
Oder ich muss ich alles in ein Modul packen?
Und in cmdAbschicken dieses "Call auth" bzw. "Call emailversand" geschrieben.
War das so gedacht? Ich hänge mal ein Bild an.
Und nochmals: Ich habe von VBA absolut keine Ahnung, also bitte entschuldigt, wenn ich ich nicht alles sofort richtig umsetze.
[Anhang gelöscht durch Administrator]
Hallo,
naja, wenn Du so gar keine Ahnung von VBA hast, das wäre es insgesamt ratsam, sich erst mit den VBA - Grundlagen auseinanderzusetzen. Ohne die kommst Du nicht aus... Und Du lernst das auch nicht, wenn ich (oder wir) den Code "vorbeten" und jede Kleinigkeit bei der Umsetzung korrigieren müssen.
Prinzipiell gilt: Allgemeine Prozeduren kommen in ein oder mehrere Standardmodule (dort sind sie von "überall" aus dem Code"sichtbar"). Die für den Ablauf nötigen Variablen werden den Prozeduren per Übergabeparameter übergeben. (Stichwort "Scope" oder Gültigkeitsbereich). Ein Funktion besitzt zudem einen Rückgabewert (im Gegensatz zu einer Sub), der dann entsprechend in aufrufenden ode weiterverarbeitet werden kann.
Die Ereignisprozedur-Situation habe ich schon angedeutet.
PS: Ja, in diese Richtung geht es.
Und schreib in JEDEM Modulkopf unterhalb Option Compare Database
Option Explicit
dazu...
Hallo,
natürlich hast dur Recht mit den VBA-Grundlagen, das Problem ist nur das meine DB eine Projektarbeit, welche ich am Montag vorstellen muss.
Soweit hat ja auch alles geklappt, hab mit dem VBA-Code den ich drin hab, klar das ist nicht viel und nix kompliziertes.
Allerdings will mein Projektbetreuer halt diese Anmeldung drin haben und er hat mir ja auch diesen Beispiel-Code gestern noch geschickt, aber ich komme damit halt in der Kürze der zeit nicht mehr klar.
Deswegen habe ich mich ja, quasi aus Verzweiflung, an dieses Forum gewandt.
Ich hätte auch nicht gedacht, dass es doch so kompliziert ist.
Ich würde meine DB ja mal hochladen, aber ich krieg sie nicht auf 200 kb. :(
Hi,
Zitat von: DF6GL am Juni 08, 2013, 11:09:36
PS: Crossposting ist allerdings nicht so gern gesehen.....
alias: nmjgerhögo auf: http://www.ms-office-forum.net/forum/showthread.php?p=1516921
Harald
Ja und, wo ist das Problem?
Hi,
Zitat von: AccessNewbie2013 am Juni 08, 2013, 16:19:36
Ja und, wo ist das Problem?
Auf Deiner Seite
auf dem ersten Blick: keins
Auf der Seite der Antwortgeber schon, da die, wie in etlichen Beiträgen bemerkt, unabhängig von einander an selben Thema arbeiten. Wenn dafür Geld zu zahlen wäre, würdest Du das vermutlich nicht machen wollen. Aber da wir das in unserer Freizeit machen, kann das ja egal sein?
Da es zumindestens mir nicht egal ist:
Auf Deiner Seite
auf dem zweiten Blick: Problem wird sein, dass es es weniger Antworten gibt, da keiner unnütze doppelte Arbeit machen will.
Harald
Hi,
und zum Thema Crossposting siehe auch:
http://www.access-o-mania.de/index.php?ind=community&op=netiquette
Crossposting, d.h. das Posten der gleichen Frage in mehreren Foren zur gleichen Zeit, ist unerwünscht.
Harald
Sorry, aber das ist einfach LÄCHERLICH!
Hi,
Zitat von: AccessNewbie2013 am Juni 08, 2013, 16:47:56
Sorry, aber das ist einfach LÄCHERLICH!
Meinst Du damit die Forenregeln, die ich oben zitiert habe und die Du bei Deiner Anmeldung akzeptiert hast?
Zum Thema Crossposting gibt es auch von anderen Leuten kritische Meunugen:
http://das-excel-forum.de/cross.htm
http://www.access-o-mania.de/forum/index.php?topic=14895.msg85540#msg85540
Harald
Okay, du hast Recht, bin das erste mal aktiv in solchen Foren unterwegs.
Und der Begriff Crossposting war mir jetzt auch nicht geläufig.
Ich erkläre aber trotzdem kurz warum ich das in zwei Foren gepostet habe, es war einfach Verzweiflung.
Meine DB ist, wie ich ja schon erklärt habe ein Schulprojekt und eigtl sollte diese DB ohne Anmeldung laufen.
Aber gestern bekam ich eine Mail von meinem Projektbetreuer das ich das ganze doch mit einer Anmeldung versehen sollte.
Und er hat mir o.g. Code-Fragmente geschickt, die ich anpassen sollte. Aber wie gesagt komme ich damit einfach nicht klar.
Und das Problem an der Sache ist einfach, das ich die DB breits am Montag abgeben muss und nach dem ich in dem anderen Forum
keine brauchbare Rückmeldung bekommen habe, habe ich halt in diesem Forum noch mal gepostet, dachte ja nicht dass das ein Problem ist.
Also Entschuldigung dafür, war nicht böse gemeint oder so was!
Hi,
danke für die Info.
Zitat von: AccessNewbie2013 am Juni 08, 2013, 12:47:53
Ich würde meine DB ja mal hochladen, aber ich krieg sie nicht auf 200 kb. :(
Datenbank mit einige Spieldaten sollte reichen.
Erste Maßnahme: Komprimieren und Reparieren im access Menü aufrufen.
Dann die Datei in gezippter Version (aber bitte im access 2003 Format, andere kann ich nicht lesen) hier reinstellen.
Oder kann es sein, dass Grafiken, Bilder, Logos enthalten sind?
Wenn ja bitte diese entfernen!
Harald
Hallo,
leider kann ich meine DB nicht als 2003 Version abspeichern, "...da in ihr Feature verwendet werden, für die das aktuelle Dateiformat erforderlich ist"
Und gezippt bekomm ich sie auf maximal 457 KB, mit einem abgespeckten Formular und einer Tabelle.
:'(
Hi,
in Ermangelung von konkreten Angaben zu Tabellen, Beziehungen, Formularen habe ich ein paar Annahmen getroffen und einen Vorschlag entwickelt (ist unter a2003 in gezippter Version nur 20 kb lang!).
Es gibt ein popup-Formular (wird noch nicht automatisch aufgerufen, ist aber über ein autoexec-Makro machbar), in dem im ungebundenen Kombifeld ausgewählt wird, ob Admin, Benutzer oder Gast.
Nach Eingabe eines Kennwortes wird geprüft:
a) Kennwort stimmt überein => Button "Weitermachen" wird angezeigt. Dort müßte eine Routine zum Öffnen eines weiteren Formulars hinterlegt werden
b) stimmt nicht überein => weitere Felder werden angezeigt: Benutzer_Name und zweimal ungebundene Email-Adresse (ohne jegliche Prüfung, ob der Eintrag einer Email-Adresse entspricht).
Wenn bei b) korrekte Angaben vorliegen, wird ein Button "Registrierungsdaten absenden" angezeigt. Nach Klicken darauf werden die Eingaben gesichert und eine Email abgesendet (ist zur Zeit deaktiviert,da die Routinen unvollständig im ersten Beitrag gelistet wurden).
Harald
[Anhang gelöscht durch Administrator]
Hi,
super, vielen Dank für deine Mühe, ich werde gleich versuchen das ganze umzusetzen.