PDA

Vollständige Version anzeigen : docmd.findrecord aber mit vb6?


Phillip-Berlin
07.06.2001, 19:34
hallo forum ...
wie kann ich denn folgendes mit vb6 realisieren?
strZufallszahl = 2
DoCmd.FindRecord strZufallszahl, acStart, False, acDown, False, acCurrent, True
es soll halt zu dem datensatz gesprungen werden
wo Zufallszahl = 2 zutrifft
evtl. andre lösung?

Stefan Kulpa
08.06.2001, 06:03
<font face="Verdana" size="2">Hallo,

Du kannst den Access-Befehl DoCmd nicht 1:1 in VB abbilden.
Zunächst musst Du Dich für eine Zugriffstechnologie entscheiden; Bsp.: DAO oder ADO.

Dann kannst Du ein dynamisches RecordSet erstellen, in dem Du u.a. mit dem Befehl FindFirst suchen kannst.

Wenn Du Dich in Deiner Frage auf die Tabelle [tblFrageAntwortDatensatz] Deiner Datenbank beziehst, dann suchst Du sicherlich nach dem Feld [FrageAntwortDatensatzId]. In diesem Fall ginge es (mittels DAO) wie folgt:</font>

[code]<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Sub</FONT> Command1_Click()

<FONT COLOR=#008000>'** Beispiel aus Deiner Datenbank</FONT>
<FONT COLOR=#000080>Dim</FONT> Zufallszahl
Randomize
Zufallszahl = Int((9 - 5 + 1) * Rnd + 5)

<FONT COLOR=#008000>'** Datenzugriff über DAO 3.6 (Referenz setzen!)</FONT>
<FONT COLOR=#000080>Dim</FONT> objWks <FONT COLOR=#000080>As</FONT> DAO.Workspace
<FONT COLOR=#000080>Dim</FONT> objDbs <FONT COLOR=#000080>As</FONT> DAO.Database
<FONT COLOR=#000080>Dim</FONT> objRst <FONT COLOR=#000080>As</FONT> DAO.Recordset
<FONT COLOR=#000080>Dim</FONT> sSql <FONT COLOR=#000080>As String</FONT>

<FONT COLOR=#000080>Set</FONT> objWks = DBEngine.Workspaces(0)
<FONT COLOR=#000080>Set</FONT> objDbs = objWks.OpenDatabase("D:\Develop\VBA\YDNJ\frageantwort2000.mdb", <FONT COLOR=#000080>True</FONT>)
<FONT COLOR=#000080>Set</FONT> objRst = objDbs.OpenRecordset("tblFrageAntwortDatensatz", dbOpenDynaset)

sSql = "FrageAntwortDatensatzId=" & Zufallszahl
<FONT COLOR=#000080>With</FONT> objRst
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .BOF <FONT COLOR=#000080>And</FONT> <FONT COLOR=#000080>Not</FONT> .EOF <FONT COLOR=#000080>Then</FONT>
.FindFirst sSql
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .NoMatch <FONT COLOR=#000080>Then</FONT>
<FONT COLOR=#000080>Debug.Print</FONT> !Frage; !Antwort1; !Antwort2; !Antwort3 <FONT COLOR=#008000>'etc.</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>

</FONT></PRE>[/code]

<font face="Verdana" size="2">HTH</font>

Phillip-Berlin
08.06.2001, 12:56
hm ...
klappt leider so nicht ...
er gibt mir immer debug.print .... aus
???
also springt nicht zu sSql
evtl. noch ein tip?

Stefan Kulpa
08.06.2001, 13:41
<font face="Verdana" size="2">Hallo,

Debug.Print ist ein Befehl zur Ausgabe im "Direktfenster" -
was meinst Du mit "...er gibt mir immer debug.print .... aus" ?

Dieser Ausgabebefehl hat lediglich exemplarischen Charakter und dient der Anzeige der aktuellen Feldinhalte [Frage], [Antwort1], [Antwort2] und [Antwort3] ... was auch immer Du damit vor hast.

Gruß</font>

Phillip-Berlin
08.06.2001, 13:58
ja das war missvertsänldich gefragt ..
ich meine er springt nicht zum nächsten datensatz ...
bzw. zu dem der ja per zufallszahl ermittelt
wurde ...
hier das beispiel www.serve-u.de/access/files/vbtest.zip (http://www.serve-u.de/access/files/vbtest.zip)
gruß und dank

Phillip-Berlin
08.06.2001, 18:50
ok -- jetzt hab ichs geschnallt ..
dein vorschlag zunzt ... das sehe ich ja
im testfenster mit debug.print, mein problem
ist, dass der inhalt der textfelder nicht
aktualisiert werden .. d.h. es wird immer die
gleiche frage angezeigt ...
wie also aktuallisiere ich nun die datengrundlage der txt felder?

Stefan Kulpa
09.06.2001, 06:35
<font face="Verdana" size="2">Hallo,

dann versuchs mal so:</font>

<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Sub</FONT> Testlauf()

<FONT COLOR=#008000>'** Datenzugriff über DAO 3.6 (Referenz setzen!)</FONT>
<FONT COLOR=#000080>Dim</FONT> objWks <FONT COLOR=#000080>As</FONT> DAO.Workspace
<FONT COLOR=#000080>Dim</FONT> objDbs <FONT COLOR=#000080>As</FONT> DAO.Database
<FONT COLOR=#000080>Dim</FONT> objRst <FONT COLOR=#000080>As</FONT> DAO.Recordset
<FONT COLOR=#000080>Dim</FONT> objHlp <FONT COLOR=#000080>As</FONT> DAO.Recordset
<FONT COLOR=#000080>Dim</FONT> sSql <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> sDbPath <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> objDict <FONT COLOR=#000080>As</FONT> Object
<FONT COLOR=#000080>Dim</FONT> lCounter <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Dim</FONT> lRecCount <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Dim</FONT> lMin <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Dim</FONT> lMax <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>

<FONT COLOR=#008000>'** Datenbank öffnen</FONT>
sDbPath = App.Path & "\frageantwort2000.mdb"
<FONT COLOR=#000080>Set</FONT> objWks = DBEngine.Workspaces(0)
<FONT COLOR=#000080>Set</FONT> objDbs = objWks.OpenDatabase(sDbPath, <FONT COLOR=#000080>True</FONT>)
<FONT COLOR=#000080>Set</FONT> objRst = objDbs.OpenRecordset("tblFrageAntwortDatensatz", dbOpenDynaset)

<FONT COLOR=#008000>'** Um Wiederholungen für die Zufallszahlen zu vermeiden,</FONT>
<FONT COLOR=#008000>'** ein Dictionary-Objekt verwenden</FONT>
<FONT COLOR=#000080>Set</FONT> objDict = CreateObject("Scripting.Dictionary")

<FONT COLOR=#008000>'** Der Wert von [FrageAntwortDatensatzId] ist nicht = Anzahl Einträge,</FONT>
<FONT COLOR=#008000>'** daher den kleinsten und größten Wert ermitteln</FONT>
sSql = "SELECT MIN(FrageAntwortDatensatzId) As MinWert, " & _
"MAX(FrageAntwortDatensatzId) As MaxWert FROM " & _
"tblFrageAntwortDatensatz"
<FONT COLOR=#000080>Set</FONT> objHlp = objDbs.OpenRecordset(sSql, dbOpenDynaset)
<FONT COLOR=#000080>With</FONT> objHlp
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .BOF <FONT COLOR=#000080>And</FONT> <FONT COLOR=#000080>Not</FONT> .EOF <FONT COLOR=#000080>Then</FONT>
lMin = !MinWert
lMax = !MaxWert
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
.<FONT COLOR=#000080>Close</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>

<FONT COLOR=#008000>'** Prüfen, ob Fragen vorhanden sind</FONT>
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> lMax > lMin <FONT COLOR=#000080>Then</FONT>
MsgBox "Keine Fragen vorhanden!": <FONT COLOR=#000080>Exit Sub</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>

<FONT COLOR=#008000>'** Dort nun alle eindeutigen Keys und die Fragen speichern</FONT>
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> objRst.BOF <FONT COLOR=#000080>And</FONT> <FONT COLOR=#000080>Not</FONT> objRst.EOF <FONT COLOR=#000080>Then</FONT>
<FONT COLOR=#000080>Do</FONT> <FONT COLOR=#000080>Until</FONT> objRst.EOF
<FONT COLOR=#008000>'** Als Schlüssel den Key und als Eintrag die Fragen eintragen</FONT>
objDict.Add <FONT COLOR=#000080>CStr</FONT>(objRst!FrageAntwortDatensatzId), objRst!Frage
objRst.MoveNext
<FONT COLOR=#000080>Loop</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>

<FONT COLOR=#008000>'** Anzahl Einträge ermitteln</FONT>
lRecCount = objDict.Count

<FONT COLOR=#008000>'** In einer Schleife solange Zufallszahlen ermitteln, bis kein</FONT>
<FONT COLOR=#008000>'** Eintrag mehr im Dictionary vorhanden ist</FONT>
<FONT COLOR=#000080>Do</FONT>
<FONT COLOR=#008000>'** Zufallsgenerator initialisieren</FONT>
Randomize
<FONT COLOR=#008000>'** Zufallszahl entsprechend den Min/Max-Werten ermitteln</FONT>
lCounter = Int((lMax * Rnd) + lMin)
<FONT COLOR=#000080>Debug.Print</FONT> "Aktuelle Zufallszahl: "; lCounter
<FONT COLOR=#008000>'** Gibt es diese Zahl noch im Dictionary, wurde die Frage</FONT>
<FONT COLOR=#008000>'** noch nicht gestellt.</FONT>
<FONT COLOR=#000080>If</FONT> objDict.Exists(<FONT COLOR=#000080>CStr</FONT>(lCounter)) <FONT COLOR=#000080>Then</FONT>
<FONT COLOR=#008000>'** Frage stellen ...</FONT>
<FONT COLOR=#008000>'...</FONT>
sSql = "FrageAntwortDatensatzId=" & lCounter
<FONT COLOR=#000080>With</FONT> objRst
.FindFirst sSql
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .NoMatch <FONT COLOR=#000080>Then</FONT>
<FONT COLOR=#000080>Debug.Print</FONT> "Frage Nr.: "; !FrageAntwortDatensatzId
<FONT COLOR=#000080>Debug.Print</FONT> "Frage: "; !Frage <FONT COLOR=#008000>'etc. ...</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>
<FONT COLOR=#008000>'...</FONT>
<FONT COLOR=#008000>'** Nummer aus dem Dictionary entfernen, um nicht mehr benutzt</FONT>
<FONT COLOR=#008000>'** zu werden</FONT>
objDict.Remove (<FONT COLOR=#000080>CStr</FONT>(lCounter))
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>If</FONT>
<FONT COLOR=#000080>Loop</FONT> <FONT COLOR=#000080>Until</FONT> objDict.Count = 0

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>

</FONT></PRE>

<font face="Verdana" size="2">In einem "Spiel" müssten man die Geschichte entsprechend aufteilen, damit jede neue Frage entsprechend angezeigt und beantwortet werden kann.

Gruß</font>

Phillip-Berlin
09.06.2001, 12:22
öhm ... *sichnichtverstädnlichmachenkann*
also erstmal VIELEN dank für deine große mühe und geduld ...
anscheinend ist mir vb doch noch sehr fremd so, dass ich mein eigentliches problem nicht so recht deutlich machen kann ... also als beispiel
ich habe mir eine datenbasis für mein formular ausgewählt ...
ich kann auch per data object per klick meine datensätze durchgehen ... es werden also in meinen textfeldern zu jeder frage die passenden antworten angezeigt ..
soweit so schön .. das funzt allerdings wie gesagt nur per mausklick auf diese data object ... (ähnlich access datesatznavigation)
wie kann ich nun per code einfach einen datensatz weiter (so wie per klick auf pfeil nach rechts) bzw. wie kann ich nun per code zu einem bestimmten datensatz? z.b. nr 7 bzw. zufallszahl?
das problem das fragen doppelt gestellt werden habe ich bereits gelöst .. auch per loop und mir vergleich zufallszahl=strF1 ? strF1 = FrageId der aktuell gestellten frage strF2 demendsprechen FrageId der 2 ten frage
aber wie zum teufel komme ich per code zur 2ten frage?
HIIIILFE *gg*
ist evtl. eine letzte anwort zu diesem thema zu erhoffen?

Stefan Kulpa
09.06.2001, 16:52
<font face="Verdana" size="2">Hallo,

auch einem Data-Steuerelement liegt ein Recordset zugrunde, dementsprechend geht's wie folgt:</font>

<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#008000>'** Datensatz suchen</FONT>
Data1.Recordset.FindFirst "FrageAntwortDatensatzId=" & Zufallszahl
<FONT COLOR=#008000>'** Zum nächsten Datensatz gehen</FONT>
<FONT COLOR=#000080>With</FONT> Data1.Recordset
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .EOF <FONT COLOR=#000080>Then</FONT> .MoveNext
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>
<FONT COLOR=#008000>'** Zum vorherigen Datensatz gehen</FONT>
<FONT COLOR=#000080>With</FONT> Data1.Recordset
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .BOF <FONT COLOR=#000080>Then</FONT> .MovePrevious
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>
<FONT COLOR=#008000>'** Zum ersten Datensatz gehen</FONT>
<FONT COLOR=#000080>With</FONT> Data1.Recordset
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .BOF <FONT COLOR=#000080>Then</FONT> .MoveFirst
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>
<FONT COLOR=#008000>'** Zum letzten Datensatz gehen</FONT>
<FONT COLOR=#000080>With</FONT> Data1.Recordset
<FONT COLOR=#000080>If</FONT> <FONT COLOR=#000080>Not</FONT> .EOF <FONT COLOR=#000080>Then</FONT> .MoveLast
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>

</FONT></PRE>

<font face="Verdana" size="2">HTH</font>

Phillip-Berlin
09.06.2001, 17:07
JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
genau das wars!!!!!!!!!!!!!!!!!
HURAAAAAAAAAAAAAAA *hüpfhüpf*
soooooooooo schöööön .. hach ist das toll
wenns endlich klappt ... *freujübel*
DANKE DANKE DANKE DANKE DANKE
huraaaa ...
ich könnte mich auf dem boden kullern
*audembodnekuller*
nagut .. das reicht
gruß
phillip *derwoüberglücklichseintutundbestimmtnochweiterefragenstllenwerdentunwird*