Access-o-Mania

Access-Forum (Deutsch/German) => Access-Hilfe => Thema gestartet von: no-name-achim am Dezember 25, 2011, 02:33:14

Titel: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 25, 2011, 02:33:14
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
Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 25, 2011, 10:37:07
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




Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 26, 2011, 22:02:49
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  :-[
Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 26, 2011, 23:24:35
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
Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 27, 2011, 22:27:42
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 :-)
Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 27, 2011, 22:31:17
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]
Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 27, 2011, 22:52:38
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
Titel: Re: Vokabeltrainer
Beitrag von: Beaker s.a. am Dezember 27, 2011, 23:01:47
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
Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 27, 2011, 23:13:18
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]
Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 27, 2011, 23:23:58
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 :-))
:-[
Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 28, 2011, 09:41:20
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 :-))
Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 28, 2011, 10:11:03
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
Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 29, 2011, 20:35:17
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
Titel: Re: Vokabeltrainer
Beitrag von: Beaker s.a. am Dezember 29, 2011, 21:29:09
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
Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 29, 2011, 21:46:54
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'
Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 29, 2011, 22:13:41
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

Titel: Re: Vokabeltrainer
Beitrag von: database am Dezember 29, 2011, 23:24:59
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?

Titel: Re: Vokabeltrainer
Beitrag von: no-name-achim am Dezember 29, 2011, 23:42:51
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
Titel: Re: Vokabeltrainer
Beitrag von: Beaker s.a. am Dezember 30, 2011, 00:39:12
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