If-Abfrage

itsection

Mitglied
Hallöchen Leute,

ich habe da ein kleineres Problem mit einer If-Anweisung.

Meine Anweisung sieht wie folgt aus:

If Rs.Fields("Gesamtbetrag") = "" Then
Textfeld1.Text = "Keine Eintragungen vorhanden"
Else
Textfeld1.Text = CStr(Rs.Fields("Gesamtbetrag")) & " Euro"
Textfeld2.Text = EingabeDatum
Textfeld3.Text = EingabeArbeistort
End If

Wobei Rs mein ADODB Recordset ist.
Gesamtbetrag ist ein, mit Hilfe von SQL, erzeugtes Feld (Also ein Abfrage Ergebnis).
Nun will ich dass es mir falls Gesamtbetrag leer ist, also keine Datebbankeinträge vorhanden sind, die Meldung "Keine Eintragungen vorhanden" bringt.
Doch immer wenn das der Fall ist, also das keine Eintragungen vorhanden sind, bringt er mir die Fehlermeldung "EOF oder BOF ist True oder der Datensatz wurde gelöscht" oder so ähnlich zumindest.
Danach stürzt mein Programm ab. Ich will aber dass er dann gar nicht erst weiterarbeitet, sondern die Meldung "Keine Eintragungen vorhanden" ausliefert.

Was habe ich denn da falsch gemacht?

Im voraus schonmal Dankeschön

Grüssle
itsection
 
Das liegt daran, dass wahrscheinlich keine Datensätze in dem Recordset sind, oder zumindest keiner markiert ist. Sowas solltest Du abfangen:
Code:
If Rs.RecordCount > 0 Then
    Rs.First
    If IsNull(Rs.Fields("Gesamtbetrag")) Or CStr(Rs.Fields("Gesamtbetrag")) = "" Then
        MsgBox "Keine Eintragungen gefunden."
    Else
        '...
    End If
Else
    MsgBox "Keine Datensätze gefunden."
End If
Hoffe, das hilft Dir weiter. :)
 
Hi Lirion,

ersteinmal Danke für die schnelle Antwort.

Ich habe dazu ein paar Fragen.
Was sagt denn eigentlich Rs.RecordCount > 0. Also für was steht das RecordCount?
Und dann noch die Frage was das Rs.First ist?
Wenn ich es in Basic einfüge, bzw. von Hand eingebe, kommt normalerweise immer die Autovervollständigung, doch dieses Rs. First wird nicht gefunden, es kommt also immer zum Programmabsturz.
Kann ich das Rs.First auch weglassen?

Grüssle
itsection
 
RecordCount gibt Dir die Anzahl der Datensätze im Recordset zurück (record = Datensatz, count = Anzahl, eigentlich logisch ;)). Und nur wenn diese Anzahl grösser als 0 ist, kannst Du mit dem Recordset was anfangen.
Mit First springst Du auf den ersten Datensatz. Das sollte man eigentlich immer machen, damit man weiss, wo man gerade ist. :)

Ich geh auch einfach mal ganz dreist davon aus, dass Du ADODB-Recordsets benutzt, die haben ganz sicher eine First-Methode.
 
Hi,

oki das mit dem RecordCount klingt logisch :)

doch das mit dem Rs.First stimmt bei mir nicht.

Mein Recordset ist ADODB, doch es kommt immer folgende Fehlermeldung beim kompilieren:
"Methode oder Mitgliedsdaten nicht gefunden"

edit: so, ich glaube ich habe jetzt das Problem mit dem Rs.First gefunden. Ich habe es jetzt mit Rs.MoveFirst gemacht. Das hat doch das gleich Ergebnis, oder?


Grüssle itsection
 
Zuletzt bearbeitet:
Ich habe es jetzt mit Rs.MoveFirst gemacht. Das hat doch das gleich Ergebnis, oder?
Öh, ja... Sorry, das meinte ich auch eigentlich. Bei Delphi heissen die Methoden nur First, Next, Last, usw. - bei VB MoveFirst, MoveNext, MoveLast, ...
Das bring ich immer durcheinander. :rolleyes:
 
Code:
If Rs.RecordCount > 0 Then
    Rs.MoveFirst
    If IsNull(Rs.Fields("Gesamtbetrag")) Or CStr(Rs.Fields("Gesamtbetrag")) = "" Then
        MsgBox "Keine Eintragungen gefunden."
    Else
        'Gesamtbetrag ausgeben
    End If
Else
    MsgBox "Keine Datensätze gefunden."
End If

Jetzt habe ich nur das Problem, dass er mir immer in das ELSE springt, also ich meine das letzte ELSE mit "MsgBox "Keine Datensätze gefunden.""
Obwohl Datensätze vorhanden sind. Woran könnte denn das jetzt noch liegen?
Eigentlich heisst das ja, dass Rs bei mir kleiner oder gleich 0 ist. Aber das kann doch gar nicht sein, da ja Daten drinnen stehen.

Kannst Du mir da bitte nochmal helfen?

Grüssle itsection
 
Wenn der RecordCount 0 ist, liefert die Abfrage keine Daten zurück. Zeig mal die Abfrage und lass die gleich mal im Datenbanksystem laufen. Da siehst Du ja, was wirklich zurückkommt.
Kann aber auch sein, dass der RecordCount -1 ist, das passiert manchmal, wenn beim Öffnen des Recordsets irgendwas schiefgeht.
 
Ok, Sorry das ich Deine Zeit beansprucht habe, es funktioniert jetzt.

Ich hatte eine fehlerhafte SQL-Abfrage drinnen. Das ist echt ärgerlich, man sucht stundenlang nach dem Programmierfehler und dann ist es in der Abfrage... :mad:

Naja, wenigstens geht es jetzt :)

Ich danke Dir vielmals

nochmal ne andere Frage, kennst Du Dich zufällig mit MSChart aus?

Grüssle itsection

Achja, das habe ich soeben noch im Buch "Markt&Technik-Jetzt lerne ich Datenbankprogrammieren mit VisualBasic6.0" gefunden:
Vielleicht hilft es ja noch jemanden.
Die Open-Methode des Recordset-Objekts führt den eigentlichen Datenbankzugriff
aus, indem sie z.B. den Inhalt einer kompletten Tabelle oder das
Ergebnis einer SQL-Abfrage in Gestalt einer Gruppe von Datensätzen in
den Arbeitsspeicher einliest. Was für Anfänger reichlich verwirrend sein
kann, ist der Umstand, daß es verschiedene Typen von Datensatzgruppen
gibt. So gibt es Datensatzgruppen, die nicht geändert werden können. Bei
anderen Datensatzgruppen liefert die RecordCount-Eigenschaft, die eigentlich
die Anzahl der Datensätze zurückgeben sollte, lediglich den Wert –1.
Die Tabelle 5.4 enthält eine Übersicht über die unterschiedlichen Datensatzgruppen.
Welchen Typ die Open-Methode öffnet, wird über die Eigenschaft
CursorType bestimmt (mehr zur Definition eines Cursors in Kapitel
8). Wird beim Öffnen eines Recordset-Objekts weder diese Eigenschaft
noch die LockType-Eigenschaft gesetzt, was bei den Beispielen der letzten
Abschnitte der Fall war, erhält man eine Datensatzgruppe vom Typ ForwardOnly,
in der nur Vorwärtsbewegungen des Datensatzzeigers erlaubt
sind, und die darüber hinaus vom Typ ReadOnly ist, d.h. keine Änderungen
zuläßt.
Machen Sie sich über die verschiedenen Einstellungen im Moment noch
keine Gedanken. Die tiefere Bedeutung des Cursortyps ist ein sehr vielschichtiges
Thema, das beim Zugriff auf die Jet-Engine aber keine allzu
große Rolle spielt. Merken Sie sich lediglich, daß bei einem »normalen« Zugriff
auf eine Datensatzgruppe ein Recordset-Objekt meistens wie folgt geöffnet
wird:
With Rs
.ActiveConnection = Cn
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.Source = "Authors"
.Open
End With
Das Recordset-Objekt
Sie erhalten damit ein Recordset-Objekt, dessen Datensätze Sie verändern
können (darauf kommt es meistens an) und dessen RecordCount-Eigenschaft
die Anzahl der Datensätze zurückgibt.
 

Neue Beiträge

Zurück