Achtung Dummie :-) Probs mit if-then

Huhu liebe ExpertInnen,

bitte nicht schimpfen, das ist bestimmt eine dumme Frage, aber ich bin bezüglich Programmieren auch wirklich blutiger Anfänger ;-/

Habe mir das Buch „Access 2000 Programmierung“ gekauft und mache meine allerersten Gehversuche… und fliege bereits beim ersten Schritt (Kapitel 1) auf die Schnauze ;-(.

Und zwar sollte man da den vorgegebenen Quelltext für eine einfache Passwortabfrage abtippen, ausprobieren, und anschließend werden die einzelnen Elemente erklärt. Mein Prob ist nun, daß bereits diese einfache Routine absolut nicht laufen mag :frowning:. Ich habs oft genug verglichen, Tipfehler sind keine drin, es ist original der im Buch vorgeschriebene Code. Aber wenn ich es in Access 2000 laufen lassen will, bekomme ich die Fehlermeldung „Fehler beim Kompilieren: Else ohne If“.

Zum Kuckuck, was mache ich denn falsch??? Da ist doch ein If ??? Kann denn sie Sch…kiste nicht lesen??? Aus der angebotenen Hilfe zur Syntax zur If-Then-Anweisung finde ich auch keinen Fehler in meiner Syntax. Wer kann mir helfen?

Danke!

LG, Nena

der Code:

Sub Logon()

'Variablendeklarationsabschnitt
Dim Benutzername
Dim Kennwort
Dim q1
Dim q2

'Variablendefinitionsabschnitt
Benutzername = InputBox("Sie programmieren mit Access 2000." & Chr(13) & Chr(13) & "Bitte geben Sie Ihren Benutzernamen ein.")
Kennwort = InputBox("Das haben Sie prima gemacht!" & Chr(13) & Chr(13) & "Geben Sie bitte Ihr Kennwort ein.")

'Ausführung der Abfrage
q1 = DLookup("[Benutzername]", "Erste Tabelle", "[Benutzername] = Benutzername")
q2 = DLookup("[Kennwort]", "Erste Tabelle", "[Kennwort] = Kennwort")

'Programmverarbeitungsabschnitt

 If Benutzername = q1 And Kennwort = q2 Then MsgBox "Glückwunsch! Sie erhalten eine Zigarre!"
 Else
 MsgBox "Hey, das ist falsch!" & Chr(13) & "Sie erhalten keine Zigarre!"
 End If

End Sub

Auch Huhu,

nicht gleich verzweifeln. Hier sind ja ein paar Leute die dir vielleicht helfen können.

Versuchs mal so

If Benutzername = q1 And Kennwort = q2 Then
MsgBox „Glückwunsch! Sie erhalten eine Zigarre!“
Else
MsgBox „Hey, das ist falsch!“ & Chr(13) & „Sie erhalten keine Zigarre!“
End If

Der Compiler kann dein Programm nicht übersetzten, weil er nach dem Schlüsselwort THEN entweder den nächsten Befehl erwartet und dann für ihn die IF-Anweisung beendet ist, oder aber er findet den Befehl in der neuen Zeile und weiss dann, daß die IF-Anweisung mit einer ELSE-Anweisung noch weiter geht.

Siehst du, es ist doch gar nicht so schwer.

Viel Erfolg und Ausdauer beim Lernen wünscht dir
Hans

Re-Huhu :smile:))

vielen Dank erst mal, hat soweit funktioniert :smile:
aber da taucht schon gleich das nächste Problem auf :frowning:.

Und zwar läuft diese Paßwortabfrage einwandfrei, wenn ich die Daten des ersten Datensatzes der Tabelle verwende. Gebe ich aber Usernamen und Paßwort der 2. oder fortfolgenden Zeile ein, bekomme ich die Meldung, daß die Eingabe falsch wäre. Was mache ich nu wieder kervehrt? *schüttel*

Und außerdem bringt mir der Compiler keine Fehlermeldung (das kann bei mehreren Seiten Quelltext mühsam werden…). Kann es sein, daß der Compiler den Access2k (mit SP2) einen Schuß hat? Wo kriege ich einen besseren her und wie kann ich ihn in Access einbinden?

Viel Dank für Help :smile:)

LG, Nena

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Re-Huhu :smile:))

Bock-Huhu2.

Und zwar läuft diese Paßwortabfrage einwandfrei, wenn ich die
Daten des ersten Datensatzes der Tabelle verwende. Gebe ich
aber Usernamen und Paßwort der 2. oder fortfolgenden Zeile
ein, bekomme ich die Meldung, daß die Eingabe falsch wäre. Was
mache ich nu wieder kervehrt? *schüttel*

q1 = DLookup("[Benutzername]", "Erste Tabelle", "[Benutzername] = Benutzername")

heißt die Codezeile. Zunächst sei angemerkt, dass es dämlich von den Buchautoren ist, die Formularvariable genau wie die Tabellenvariable zu nennen. Dein Buch stammt nicht zufällig aus einem Verlag, der mit Data anfängt und mit Becker aufhört? *schudder*

Ich mache jetzt einmal

NameAbfr=DLookup("TabBenutzer","Erste Tabelle","TabBenutzer=EingBenutzer")

daraus. Das heißt übersetzt, Access soll die Zeile in der Tabelle finden, in der der Benutzername (TabBenutzer) mit Deiner Eingabe (EingBenutzer) übereinstimmt. Wenn das nicht klappt und die DLookup-Funktion immer nur beim ersten Benutzernamen funktioniert, gibt es zwei Möglichkeiten :

Erstens - teste mal, ob nach einem Neustart der Datenbank bei Anmeldung mit dem „zweiten“ Benutzernamen der gleiche Fehler auftritt. Wenn ja, ist tatsächlich die DLookup-Abfrage irgendwie falsch getippt bzw. Access kommt mit den beiden gleich benamsten Variablen nicht klar.

Zweitens :Wenn nein, tritt der Fehler nur beim „Zweitversuch“ auf, d.h. die DLookup-Abfrage wird ausgeführt, bevor der Datensatz im Formular aktualisiert worden ist. Dann stimmt Deine Ereignisreihenfolge nicht. Um das ggf. zu verifizieren, füge folgenden Code vor den DLookup-Aufruf ein :

MsgBox "Ihre Eingabe für den Benutzernamen : "+EingBenutzer

Damit bekommst Du Deine Eingabe, so wie sie Access (miss)versteht, vor dem Abgleich noch einmal angezeigt. Ist das dann der Datensatz aus dem vorigen Versuch - Bingo.

Führe diese Tests aus, und melde Dich ggf. noch einmal, zwecks weiterer Fehlersuche (tut mir leid, aber Diagnose per Net, ohne den Code zu haben, ist nicht ganz trivial!).

Gruß kw

Immer langsam mit den jungen Pferden
Hallo, hallo, hallo,

Und außerdem bringt mir der Compiler keine Fehlermeldung (das
kann bei mehreren Seiten Quelltext mühsam werden…). Kann es
sein, daß der Compiler den Access2k (mit SP2) einen Schuß hat?
Wo kriege ich einen besseren her und wie kann ich ihn in
Access einbinden?

Nichts hat einen Schuss ab. Der Compiler bringt keine Fehlermeldung, weil dein eingegebenes Programm völlig OKAY ist.

Merke:
Wo keine Fehler sind, können auch keine gefunden werden

Nur leider macht dein Programm nicht das, was du dir wünschst, das es tun soll, sondern es macht das, was du gesagt hast, das es tun soll. (Du merkst den Unterschied ?)

Was macht also das Programm? Es schaut in einer Tabelle, die „Erste Tabelle“ heisst und die Spalten „Benutzername“ und „Kennwort“ besitzt nach, ob dort in der 1.Reihe in der Spalte „Benutzername“ der eingegebene Benutzername zu finden ist, und überprüft dann auf die selbe Weise den Eintrag in der 1.Reihe in der Spalte „Kennwort“.
Und nun lass mich raten. Du hast keine Tabelle mit diesen Einträgen angelegt. Stimmt’s ??
Also dein Programm ist syntaktisch korrekt (deswegen kein Compiler Fehler), kann aber beim Ausführen nicht die richtigen Daten finden. Da du diesen Fehlerfall aber selbst mit einem kleinen Progammstück abfangen musst, das natürlich noch nicht vorhanden ist, kann dein Programm sich nur mit einer Fehlermeldung zurückziehen. Das du mit deinem Programm auf nicht existierende Daten zugreifen willst kann kein Compiler bemerken. Diese Art von Fehlern nennt man nämlich „Laufzeitfehler“.
Also 2 Dinge gelernt:

  • Compiler überprüfen die Syntax
  • Laufzeitfehler treten zur Laufzeit des Programms auf und müssen selbst abgefangen werden.

Also nun eine Tabelle einrichten mit dem Namen „Erste Tabelle“ und mit den Spalten
Benutzername Kennwort

Dann in die Felder der Tabelle einen Benutzernamen und ein Kennwort eintragen.
Anschliessend das Programm starten und den gleichen Benutzernamen und das gleiche Kennwort wie in der Tabelle eingeben und dann, ja dann solltest du den Satz

„Glückwunsch! Sie erhalten eine Zigarre!“

sehen.

Viel Erfolg
Hans

Hallo kw :smile:

sorry, kam net früher dazu. Zuhause kam ich an die Datei nicht dran und heute Vormittag mußte ich mich mit einem anderen Prob herumschlagen (MS hat noch mehr zu bieten, womit man sich ärgern kann, als Access-VBA :wink:

Bock-Huhu2.

was heißt eigentlich „Bock-Huhu2“?

q1 = DLookup("[Benutzername]", „Erste Tabelle“,
„[Benutzername] = Benutzername“)

heißt die Codezeile. Zunächst sei angemerkt, dass es dämlich
von den Buchautoren ist, die Formularvariable genau wie die
Tabellenvariable zu nennen. Dein Buch stammt nicht zufällig
aus einem Verlag, der mit Data anfängt und mit Becker aufhört?
*schudder*

Nööö, nix Data Becker, ein Verlag namens mitp-Verlag/Bonn (ISBN: 3826605772 Buch anschauen)

Erstens - teste mal, ob nach einem Neustart der Datenbank bei
Anmeldung mit dem „zweiten“ Benutzernamen der gleiche Fehler
auftritt. Wenn ja, ist tatsächlich die DLookup-Abfrage
irgendwie falsch getippt bzw. Access kommt mit den beiden
gleich benamsten Variablen nicht klar.

Nach Neustart des Rechners und somit Neustart von Access und der Datenbank ist das Prob immer noch dasselbe.

Zweitens :Wenn nein, tritt der Fehler nur beim „Zweitversuch“
auf, d.h. die DLookup-Abfrage wird ausgeführt, bevor
der Datensatz im Formular aktualisiert worden ist. Dann stimmt
Deine Ereignisreihenfolge nicht. Um das ggf. zu verifizieren,
füge folgenden Code vor den DLookup-Aufruf ein :

MsgBox "Ihre Eingabe für den Benutzernamen :
"+EingBenutzer

Damit bekommst Du Deine Eingabe, so wie sie Access
(miss)versteht, vor dem Abgleich noch einmal angezeigt. Ist
das dann der Datensatz aus dem vorigen Versuch - Bingo.

Ich kriege zwar die Dialogbox mit dem Text "Ihre Eingabe für den Benutzernamen: ", aber keine Ausgabe für die Benutzer-Eingabe. Wenn ich anstattdessen „+Benutzername“ tippe (im Variablendeklarationsabschnitt habe ich ja nur die Variablen „Benutzername“, „Kennwort“, „NameAbfr“, „q1“ und „q2“ mit dim angelegt), dann wird die korrekte Eingabe (entspricht dem 3. Datensatz meiner Tabelle „ErsteTabelle“ auch in der Messagebox ausgegeben.

Dann folgt aber die Fehlermeldung:
"Laufzeitfehler ‚2471‘:
Der Ausdruck, den Sie als Abfrageparameter eingegeben haben, hat folgenden Fehler verursacht: ‚Microsoft Access kann den eingegebenen Namen ‚TabBenutzer‘ nicht finden‘ " und wenn ich auf „Debuggen“ klicke, ist im Modul die Zeile

NameAbfr = DLookup ("TabBenutzer", "ErsteTabelle", "TabBenutzer=EingBenutzer")

gelb hinterlegt.
Ich komme im Moment nicht darauf, wofür das „TabBenutzer“ steht? Und welche Variable steht für das „EingBenutzer“? Sorry, aber ich sagte ja schon, daß ich in Punkto Programmieren ein echter „DAU“ bin ;-/

Führe diese Tests aus, und melde Dich ggf. noch einmal, zwecks
weiterer Fehlersuche (tut mir leid, aber Diagnose per Net,
ohne den Code zu haben, ist nicht ganz trivial!).

Kein Problem. Danke für Deine Hilfe! Wenn Du magst, kann ich Dir ja die mdb-Datei rübermailen…

LG, Nena

P.S. der Code, so wie ich ihn momentan (nach Abarbeiten dieses Mails) drin habe:

Option Compare Database

Sub Logon()

'Variablendeklarationsabschnitt
Dim Benutzername
Dim Kennwort
Dim NameAbfr
Dim q1
Dim q2

'Variablendefinitionsabschnitt
Benutzername = InputBox("Sie programmieren mit Access 2000." & Chr(13) & Chr(13) & "Bitte geben Sie Ihren Benutzernamen ein.")
Kennwort = InputBox("Das haben Sie prima gemacht!" & Chr(13) & Chr(13) & "Geben Sie bitte Ihr Kennwort ein.")
MsgBox "Ihre Eingabe für den Benutzernamen: " + Benutzername

'Ausführung der Abfrage
NameAbfr = DLookup("TabBenutzer", "ErsteTabelle", "TabBenutzer=EingBenutzer")

'Programmverarbeitungsabschnitt

 If Benutzername = q1 And Kennwort = q2 Then
 MsgBox "Glückwunsch! Sie erhalten eine Zigarre!"
 Else
 MsgBox "Hey, das ist falsch!" & Chr(13) & "Sie erhalten keine Zigarre!"
 End If

End Sub

Huhu Hans :smile:

Nichts hat einen Schuss ab. Der Compiler bringt keine
Fehlermeldung, weil dein eingegebenes Programm völlig OKAY
ist.

Merke:
Wo keine Fehler sind, können auch
keine gefunden werden

Nur leider macht dein Programm nicht das, was du dir wünschst,
das es tun soll, sondern es macht das, was du gesagt hast, das
es tun soll. (Du merkst den Unterschied ?)

Theoretisch ja :smile: Aber praktisch nein ;-(. Wie sage ich dem „dummen“ Programm denn, daß es sich nicht nur den ersten Datensatz anschauen soll?

Was macht also das Programm? Es schaut in einer Tabelle, die
„Erste Tabelle“ heisst und die Spalten „Benutzername“ und
„Kennwort“ besitzt nach, ob dort in der 1.Reihe in der Spalte
„Benutzername“ der eingegebene Benutzername zu finden ist, und
überprüft dann auf die selbe Weise den Eintrag in der 1.Reihe
in der Spalte „Kennwort“.
Und nun lass mich raten. Du hast keine Tabelle mit diesen
Einträgen angelegt. Stimmt’s ??

Der Kandidat hat keine hundert Punkte und gewinnt kein Senfglas :wink:)). Ich habe die Tabelle sehr wohl angelegt (ich bin zwar Programmier-Anfänger, aber kein Access-Anfänger) und die DB hat auch sehr wohl mehr als einen Datensatz :smile:)

Also dein Programm ist syntaktisch korrekt (deswegen kein
Compiler Fehler), kann aber beim Ausführen nicht die richtigen
Daten finden. Da du diesen Fehlerfall aber selbst mit einem
kleinen Progammstück abfangen musst, das natürlich noch nicht
vorhanden ist, kann dein Programm sich nur mit einer
Fehlermeldung zurückziehen. Das du mit deinem Programm auf
nicht existierende Daten zugreifen willst kann kein Compiler
bemerken. Diese Art von Fehlern nennt man nämlich
„Laufzeitfehler“.

Niente. Ich greife auf sehr wohl existierende Daten zu! Warum zum Teufel nimmt er die erste Zeile der Tabelle, aber nicht die 2. und 3.??

Also 2 Dinge gelernt:

  • Compiler überprüfen die Syntax
  • Laufzeitfehler treten zur Laufzeit des Programms auf und
    müssen selbst abgefangen werden.

Also nun eine Tabelle einrichten mit dem Namen „Erste Tabelle“
und mit den Spalten
Benutzername Kennwort

grrrr. Hab ich doch schon längst :smile:

Dann in die Felder der Tabelle einen Benutzernamen und ein
Kennwort eintragen.
Anschliessend das Programm starten und den gleichen
Benutzernamen und das gleiche Kennwort wie in der Tabelle
eingeben und dann, ja dann solltest du den Satz

„Glückwunsch! Sie erhalten eine Zigarre!“

sehen.

Wieder Irrtum. Ich habe die Tabelle, ich habe die Daten, aber den Satz „Hey, das ist falsch! Sie erhalten keine Zigarre!“

Und nu? Wenn Du magst, kann ich Dir die bescheuerte dmb-Datei, so wie sie gerade ist (siehe Re auf kw’s Antwort) mailen…

LG, Nena *verwirrt*

Ha-Räusper …
Darf ich mich einmischen? :smile:

q1 = DLookup("[Benutzername]", "Erste Tabelle",
"[Benutzername] = Benutzername")

Aus der Ferne betrachtet denke ich mal, dass die Zeile doch wohl

q1 = DLookup("[Benutzername]", "Erste Tabelle",
"[Benutzername] = '" & Benutzername & "'")

lauten müsste.

Sonst wird als WHERE-Bedingung eben genau
[Benutzername] = Benutzername
übergeben und nicht
[Benutzername] = .

Lautet der Eintrag in der 1. Tabellenzeile vielleicht „Benutzername“/„Passwort“?

Grüßigerweis
Ralf

Hallo.

was heißt eigentlich „Bock-Huhu2“?

ist nach der reinen Lehre (ommmm) die skatmathematisch korrekte Antwort auf das von Dir in einem früheren Posting gebrauchte Re-Huhu.

Kein Problem. Danke für Deine Hilfe! Wenn Du magst, kann ich
Dir ja die mdb-Datei rübermailen…

Wäre eine Möglichkeit, aber vielleicht kriegen wir’s auch so …

Option Compare Database

Sub Logon()

'Variablendeklarationsabschnitt
Dim Benutzername
Dim Kennwort
Dim NameAbfr
Dim q1
Dim q2

'Variablendefinitionsabschnitt
Benutzername = InputBox(„Sie programmieren mit Access 2000.“ &
Chr(13) & Chr(13) & „Bitte geben Sie Ihren Benutzernamen
ein.“)
Kennwort = InputBox(„Das haben Sie prima gemacht!“ & Chr(13) &
Chr(13) & „Geben Sie bitte Ihr Kennwort ein.“)
MsgBox "Ihre Eingabe für den Benutzernamen: " + Benutzername

'Ausführung der Abfrage
NameAbfr = DLookup(„TabBenutzer“, „ErsteTabelle“,
„TabBenutzer=EingBenutzer“)

Wenn Du den (von mir vorgeschlagenen) EingBenutzer nicht verwendest, findet Access den natürlich auch nicht *seufz*

Nach Deinem obigen Code zu schließen, müsste es korrekt

NameAbfr=DLookup("TabBenutzer","ErsteTabelle","TabBenutzer='"&Benutzername&"'")

heißen.

Der Grund für den Wirrwarr mit den & und ’ ist, dass Du einen String als „SQL WHERE“- Klausel (das ist der letzte Teil der DLookup- Anweisung) übergibst und in diesem String Deine Variable Benutzername ebenfalls als String transportieren musst.

Also :

DLookup("gna","gnagna","gnagnagna=Bummpeng")

sucht nach der Zeichenkette"Bummpeng".

DLookup("gna","gnagna","gnagnagna='"&Bummpeng&"'")

sollte dagegen nach dem Inhalt der Variablen"Bummpeng" suchen …

Domänenfunktionen sind eigentlich nix für Anfänger …

wenn Du nicht klarkommst, melde Dich nochmal mehlweise.

meint kw

Hi Nena, schon kapitulliert ??

Hallo,

war gestern unterwegs, daher die Funkstille.

Wie schon gesagt, das Programm tut genau das, was man ihm sagt.
Es sucht halt eben nur in der ersten Zeile der Tabelle und in keiner anderen!!
Allerdings schliesse ich mich der Meinung von Ralf an (ich hoffe, seine Erkältung hat sich gelegt), daß es heissen muss

q1 = DLookup("[Benutzername]", „Erste Tabelle“,"[Benutzername] = ‚" & Benutzername & "‘")

und auch die spitzigen Bemerkungen deinerseits bezüglich der bereits angelegten Tabelle waren berechtigt.
Ich hätte mir dein posting etwas genauer durchlesen sollen.

Okay, wenn du die Flinte noch nicht ins Korn geschmissen haben solltest, hier ein Vorschlag.
Du hast eine Tabelle, die „Erste Tabelle“ heisst und die drei Spalten

Index Benutzername Kennwort

und mehrere Zeilen hat. Index ist eine laufende Ziffer die mit (AutoNumber) weitergezählt wird. Das folgende
Programm liefert dir die Zeile, in der die INFOs zu den eingegebenen Werten passt.

Sub Logon()

'Variablendeklarationsabschnitt
Dim Benutzername
Dim Kennwort
Dim q1
Dim a$

'Variablendefinitionsabschnitt
Benutzername = InputBox(„Sie programmieren mit Access 2000.“ & Chr(13) & Chr(13) & „Bitte geben Sie Ihren Benutzernamen ein.“)
Kennwort = InputBox(„Das haben Sie prima gemacht!“ & Chr(13) & Chr(13) & „Geben Sie bitte Ihr Kennwort ein.“)

'Hier wird das Suchkriterium zusammengebastelt
'Chr(39) ist das Apostroph
a$ = "[Benutzername] = " + Chr(39) + Benutzername + Chr(39)
a$ = a$ + " AND [Kennwort] = " + Chr(39) + Kennwort + Chr(39)

'Ausführung der Abfrage
q1 = DLookup("[Index]", „Erste Tabelle“, a$)

'Programmverarbeitungsabschnitt
If q1 „“ Then
MsgBox "Glückwunsch! Eintrag in " + Str(q1) + „. Zeile gefunden!“
Else
MsgBox „Eintrag nicht gefunden!“
End If

End Sub

Probiers mal aus

Gruss
Hans

Hallo Ralf :smile:))

Darf ich mich einmischen? :smile:

Auch Dir Danke für Deine Mühe!

Aus der Ferne betrachtet denke ich mal, dass die Zeile doch
wohl

q1 = DLookup("[Benutzername]", „Erste Tabelle“,
„[Benutzername] = '“ & Benutzername & „’“)

lauten müsste.

Nö, funktioniert leider genausowenig. Selbes Ergebnis wie vorher. Access bringt mir die MsgBox für die falsche Eingabe, obwohl ich die Daten der 3. Tabellenzeile eingebe.

Lautet der Eintrag in der 1. Tabellenzeile vielleicht
„Benutzername“/„Passwort“?

Nein, „Benutzername“ und „Passwort“ sind nur die Feldnamen, stehen aber in keiner Tabellenzeile. Inhalt meiner Tabelle „ErsteTabelle“:
1 Schneider Kane
2 Müller Milch
3 Hugo 123

LG, Nena

Hallo kw,

immer noch Danke für Deine viiiiele Mühe!!! *BussiaufdieBacke*

Wenn Du den (von mir vorgeschlagenen) EingBenutzer
nicht verwendest, findet Access den natürlich auch nicht
*seufz*

*heuuuuul*, ich hab doch schon soooo oft gesagt, daß ich blutiger Anfänger bin und im Prinzip rein gar nix verstehe. Wenn ich Deinen vorgeschlagenen „EingBenutzer“ nicht verwendet habe, dann deshalb, weil ich Deine Tips nicht richtig kapiert habe, was das nu wieder für eine Variable ist und wie verwenden. Ich mach halt das was ich überhaupt versteh und kann nur das auch nachfragen, was mir überhaupt erst auffällt.

Wie schon bei Hans geschreiben, gehts mir auch vorrangig gar nicht wirklich darum, diese Paßwortabfrage zum Funktionieren zu bringen, denn dies ist ja keine echte zu-leistende-Arbeit, sondern ich versuche anzufangen (fast völlig ohne Programmiergrundkenntnisse), mir die Grundlagen der Programmiererei mit VBA anzueignen und bin wohl an das falsche Buch geraten. Werd mir wohl „VBA für Dummies“ kaufen müssen, in der Hoffnung, daß das dann auch wirklich „für Dummies“ ist und ausreichend Grundlagen erklärt, bevor mit „DLookup“-Funktionen und if-Abfragen um sich geworfen wird ;-(

Domänenfunktionen sind eigentlich nix für Anfänger …

wenn Du nicht klarkommst, melde Dich nochmal mehlweise.

Dank Dir! Aber ich habe inzwischen soooo viele Fragezeichen, daß ich auch denke, daß das ganz einfach too much ist für mich im Moment. Ich weiß schon gar nicht mehr, wo ich das fragen anfangen soll und jede Antwort wirft mehr Fragezeichen auf, als daß sie beseitigt ;-/

LG, Nena *nunvölligverwirrt*

Huhu Hans,

gestern war ich nicht im Haus, daher nu die Funkstille meinerseits :wink:. Ganz aufgegeben habe ich noch nicht, allerdings verstehe ich langsam aber sicher immer weniger anstatt mehr ;-(

Mir gehts auch vorrangig gar nicht wirklich darum, diese Paßwortabfrage zum Funktionieren zu bringen, denn dies ist ja keine echte zu-leistende-Arbeit, sondern ich versuche anzufangen (fast völlig ohne Programmiergrundkenntnisse), mir die Grundlagen der Programmiererei mit VBA anzueignen.

So wie sich mir die Sache im Moment darstellt, ist dieses Buch, das ich da erworben habe, aber nicht unbedingt für absolute Anfänger geeignet, weil erstens das Beispiel so nicht funktioniert das da als erste (!) Übung drin steht und zweitens keinerlei Grundlagen vermittelt werden, kein Grundverständnis etc… Diese Paßwortabfrage ist das erste, was nach dem „Vorwort“ kommt ;-(. Ich werde mir wohl erst mal noch ein anderes Buch kaufen müssen, eins das richtig für Leute wie mich gedacht ist, nämlich „VBA für Dummies“ :wink:))

q1 = DLookup("[Benutzername]", „ErsteTabelle“,"[Benutzername]
= ‚" & Benutzername & "‘")

Was würde das denn bewirken? Leider funktionierts auch nicht. Ich habs per copy&paste rüberkopiert und bekomme wieder die gleiche schon bekannte Meldung, daß die Eingabe falsch sei. Sie ist aber richtig und betrifft den 3. Datensatz meiner Tabelle.

und auch die spitzigen Bemerkungen deinerseits bezüglich der
bereits angelegten Tabelle waren berechtigt.

Oh oh, da ist wohl was falsch rübergekommen. Ich habe nur bissi gefrotzelt. Wenn ich Dich damit verletzt habe, tuts mir ehrlich leid! Sorry!

Okay, wenn du die Flinte noch nicht ins Korn geschmissen haben
solltest, hier ein Vorschlag.

Okay, das funktioniert soweit. Aber da ich ja verstehen und lernen will, um es ggf. auf andere Sachen anwenden zu können, noch ein paar Verständnisfragen, falls Du Zeit und Lust hast, es mir zu erklären:

Warum definierst Du in dem Abschnitt ‚Hier wird das Suchkriterium zusammengebastelt‘ die Variable a$ erst nur mit dem Benutzernamen und dann gleich nochmal neu mit a$=a$ + Kennwort? Verstehe ich es richtig, daß mit der zweiten Zeile die erste einfach nur überschrieben wird? Hätte man dann nicht auch genauso nur die eine Zeile

a$ = "[Benutzername] = " + Chr(39) + Benutzername + Chr(39) + " AND [Kennwort] = " + Chr(39) + Kennwort + Chr(39)

nehmen können? Funktionieren tuts jedenfalls so auch. Was ist der Sinn, die Anweisung, auf 2 Zeilen aufzuteilen?

Warum muß man das Apostroph mit Chr(39) umschreiben und kann es nicht einfach tippen?

Wozu wird der ganze String zusammengebastelt und vor allem warum lautet die if-Abfrage auf „“? Ist denn nicht immer was in q1 drin? Oder nur dann, wenn es den Datensatz gibt? Ich kapier leider auch die DLookup-Funktion und deren Syntax überhaupt nicht. Die Hilfe die mir das Buch und die Online-Hilfe von Access anbieten, sind mir leider zu hoch ;-(. Ich brauche also wohl wirklich ein „für-Dummies“-Buch…

Vielen Dank für all Deine Mühe!
LG, Nena

Gaaanz ruhig …
Hallo.

immer noch Danke für Deine viiiiele Mühe!!! *BussiaufdieBacke*

Kein Thema.

*heuuuuul*, ich hab doch schon soooo oft gesagt, daß ich
blutiger Anfänger bin und im Prinzip rein gar nix verstehe.

Kopf hoch Baby, let’s go boogie, die Bouzoukis klingen *** - Nimm den Scheffel mal wieder weg :wink:

***© Reinhard Mey

Buch geraten. Werd mir wohl „VBA für Dummies“ kaufen müssen,

Ich glaube nicht, dass das Dir etwas bringt.

und ausreichend Grundlagen erklärt, bevor mit
„DLookup“-Funktionen und if-Abfragen um sich geworfen wird ;-(

Also, Domänenaggregate als Einstieg ist ein, nennen wir’s mal unorthodoxer didaktischer Ansatz. Da brauchst Du Dir keine Vorwürfe zu machen; eine der häufigsten Fragen im Zusammenhang mit VBA ist nämlich genau das, was die Buchlinge hier beschreiben : die Verarbeitung von Modulvariablen außerhalb der Modulumgebung.

Die DLookup- Funktion hat, einfach ausgedrückt, die Aufgabe, Dir Angaben aus Tabellen zu beschaffen, die außerhalb Deiner eigentlichen Datenumgebung liegen (sagte ich gerade „einfach“? *ulp*).
Sagen wir, Du verarbeitest eine Kundenadresse, um einen Brief zu schreiben. An einer Stelle brauchst Du die Nummer der letzten Rechnung, die der Kunde erhalten hat. Dann bewegst Du Dich normalerweise in der Adressentabelle, beziehst Dich aber an einer einzigen Stelle auf einen anderen Datenbestand (nämlich Rechnungen). Dafür ist DLookup gedacht und funktioniert (Achtung, Pseudocode!) wie folgt :

DLookup([Feld der fremden Tabelle],[Name der fremden Tabelle],[SQL WHERE-Klausel])

und das Entscheidende ist die SQL WHERE- Klausel. Nun bringt es gar nix, hier weiterzureiten, wenn SQL nicht geläufig ist. Zumal Du in dem Ansatz aus dem Buch auch noch eine Variable in den SQL- String mit einbauen musst …

Ein anderes Thema ist die IF- Klausel. Die sieht grundiziell und prinzisätzlich so aus :

If (wahre Aussage) Then
'was soll passieren
Else (und nu kommt das, was passiert, wenn die Aussage nicht wahr ist)
'soll was anderes passieren
End If

Komplizierter ist das zunächst nicht. Probier doch einfach mal folgenden Code aus (im Formular, Eigenschaft „Beim Laden“, Ereignisprozedur) :

Sub Form\_Load()
Dim Answer As Integer

Answer=MsgBox("Bitte antworten Sie mit Ja oder Nein",vbYesNo)

If Answer=VbYes Then
 MsgBox "Sie haben mit Ja geantwortet."
Else
 MsgBox "Sie haben mit Nein geantwortet."
End If

End Sub

Damit müsste schon einiges klarer werden. Weitere kleine Hilfen auf Anforderung … :wink:

Gruß kw

Noch ein unerbetener Kommentar.

Nena,
starte den debuuger und setzte einen haltepunkt bei der zeile mit q1.
Dann kannst du in einzelschritten mit F8 das programm schrittweise abarbiten.
Setze immer den Cursor auf die Variable (q1) und wenn die Zeile abgearbietet ist wird der inhalt ange´zeigt.
So kannst du den coe schritt für schritt testen und findest den fehlr selbst.
Und lernstwas fürs leben :smile:
Wenn das nicht funktioniert schicke ich dir den richtigen code.
Have fun.
gruß Hans

Huhu Nena,

also dann lass uns mal weitermachen.

q1 = DLookup("[Benutzername]", „ErsteTabelle“,"[Benutzername]
= ‚" & Benutzername & "‘")

Was würde das denn bewirken? Leider funktionierts auch nicht. Ich habs per copy&paste
rüberkopiert und bekomme wieder die gleiche schon bekannte Meldung, daß die Eingabe falsch
sei. Sie ist aber richtig und betrifft den 3. Datensatz meiner Tabelle.

Der obige Befehl funktioniert aber. Er liefert dir den Benutzernamen, der in deiner Tabelle
„ErsteTabelle“ steht, den du eingegeben hast und nach dem du gesucht hast (wirklich eine
überaus nützliche Funktion ).
Vielleicht heisst deine Tabelle ja „Erste Tabelle“ ?? oder irgend ein anderer Tippfehler??

und auch die spitzigen Bemerkungen deinerseits bezüglich der
bereits angelegten Tabelle waren berechtigt.

Oh oh, da ist wohl was falsch rübergekommen.

Nö,nö, schon Okay.

Okay, das funktioniert soweit. Aber da ich ja verstehen und lernen will, um es ggf. auf
andere Sachen anwenden zu können, noch ein paar Verständnisfragen, falls Du Zeit und Lust
hast, es mir zu erklären:

Ei sischer doch.

Warum definierst Du in dem Abschnitt ‚Hier wird das Suchkriterium zusammengebastelt‘ die
Variable a$ erst nur mit dem Benutzernamen und dann gleich nochmal neu mit
a$=a$ + Kennwort?
Verstehe ich es richtig, daß mit der zweiten Zeile die erste einfach nur
überschrieben wird?

Deine Vermutung ist fast richtig :wink:

In der ersten Zeile lade ich die Variable a$ mit
a$ = "[Benutzername] = " + CHR(39) + Benutzername

und dann lade ich die gleiche Variable a$ mit

a$ = a$ + CHR(39) + " AND [Kennwort] = " + CHR(39) + Kennwort + CHR(39)
…I…I…I
…I…I…I
…±------------------------------ dem alten Wert von a$
…I…I
…I…I
…±------------±------- und zusätzlich das ganze restliche Zeugs

Ich bastle mir also die Variable a$ nach und nach zusammen. Ich überschreibe sie nicht, sondern
ich füge Stück für Stück was hinzu.
Ich hätte es noch viel mehr aufteilen können, was die Übersichtlichkeit des Aufbaus von a$ noch
erhöht oder aber ich hätte auch auf die Variable a$ verzichten können und den ganzen Sermon direkt
in den DLookup-Befehl schreiben können.
Spätestens das führt dann auch bei mir zum blackout und ich verstehe nur noch Bahnhof.
Ich finde, durch die Verwendung von a$ sieht doch der DLookup-Befehl sehr viel übersichtlicher
aus, oder ??
Es ist also nicht immer sinnvoll den Weg des minimalen Tippaufwands zu gehen, sondern es dient der
Lesbarkeit des Programms, wenn man auf Übersichtlichkeit achtet. Wenn man ein Fuchs im Programmieren
ist, kann man dann auf solche Umwege verzichten.

Hätte man dann nicht auch genauso nur die eine Zeile

a$ = "[Benutzername] = " + Chr(39) + Benutzername + Chr(39) + " AND [Kennwort] = " + Chr(39) + Kennwort + Chr(39)

nehmen können? Funktionieren tuts jedenfalls so auch. Was ist der Sinn, die Anweisung, auf
2 Zeilen aufzuteilen?

Völlig richtig erkannt. Sinn und Unsinn siehe oben

Warum muß man das Apostroph mit Chr(39) umschreiben und kann es nicht einfach tippen?

Muss man nicht und BINGO, dass du es auch einfach Tippen kannst.
Wie fast immer, gibt es mehrere Möglichkeiten, was richtig (falsch) zu machen.
Ich wollte einfach nur sicher gehen, dass nicht aus versehen ein Tippfehler auftritt.
„’“ und ‚"‘ sieht doch verdammt gleich aus, oder ??
Und wie ist es hier richtig „’ oder '“ ??

Wozu wird der ganze String zusammengebastelt

siehe oben

und vor allem warum lautet die if-Abfrage auf „“? Ist denn nicht immer was in q1 drin?
Oder nur dann, wenn es den Datensatz gibt?

Richtig !! Nur wenn was gefunden wurde steht in q1 was drin (Beschreibung von DLookup-Befehl
siehe weiter unten).
Also die Entscheidung bei der IF-Anweisung ob q1"" ist, ist dann Okay, wenn in q1 was drin
steht, also was gefunden wurde. Dann erhälst du die Meldung in welcher Zeile die Einträge
gefunden wurden.
Wenn q1="" ist, dann wurde nichts gefunden, ergo bekommst du den entsprechenden Rüffel.

Ich kapier leider auch die DLookup-Funktion und deren Syntax überhaupt nicht. Die Hilfe
die mir das Buch und die Online-Hilfe von Access anbieten, sind mir leider zu hoch ;-(.

Wie Okinaptz Uglwf ( einen besonders schönen Gruss an alle Klingonen und an alle anderen Treki’s)
auch schon erwähnt, ist es ziemlich beknackt von dem Autor in einem Grundlagenbuch gleich auf
Seite 3 einen so komplexen Befehl wie „DLookup“ zu verwenden.
Aber keine Angst vor grossen Tieren !!

Okay, dann mal langsam, was der Befehl macht.

DLookup("[Index]",„Erste Tabelle“,a$) macht folgendes
…I…I…I
…I…I…I
…I…I…I
…I…±-------------- In der Tabelle „Erste Tabelle“ wird das gesucht,
…I…I
…I…I
…I…±---- was in a$ angegeben ist.
…I
…I
…±---------------------- Wenn das gefunden wurde, dann gibt der Befehl
…DLookup das zurück, was in der gefundenen Zeile in
… der Spalte Index steht ( […] bedeutet Inhalt der
…Zelle in Spalte … ).
…Das ist dann die fortlaufende Ziffer der Zeile oder
…aber goar nischts ( „“ = leerer string ).

also

q1=DLookup("[Index]",„Erste Tabelle“,a$) bewirkt, dass q1 entweder

q1=„1“ oder q1=„2“ oder … wird, wenn Benutzername und Kennwort gefunden wurde
oder aber
q1="" wird, wenn Benutzername und Kennwort nicht richtig war.

Ich hoffe, der Nebel lichtet sich.

Wenn du weitere Fragen hast, wäre es vielleicht sinnvoll per E-Mail weiter zu machen, man
kann dann nämlich die Programme anhängen und muss nicht alles in den WWW-Editor
rüberkopieren. Darübenhinaus spart das auch Plattenkapazität auf dem WWW-Server und wir
riskieren nicht einen Anschiss vom Moderator.

Aber vielleicht lesen ja noch ein paar andere mit und korrigieren mich, wenn ich Mist verzapfe.

Gruss :smile:)

Hans

THX für ALLE! heute no time, melde mich Mo/Di
Huhu liebe ExpertInnen,

vor allem @ Hans, kw und Ralf,

gaaaaaaanz liiiiieben Dank für Eure Geduld und Eure Hilfsbereitschaft! Nur zur Info, mich gibts noch, ich habe noch nicht aufgegeben, aber ich habe heute und am Wochenende no time, mich mit VBA herumzuschlagen. Melde mich Montag oder Dienstag wieder :wink:

LG + schönes WE, Nena

Hallo Nena (DIE Nena? - Wau !!)

setz mal den Teil hinter „Then“ in eine neue Zeile, dann funzt´s

If Benutzername = q1 And Kennwort = q2 Then 

MsgBox "Glückwunsch! Sie erhalten eine Zigarre!"

gruss moritzbock

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]