PDA

Vollständige Version anzeigen : Schleife, die Datensätze ausliest


Obrac
22.03.2004, 15:44
Moin..

Mal wieder eine banale Frage. Aus der VB-Hilfe werde ich nicht schlau. Ich brauche eine Schleife, die Datensätze einer Tabelle ausliest und deren Feldinhalte in Variablen schreibt. Mit Schleifen und Variablen bin ich vertraut genug, aber wie komme ich an die Datensätze ran?

Obrac

Tott666
22.03.2004, 15:48
Du mußt mit einem Recourdset arbeiten

sql = "Select * From tbl_Test"

rs.open sql, currentproject.connection

do until rs.eof
x = rs!Feld1
rs.movenext
loop

rs.close

Nouba
22.03.2004, 16:05
Was soll denn die Schleife alles leisten? Hier wäre was ganz allgemeines
Sub Schleife()

'// ein Verweis auf die DAO-Biblithek muß im VBA-Editor unter Extras/Verweise gesetzt sein
Dim rs As DAO.Recordset
Dim i As Integer
Dim sFeldwerte As String

'// Recordset öffnen
Set rs = CurrentDb().OpenRecordset("TabOderAbfrName", dbOpenDynaset)

'// Zuerst die Spaltennamen ausgeben - weil wir mit 0 anfangen, wird die Anzahl um 1 gekürzt.
For i = 0 To rs.Fields.Count(i) - 1
sFeldwerte = sFeldwerte & rs.Fields(i).Name & vbTab
Next i

If Len(sFeldwerte) > 0 Then
sFeldwerte = Left$(sFeldwerte, Len(sFeldwerte) - Len(vbTab))
End If

'// Ausgabe der Spaltennamen im Direktfenster
Debug.Print sFeldwerte

'// hier geben wie alle Datensätze im Direktfenster aus - nimm eine nicht zu lange Tabelle zum Testen

'// solange wir nicht am Ende sind
Do While Not rs.EOF
'// Variable zurücksetzen
sFeldwerte = ""

'// alle Werte eines Datensatzes mit Tabulatorzeichen trennen
For i = 0 To rs.Fields.Count - 1
sFeldWerte = sFeldWerte & Nz(rs(i)) & vbTab
Next i

'// letztes Tabulatorzeichen abschneiden
If Len(sFeldwerte) > 0 Then
sFeldwerte = Left$(sFeldwerte, Len(sFeldwerte) - Len(vbTab))
End If
'// Datensatz im Direktfenster ausgeben
Debug.Print sFeldwerte

'// jetzt gehts zum nächsten Datzensatz
rs.MoveNext
Loop

'// Recordset ordnungsgemäß schließen
If Not rs Is Nothing Then rs.Close
'// Speicher freigeben
Set rs = Nothing

End Sub

Obrac
22.03.2004, 16:32
Sie soll nur Feldeingaben eines Formulars mit Tabelleninhalten vergleichen. Nichts wildes. Mit euren Antworten komme ich sicherlich weiter. Danke an euch.

Tott666
22.03.2004, 19:04
Dann solltest du den SQL-String aber direkt mit einer Where Bedingung nehmen, sonnst kann deine Schleife etw. ewig dauern.

Wenn du nur wissen willst ob ein wert vorhanden ist solltest du mit dem Befehl dlookup arbeiten.

x = dlookup("Feld1","Tabelle1","Feld2 = ' " & me.txtFeld2 & " ' "

Dies ist die schnellere Version um nur einen Wert zu prüfen. Wenn du dann noch ein nz( Dlookup ... ) verwendest, hast du auch keine Probleme, wenn der Wert nicht in der Tabelle steht, da nz NULL in 0 oder leeren String verwandelt.

Obrac
22.03.2004, 19:49
Die Tabelle hat nur maximal 10 Zeilen, also sollte ich keine Performance Probleme kriegen. Jetzt habe ich ein Skript, bei dem ich eine mir unerklärliche Fehlermeldung kriege.

Private Sub cmd_anmelden_Click()
Dim rs As DAO.Recordset
Dim strusername As String
Dim strpasswort As String

Set rs = CurrentDb().OpenRecordset("tbl_user", dbOpenDynaset)

sql = "Select * From tbl_user"

rs.Open sql, CurrentProject.Connection

Do Until rs.EOF
strusername = rs!Benutzername
strpasswort = rs!Passwort
If strusername = Me.str_Benutzername And strpasswort = Me.str_Passwort Then
stDocName = "frm_startmenu"
DoCmd.OpenForm stDocName, , , stLinkCriteria
DoCmd.Close acForm, "frm_anmeldung"
GoTo SchleifeEnde
End If

rs.MoveNext
Loop
MsgBox "Benutzername oder Passwort falsch."
SchleifeEnde:

rs.Close
End Sub

Wenn ich das Skript ausführe, kriege ich die Meldung: "Fehler beim Kompilieren. Bentzerdefinierter Typ nicht definiert"
Markiert ist dabei diese Zeile: Dim rs As DAO.Recordset

Muss ich in der Object Library noch irgendwas einbinden?

flo_2003
22.03.2004, 19:58
Du musst die Klasse 'Microsoft DAO ...' im VB-Editor unter
Extras -> Verweise auswählen

Engeli
22.03.2004, 20:04
Hallo

Flo_2003 hat recht. Müsste dann funzen. Wenn nicht.

Mach mal ohne Klammern

Set rs = CurrentDb .OpenRecordset("tbl_user", dbOpenDynaset)

Gruss Markus

Obrac
22.03.2004, 20:29
Jetzt sagt er mir "Methode oder Objekt nicht gefunden" und markiert bei dieser Zeile:

rs.Open sql, CurrentProject.Connection

das "Open"..

Noch was einbinden?

Tott666
22.03.2004, 22:13
Arbeite direkt mit ADO, ist standard bei 2000

Dim rs As New ADODB.Recordset

rs.Open "tbl_user",CurrentProject.Connection,adOpenDynamic

do until rs.eof

rs.movenext
loop
rs.close


die Sache mit Goto solltest du möglichst nie machen, außer um Fehler abzufangen mit

on error goto prog_err

exit sub
prog_err:
msgbox error

Obrac
24.03.2004, 19:28
Hat geklappt jetzt. Alleine hätte ich das nie geschafft. Danke an euch..