Hallo zusammen,
ich versuche mit Access ein Vokabellernprogramm zu erstellen. Dafür habe ich eine Excel-Liste, wo ich die Vokabeln eingebe. Diese Liste habe ich als Tabelle/Formular in meiner Access-Datenbank. In Excel bzw. Access sehen die Spalten so aus:
Spalte 1: The buyer are put +++ (+-Zeichen deutet auf fehlendes Wort hin) by the stains.
Spalte 2 (als Hilfe bzw. Übersetzung): Die Käufer werden bei Schmutz abgeschreckt.
Ich habe weitere Spalten wie Zusatzinfos, Wortart oder sonstige Besonderheiten. Das klappt so auch ganz gut zum einfachen Lernen, nur leider weiß ich nicht, wie ich mir eine Frage-Antwort basteln kann, so dass in weiteren zwei Spalten Antwortzeilen - und mit einer Funktion nach Eingabe des fehlenden Wortes - folgendermaßen aussehen würden:
Spalte 3: off (Antwort bzw. das fehlende Wort)
Spalte 4: put off (erschrecken, abstoßen) - eine zusätzliche Info
Und dann, was ich noch gerne hätte, wäre der Hinweis: "Deine Antwort war richtig bzw. falsch".
Ich hoffe, ich habe mich verständlich ausgedrückt. Auf eure Hilfen wäre ich dankbar, aber bitte eine ausführliche Info bzw. SchrittfürSchritt-Beschreibung, da ich nicht so gut drauf bin :-((
Schöne Fest- und Feiertage
Hallo,
zu aller Anfang gleich vorab - wenn du (in Access) so etwas zusammenbauen willst vergiß Excel.
Die Struktur der Tabellen erlaubt keinen, wie auch immer angelegten Vergleich - es handelt sich bei Excel um eine Tabellenkalkulation die für solche Aufgaben denkbar ungeeignet ist.
Access ist eine relationale Datenbank und ist durch die Funktioinen die sich dahinter verbergen allemal der beste Weg solche Sachen zu realisiern.
So nun aber zu deiner Frage:
Du könntest das in Form eines 'Multiple Choice Tests' realisieren - die eine Möglichkeit,
eine Weitere wäre es ein Fragefomular zu haben und die Antworten vom Benutzer nicht auswählen sondern eingeben zu lassen.
Wobei mir nach deiner Darstellung zu urteilen die 2. Variante geeigneter erscheint.
In jedem der beiden Szenarien benötigst du als Minimum 2 Tabellen in folgender Konstruktion.
tblFragen
------------------
FragenID [AutoWert]
Fragetext [Text, 255]
tblAntworten
------------------
FragenID_FK [Zahl, LongInteger]
Antworttext [Text, 255]
Die Tabellen sind über die Felder FragenID und FragenID_FK 1:n in Beziehung zu setzen.
Auf einem Formular welches auf der tblFragen aufsetzt erstellst du ein GEBUNDENES Textfeld mit 'Fragetext' zur Anzeige der Frage, das Feld sollte die Eigenschaften 'gesperrt - ja' und 'aktiviert - nein' besitzen um ein Überschreiben des Fragetextes zu verhindern, sowie einem verborgenem GEBUNDENEN Textfeld mit Steuerelementinhalt 'FragenID'.
Weiter befindet sich auf dem Formular ein UNGEBUNDENES Textfeld zur Eingabe der Antwort (z.B mit dem Namen 'txtAntwort')
Weiter ein Button ('cmdAntworten') um der Applikation mitzuteilen, dass eine Antwort eingegeben wurde und der Vergleich mit den gespeicherten Antworten stattfinden kann.
Der Vergleich erfolgt nun dadurch, dass der eingegebene Text mit den gespeicherten Texten der tblAntworten - in Übereinstimmung mit 'FragenID' und 'FragenID_FK' auf Übereinstimmung geprüft wird.
Ist die Antwort richtig KANN z.B. über eine Messagebox eine Antwort von der Applikation gegeben werden ('Die Antwort war richtig', ....) durch Klicken auf OK wird zum nächsten Datensatz der tblFragen gewechselt,
die Antwort in txtAntwort gelöscht und die Sache beginnt von Vorne zu laufen.
Um einen ungewollen Datensatzwechsel (z.B. durch Betätigung des Mausrades, ...) zu vermeiden wäre eine geeignete Maßnahme dahingehend zu implementieren.
Natürlich ist dieses ein vollkommen einfach dargestelltes Verfahren, das je nach Bedarf ausgebaut, erweitert und verfeinert werden kann.
Die Möglichkeiten sind hier recht umfangreich, so dass eine strikt vorgegebene Vorgehensweise zum jetztigen Zeitpunkt nicht zielführend wäre.
Ich dsaher auch erst gar nicht darauf eingegangen, dss die Fragen und die zugehörigen richtigen Antworten ebenfalls
über geeignete Formularkonstrukte zu erfassen sind und NICHT in die Tabellen selbst eingegeben werden.
Du musst dir also im Vorfeld genau überlegen was du alles realisieren willst - ein Punktesystem, eine Vorauswahl von Fragen per Zufallsgenerator, die Vorgabe einer bestimmten Fragenanzahl,
die Speicherung von Ergebnissen, eine Benutzerverwaltung und, und, und ...
Dieses ist auch wichtig um die Tabellenstruktur VOR der Formularerstellung GENAU zu definieren und so das Datenmodell RICHTIG zu implementieren!
Ich denke wir werden dich hier noch des Öfteren antreffen ::) ;D
Hallo Peter,
vielen Dank für deine Antwort. Dein Lösungsvorschlag ist ungefähr meine Vorstellung. Könntest du mir folgendes etwas näher beschreiben:
"Der Vergleich erfolgt nun dadurch, dass der eingegebene Text mit den gespeicherten Texten der tblAntworten - in Übereinstimmung mit 'FragenID' und 'FragenID_FK' auf Übereinstimmung geprüft wird. Ist die Antwort richtig KANN z.B. über eine Messagebox eine Antwort von der Applikation gegeben werden ('Die Antwort war richtig', ....) durch Klicken auf OK wird zum nächsten Datensatz der tblFragen gewechselt, die Antwort in txtAntwort gelöscht und die Sache beginnt von Vorne zu laufen."
Danke und Grüße
Achim :-[
Hallo,
na dann lass mich das mal versuchen zu erklären:
Nun wird es so sein, dass nach der Auswahl einr Frage der Benutzer eine Antwort in das dafür vorgesehene Textfeld eingibt.
Denkbar wäre weiter, dass diese Eingabe durch einen Button-Klick als erledigt an die Applikation gemeldet wird.
Durch das dabei ausgelöste Ereignis (Button_Click) kann eine Übereinstimmung der Benutzerantwort mit der gespeicherten stattfinden.
Fragen stehen mit den Antworten in einer Beziehung, die sich über das Primäschlüsselfeld in tblFragen und das Fremschlüsselfeld in der tblAntworten definiert.
(Nach meinem kleinen Beispiel sind die Felder FragenID und FragenID_FK miteinander verbunden.)
Zur Feststellung der Übereinstimmung wird die gespeicherte Antwort mit dem Inhalt des Antwortfeldes verglichen.
....
If DLookup("Antworttext","tblAntworten","AntwortenID_FK=" & Me!FragenIDFeld) = Me!TextAntwort Then
Msgbox "Die Antwort ist richtig!"
Else
MsgBox "Die Antwort ist falsch!"
End If
(Obige Prüfung funktioniert nur wenn eine einzige mögliche Antwort gespeichert wurde,
sollten mehrere Antworten möglich gemacht werden muß die Überprüfung entsprechend angepaßt erstellt werden.)
Wird auf den OK-Button der Messagebox geklickt KANN auf den nächsten Datensatz (Frage) gewechswelt werden oder im Fehlerfall die Wiederholung einer Antwort erwartet werden.
Verständlicher?
HTH
Hallo Peter,
ich bin noch an dem Punkt: "Die Tabellen sind über die Felder FragenID und FragenID_FK 1:n in Beziehung zu setzen". Das schaffe ich irgendwie nicht. Es kommt immer wieder zur einer 1:1-Beziehung. Wo mache ich falsch?
Danke :-)
Hallo
in der tblFragen ist das Feld FragenID der Primärschlüssel und AutoWert
In der tblAntworten ist das Feld FragenID_FK ein 'normales' Zahlenfeld mit Felddatentyp LongInteger und fungiert dort lediglich als Fremdschlüssel zu tblFragen und ist Indiziert (Duplikate erlaubt).
Das Feld FragenID_FK besitzt also kein Schlüsselsymbol in der Entwurfsansicht der tblAntworten!
p.s. siehe Anhang!
[Anhang gelöscht durch Administrator]
Hallo Peter,
ich habs inzwischen irgendwie geschafft 1:n-Beziehung herzustellen. Im Prinzip alles nach deinem Vorschlag erledigt. Wenn ich nach Eingabe der Antwort auf den "Antwort prüfen" klicke, dann kommt die Meldung:
Laufzeitfehler 2465. Access kann das Feld "FragenIDFeld" nicht finden.
Wo mache ich wieder Fehler???
Danke für dein Verständnis :-) Aber wie lange kannst du mich noch aushalten??!!!
Viele Grüße und Danke
??? :o
Hallo Achim,
ZitatLaufzeitfehler 2465. Access kann das Feld "FragenIDFeld" nicht finden.
Wo mache ich wieder Fehler???
Schwer zu sagen ohne Code.
Poste den doch hier, und markiere die Zeile, die der Compiler gelb unterlegt.
gruss ekkehard
Hallo,
.... ist nicht so schlimm - da gibts Ärgeres, glaub mir!
Du hast das Feld FragenID der tblFragen nicht am Formular
Sieh im Anhang - aktualisiert mit Formular... ;)
Schau dir die paar Codezeilen hinter dem Button an.
Ist halt komplett einfach gehalten sodass der Ablauf leicht verständlich zu erfassen ist.
[Anhang gelöscht durch Administrator]
Viiiilen viielen Dank für eure Hilfe :-) Mein Kopf raucht!!!
Ich werde mich erst mal mit dem Anhang schlau machen, bevor ich noch was unternehme... So viel für heute :-)
Nochmals DANKE :-))
:-[
Hallo Peter,
ich hätte zwei Fragen:
1. Könntest du mir bitte erklären, wie dieser Code funtioniert? Wenn es chinesisch wäre, hätte ich vielleicht mehr und besser verstanden :-)
Private Sub cmdPruefen_Click()
Dim lngFrage As Long
Dim strAntwort As String
lngFrage = Me!FragenID
strAntwort = Me.txtAntwort
If DLookup("Antworttext", "tblAntworten", "FragenID_FK=" & lngFrage) = strAntwort Then
MsgBox "Die Antwort ist richtig!"
Me.txtAntwort = ""
DoCmd.GoToRecord , , acNext
Else
MsgBox "Die Antwort ist falsch!"
End If
End Sub
2. Gibt es die Möglichkeit, die Eingaben in die Tabellen in Fremdsprachen einzugeben wegen Akzentzeichen/Sonderzeichen z.B. wegen Französisch und Türkisch. Bisher habe ich mit einem Programm gearbeitet, welches mir die Möglichkeit zum Akzentzeichen gab. Anschließend habe ich alles an Excel exportiert. Mir fehlen nun einfach die sprachspezifischen Sonderzeichen mit Access.
Viele Grüße und danke im Voraus :-))
Hallo,
Also:
zuerst werden 2 Variablen angelegt (deklariert) Eine zur Aufnahme des Primärschlüssels der Frage und die Andere zur Aufnahme des eingegebenen Antworttextes.
Danach werden diese Variablen mit den Werten aus deren Quellen befüllt in dem der Inhalt der entsprechenden Steuerelemente des Formulars (Textfelder) ermittelt werden.
(Beides erfolgt in dem Code nur deshalb so detailliert weil ich dir den Ablauf leichter verständlich zeigen wollte - man kann mit diesen Werten auch direkt 'von der Quelle' arbeiten)
Danach werden diese Werte in eine Bedingung geschickt um sie einem Vergleich zu unterziehen. (If ..... )
Mit DLookup ... wird der Inhalt des Feldes 'Anworttext' in der Tabelle 'tblAntworten' ermittel, wobei der Fremdschlüssel 'FragenID_FK' (der ja ebenfalls ein Tabellenfeld der tblAntworten ist)
dem Primäschlüssel der tblFragen (dem Inhalt der Variablen lngFrage) entsprechen muss - "FragenID_FK=" & lngFrage
Somit kann man diese Bedingung wie folgt umschreiben:
Wenn der Antworttext aus der Tabelle gleich ist dem Text im Formularfeld dann
Erzeuge eine Messagebox und gib den Text "Die Antwort ist richtig" aus
Entleere das Antwortfeld am Formular
und gehe zum nächsten Datensatz der Tabelle tblFragen (= Datenherkunft des Formulars)
Sonst
Erzeuge ein Messagebox und gib den Text "Die Antwort ist falsch" aus
Bedingung beendet
Wobei im Fehlerfall der Datensatz nicht gewechselt wird und der Benutzer an der gleichen Frage 'hängenbleibt'
Wegen der Eingabe in fremdsprachlichem Stil
Französich sollte mit einer normalen Tastaturbelegung gehen, die Akzentzeichen sind ja vorhanden - denke ich mal.
Türkisch ... ???
OK, ich bin in diesen Sprachen weder bewandert noch interessiere ich mich dafür aber ich könnte mir vorstellen, dass sowas mit einer temporären Umstellung der Codepage funktionieren könnte.
Empfehlung - mach eine neue Anfrage im Forum auf ... Titel 'sprachspezifische Sonderzeichen für Türkisch eingeben'
Vielleicht findet sich hier jemand, der damit schon Erfahrung gesammelt hat
Hallo Peter, ;D
danke für deine ausführliche Antwort, die ich ausgedruckt und in meiner Freizeit studiert habe :-) Ich werde aber irgendwie nicht schlau mit der Zeile:
If DLookup("Antworttext", "tblAntworten", "FragenID_FK=" & lngFrage) = strAntwort
Es leuchtet mit irgendwie nicht ein, was das heißen soll. Gibt es vielleicht eine andere Möglichkeit oder eine ander Schleife, mit der das Programm ebenfalls funktionieren könnte.
Übrigens, welche Literatur könntest du mir zu VBA-Access empfehlen. Ich habe mich in der Buchhandlung umgeschaut. Dort finde ich Bücher entweder allgemein über Access oder sehr spezielle zu VBA, wobei ich feststellen musste, dass die Beispiel fast immer Mathe bezogen waren, was mich überhaupt nicht interessiert...
Viele Grüße... Achim
Hallo Achim,
ZitatIf DLookup("Antworttext", "tblAntworten", "FragenID_FK=" & lngFrage) = strAntwort
Es leuchtet mit irgendwie nicht ein, was das heißen soll.
ZitatWenn der Antworttext aus der Tabelle gleich ist dem Text im Formularfeld dann
Wenn = If
der Antworttext = DLookup("Antworttext", "tblAntworten", "FragenID_FK=" & lngFrage)
gleich = gleich (=)
Text im Formularfeld = Inhalt des Feldes in dem die Antwort eingegeben wurde
dann = Then
Was ist daran nicht zu verstehen? ;)
gruss ekkehard
Hallo,
vielleicht noch ein wenig vereinfacht:
mit DLookup("Antworttext", "tblAntworten", "FragenID_FK=" & lngFrage)
wird der Antworttext aus der tblAntworten geholt
und mit dem Inhalt der String-Variabeln verglichen - diese Variable enthält den Antworttext aus dem Formular, die Antwort, die der Benutzer eingegeben hat.
Wenn du die Aggregatsfunktion DLookup 'eindeutschst' würde das ungefähr so lauten:
Gehe in der 'tblAntworten' zum Datensatz in dessen Feld 'FragenID_FK' jener Schlüssel steht der in der Variablen 'lngFrage' gespeichert ist und ermittle den Inhalt des Feldes 'Antworttext'
Die Variable 'strAntwort' wurde zuvor durch dieser Zeile ...
strAntwort = Me.txtAntwort
mit dem eingegebenen Text befüllt.
Hmmmm.... noch einfacher gehts aber jetzt wirklich nicht mehr ::)
Lies dazu auch in der Onlinehilfe oder im I-Net unter den Suchbegriffen 'DLookup', 'DomWert' und 'Domänenaggregate'
Guten Abend zusammen,
und danke für eure Antworten :-)
Als, ich verstehe im Prinzip mehr oder weniger in der vorgegebenen Form, was der Code bedeutet. Ich selbst würde ich aber nie auf so eine Idee kommen. Die Programmcodes sind mir irgendwie nicht einleuchtend. Ich bin verwundert, wie so ein Code funktioniert, denn ich kann das beschriebene Ereignis nicht nachvollziehen. Die Parameter oder wie die heißen, sind einfach mit Kommas voneinander getrennt und wie versteht das der PC? Es tut mir schrecklich Leid, ich kenne mich soweiso nicht aus und wage vielleicht solch blöde Argumente :-( Ich beispielsweise würde so ein Code versuchen:
While
"antworttext" from tblAntworten = & lngFrage
and & lngFrage = "FragenID_FK"
do ...
else ...
So etwas in der Richtung könnte ich verstehen. Ich habe mich lange mit Programmiersprachen leider ohne Erfolg beschäftigt :-(((. In der Vergangenheit habe ich etwa 1 Jahr lang immer wieder versucht, aber im Endeffekt aufgegeben. Vielleicht liegts dran, warum ich nicht verstehe....
???
Grüße
achim
Hallo,
ZitatDie Parameter oder wie die heißen, sind einfach mit Kommas voneinander getrennt und wie versteht das der PC?
die DLookup-Funktion ist eine vorgefertigte Funktion, der lediglich die benötigten Parameter wie Feldname und Tabellenname sowie eine 'WHERE_Klausel' zur Einschränkung übergeben werden muss.
Dabei ist vorgeschrieben, dass die Parameter durch Beistrich getrennt angegeben werden müssen.
Das - sorry - etwas seltsame Codefragment deiner Phantasie stellt bei viel gutem Willen eine Art von While - Schleife dar. :o
Mit der kannst du zwar auch einen Vergleich anstellen allerdings ist das ..... zzzzz vergiß es,
Schleifen dienen dazu bestimmte Codezeilen immer wieder auszuführen, bis die Bedingung im Kopf oder im Fuß der Schleife erfüllt ist
while i < 6
i = i + 1
wend
Do While i < 6
MsgBox "immer noch zu klein"
i = i +1
Loop
Hast du schon die OH in Bezug auf Domänenaggregate und DLookup befraget?
Hallo Peter,
jetzt versteh langsam, warum ich nicht verstehe :-)
Diese Schleife ist also eine vorgefertigte Form! In der vorgeschriebenen Reihenfolge werden die Daten vom PC verarbeitet...
Es hat mich nämlich gewundert, woher der PC wissen soll, wo die Tabelle ist oder das Tabellenfeld etc...
Mein fiktiver Code war nur ein Beispiel, um mich lediglich verständlich zu machen :-D
You can use the DLookup function to display the value of a field that isn't in the record source for your form or report. For example, suppose you have a form based on an Order Details table. The form displays the OrderID, ProductID, UnitPrice, Quantity, and Discount fields. However, the ProductName field is in another table, the Products table. You could use the DLookup function in a calculated control to display the ProductName on the same form.
The DLookup function returns a single field value based on the information specified in criteria. Although criteria is an optional argument, if you don't supply a value for criteria, the DLookup function returns a random value in the domain.
If no record satisfies criteria or if domain contains no records, the DLookup function returns a Null.
If more than one field meets criteria, the DLookup function returns the first occurrence. You should specify criteria that will ensure that the field value returned by the DLookup function is unique. You may want to use a primary key value for your criteria, such as [EmployeeID] in the following example, to ensure that the DLookup function returns a unique value:
Dim varX As Variant
varX = DLookup("[LastName]", "Employees", "[EmployeeID] = 1")
Whether you use the DLookup function in a macro or module, a query expression, or a calculated control, you must construct the criteria argument carefully to ensure that it will be evaluated correctly.
You can use the DLookup function to specify criteria in the Criteria row of a query, within a calculated field expression in a query, or in the Update To row in an update query.
You can also use the DLookup function in an expression in a calculated control on a form or report if the field that you need to display isn't in the record source on which your form or report is based. For example, suppose you have an Order Details form based on an Order Details table with a text box called ProductID that displays the ProductID field. To look up ProductName from a Products table based on the value in the text box, you could create another text box and set its ControlSource property to the following expression:
=DLookup("[ProductName]", "Products", "[ProductID] =" _
& Forms![Order Details]!ProductID)
Und mir ist noch was aufgefallen:
lngFrage = Me!FragenID
strAntwort = Me.txtAntwort
Was macht das Ausrufezeichen nach "me!" aus?
Ich hoffe, ich nerve dich nicht :-)))
Grüße
Hallo Achim,
ZitatWas macht das Ausrufezeichen nach "me!" aus?
Schaust Du hier:
http://www.donkarl.com?FAQ6.3 (http://www.donkarl.com?FAQ6.3)
hth
gruss ekkehard