Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Vokabeltrainer

Begonnen von no-name-achim, Dezember 25, 2011, 02:33:14

⏪ vorheriges - nächstes ⏩

no-name-achim

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

database

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





no-name-achim

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  :-[

database

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

no-name-achim

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 :-)

database

#5
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]

no-name-achim

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

database

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]

no-name-achim

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 :-))
:-[

no-name-achim

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 :-))

database

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

no-name-achim

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

database

#14
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'