Discussion:
Feststellen, ob Datensätze vorhanden
(zu alt für eine Antwort)
Brian Schmalisch
2005-05-03 10:06:09 UTC
Permalink
Hallo,

ich gebe aus einem Formular nach drücken einer Schaltfläche den Schlüssel
zurück. Solange in dem aufgerufenen Formular Datensätze angezeigt werden,
funktioniert das ganze. Wenn ich jedoch das Formular ohne Datensätze aufrufe
und versehentlich auf die OK-Schaltfläche drücke, kommt es zum Fehler, da
kein Datensatz und somit kein Schlüssel da sind.

Wie kann ich vorab schon prüfen, ob das aufgerufene Formular DS enthält?

mfg

Brian
Mark Doerbandt
2005-05-03 10:11:29 UTC
Permalink
Hallo, Brian,
Post by Brian Schmalisch
Wenn ich jedoch das Formular ohne Datensätze aufrufe
und versehentlich auf die OK-Schaltfläche drücke, kommt es zum Fehler, da
kein Datensatz und somit kein Schlüssel da sind.
Schau Dir mal in der Online-Hilfe das Stichwort "IsNull" und "Nz" an.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Mark Doerbandt
2005-05-03 10:16:46 UTC
Permalink
Hallo,
Post by Mark Doerbandt
Schau Dir mal in der Online-Hilfe das Stichwort "IsNull" und "Nz" an.
Ach ja, RecordsetClone und RecordCount koennten auch helfen.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Brian Schmalisch
2005-05-03 10:20:23 UTC
Permalink
Ich habe es so gemacht in der Schaltflächen-aktion:
If Nz(Me!ApoID) Then ' auch bei IsNull
MsgBox "Wählen Sie zuerst einen Datensatz aus"
Else
ReturnValue = Me!ApoID '<-------Fehler
DoCmd.Close acForm, Me.Name, acSaveNo
End If

Trotzdem geht er in den else-Zweig und bringt einen Fehler.

Brian
Brian Schmalisch
2005-05-03 10:29:10 UTC
Permalink
Auch so funktioniert es nicht. Wo liegt mein Denkfehler?

If IsNull(Me!ApoID) And Me!Recordset.RecordCount > 0 Then

Brian
Mark Doerbandt
2005-05-03 10:37:21 UTC
Permalink
Hallo, Brian,
Post by Brian Schmalisch
If IsNull(Me!ApoID) And Me!Recordset.RecordCount > 0 Then
If Me.RecordsetClone.RecordCount > 0 Then
MsgBox "Daten"
Else
MsgBox "keine Daten"
End If

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Doerthe Weber
2005-05-03 10:40:41 UTC
Permalink
Hallo Brian,
Post by Brian Schmalisch
Auch so funktioniert es nicht. Wo liegt mein Denkfehler?
If IsNull(Me!ApoID) And Me!Recordset.RecordCount > 0 Then
Die Auswertung der Bedingung IsNull(Me!ApoID) ist nicht möglich, wenn
das Formular keinen Datensatz enthält (und auch keinen neuen Datensatz
zuläßt).
Wenn Du dagegen nur

If Me!Recordset.RecordCount > 0 Then ...

benutzt, sollte es funktionieren.

Gruß
Doerthe
Michael Zimmermann
2005-05-03 10:43:09 UTC
Permalink
Hallo!
Post by Brian Schmalisch
Auch so funktioniert es nicht. Wo liegt mein Denkfehler?
If IsNull(Me!ApoID) And Me!Recordset.RecordCount > 0
Then
If Me.Recordset.RecordCount = 0 _
Then
MsgBox "Keine DS vorhanden"
Else
ReturnValue = Me.Controls("ApoID").Value
DoCmd.Close acForm, Me.Name, acSaveNo
End If


Deine Denkfehler:

IsNull(Me!ApoID) wird, da ApoId Schlüssel ist, nur
zutreffen, wenn das RS leer ist. Dann ist aber RecordCount
= 0 und nicht > 0. Deine Bedingung tritt also nie ein.


If Nz(Me!ApoID) Then ...

macht aus ApoId = NULL (keine DS in Deinem Bsp.) die Zahl
0, also False. Daher wird richtigerweise in diesem Fall zum
Else verzweigt.

Gruß aus Mainz
Michael
Brian Schmalisch
2005-05-03 11:52:23 UTC
Permalink
Danke. Jetzt funktionierts.

Brian
Olaf Rabbachin
2005-05-05 12:25:33 UTC
Permalink
Hi,
[...]
If Me.Recordset.RecordCount = 0 Then
[...]
sach man, ist sich das eigentlich korrekter Ansatz? Ist .RecordCount auch
ohne ein .MoveLast in Formularen immer korrekt belegt? Ich habe so noch nie
geprüft, hätte aber dann wohl eher ein ...
if not me.recordset.bof and not me.recordset.eof then
... verwendet ..?

Bis dann,
Olaf [MVP]
--
Bitte keine emails auf NG-postings.

My .02: www.Resources.IntuiDev.com
Klaus Oberdalhoff [MVP]
2005-05-05 12:50:42 UTC
Permalink
Hi,
Post by Olaf Rabbachin
sach man, ist sich das eigentlich korrekter Ansatz? Ist .RecordCount
auch ohne ein .MoveLast in Formularen immer korrekt belegt? Ich habe
so noch nie geprüft, hätte aber dann wohl eher ein ...
if not me.recordset.bof and not me.recordset.eof then
... verwendet ..?
also nach dem was ich weiss, ist

OHNE ein vorheriges .MoveLast .MoveFirst
Recordcount = 0 -- Keine Daten
RecordCount > 0 -- Korrekte Anzahl
RecordCount = -1 -- Daten vorhanden, Anzahl unbekannt

MIT einem vorheriges .MoveLast .MoveFirst
Recordcount = 0 -- Keine Daten
RecordCount > 0 -- Korrekte Anzahl

so habe ich das bisher immer verstanden und verwendet.

Recordcount = 0 ist äquivalent mit
.eof = True AND .bof = True

Ist für mich auch irgendwie logisch, da ich das so verstanden habe, dass
intern gewisse "Mindest-Buffer" gefüllt werden, aber wenn mehr Datensätze
vorhanden, als Buffer, dann -1 als Anzahl ...

Also ich habe diese Sachen bisher immer analog der obigen Beschreibung
gemischt verwendet und hatte bisher noch keine Probleme damit.
--
mfg

Klaus Oberdalhoff(Access MVP) ***@gmx.de

Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99
Karl Donaubauer
2005-05-05 13:13:56 UTC
Permalink
Hallo, Klaus!
Post by Klaus Oberdalhoff [MVP]
Post by Olaf Rabbachin
sach man, ist sich das eigentlich korrekter Ansatz? Ist .RecordCount
auch ohne ein .MoveLast in Formularen immer korrekt belegt? Ich habe
so noch nie geprüft, hätte aber dann wohl eher ein ...
if not me.recordset.bof and not me.recordset.eof then
... verwendet ..?
also nach dem was ich weiss, ist
OHNE ein vorheriges .MoveLast .MoveFirst
Recordcount = 0 -- Keine Daten
RecordCount > 0 -- Korrekte Anzahl
RecordCount = -1 -- Daten vorhanden, Anzahl unbekannt
MIT einem vorheriges .MoveLast .MoveFirst
Recordcount = 0 -- Keine Daten
RecordCount > 0 -- Korrekte Anzahl
so habe ich das bisher immer verstanden und verwendet.
Recordcount = 0 ist äquivalent mit
.eof = True AND .bof = True
Ist für mich auch irgendwie logisch, da ich das so verstanden habe,
dass intern gewisse "Mindest-Buffer" gefüllt werden, aber wenn mehr
Datensätze vorhanden, als Buffer, dann -1 als Anzahl ...
Also ich habe diese Sachen bisher immer analog der obigen Beschreibung
gemischt verwendet und hatte bisher noch keine Probleme damit.
Ich hab vor Jahren mal wegen einer NG-Diskussion ein bissel
Post by Klaus Oberdalhoff [MVP]
0 reichte zur Prüfung auf "überhaupt was da", nur die gelieferte
Zahl stimmte ohne MoveLast bei größeren DS-Mengen nicht immer.

Ich kann mich nimmer erinnern, ob einige hundert oder tausend
DS nötig waren, damit die Fehler erstmals auftraten. Ich lese noch,
dass Access/DAO, vermutlich bei "zuvielen" DS für die aktuell
sichtbare Speicherseite, öfter mal schlicht 1 zur aktuellen
DS-Nummer addiert hat, statt die korrekte DS-Anzahl zu liefern.
--
cu
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Karl Donaubauer
2005-05-05 13:18:43 UTC
Permalink
...
0 reichte zur Prüfung auf "überhaupt was da", ...
Hmm, vielleicht war's auch =0 als Prüfung für leer? ;-)
Michael Zimmermann
2005-05-05 13:28:54 UTC
Permalink
Hallo!
Post by Olaf Rabbachin
[...]
If Me.Recordset.RecordCount = 0 Then
[...]
sach man, ist sich das eigentlich korrekter Ansatz? Ist
.RecordCount auch ohne ein .MoveLast in Formularen immer
korrekt belegt?
Vermutlich. Das Form-Recordset sollte zwar wohl meist ein
Dynaset sein, also die richtige Anzahl erst nach MoveLast
kennen, aber da die Anzahl Datensätze dem Datensatzzähler
bekannt ist, wird das wohl intern ausgeführt.

Im Beispiel spielt das aber keine Rolle: Wenn ein RS keine
DS enthält, ist die 0 immer richtig, wenn es welche enthält,
ist sie vielleicht falsch, aber auf jeden Fall >0

Für Prüfzwecke auf leeres/nichtleeres RS ist es also auf
jeden Fall ausreichend.
Post by Olaf Rabbachin
Ich habe so noch nie geprüft,... [rs.BOF; rs.EOF]
Ich hab's übernommen, wei der OP so angefangen hat.
Tempomäßig ist BOF/EOF sogar geringfügig schneller.
Da die Anweisung aber kaum in einer Schleife 10^6 Mal
ausgeführt wird, ist das nicht der Rede wert. Es geht um
Größenordnungen von 10 µs

Wenn Dir BOF/EOF gefällt, gibt es also keinerlei Grund, Dich
umzugewöhnen.

Gruß aus Mainz
Michael
Klaus Oberdalhoff [MVP]
2005-05-05 14:36:46 UTC
Permalink
Hi,
Post by Michael Zimmermann
Im Beispiel spielt das aber keine Rolle: Wenn ein RS keine
DS enthält, ist die 0 immer richtig, wenn es welche enthält,
ist sie vielleicht falsch, aber auf jeden Fall >0
NOPE

<> 0

ich hatte das mit dem -1 schon mal ....
--
mfg

Klaus Oberdalhoff(Access MVP) ***@gmx.de

Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99
Josef Poetzl
2005-05-05 14:53:09 UTC
Permalink
Hallo!
Post by Klaus Oberdalhoff [MVP]
Post by Michael Zimmermann
Im Beispiel spielt das aber keine Rolle: Wenn ein RS keine
DS enthält, ist die 0 immer richtig, wenn es welche enthält,
ist sie vielleicht falsch, aber auf jeden Fall >0
NOPE
<> 0
ich hatte das mit dem -1 schon mal ....
... bei einem ADO-Recordset?

Bei eine DAO-Recordset ist mir das bisher noch nicht untergekommen.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Michael Zimmermann
2005-05-05 17:58:15 UTC
Permalink
Hallo!
Post by Klaus Oberdalhoff [MVP]
Post by Michael Zimmermann
Im Beispiel spielt das aber keine Rolle: Wenn ein RS
keine DS enthält, ist die 0 immer richtig, wenn es
welche enthält, ist sie vielleicht falsch, aber auf
jeden Fall >0
NOPE
<> 0
ich hatte das mit dem -1 schon mal ....
Bei ADO-RS sowieso in diversen Konstellationen.

Beim einzig wahren Glauben des DAOismus gibt's so etwas
allerdings auch, aber m. W. nur in einem bestimmten Fall:

Dim rs As DAO.Recordset
Dim tdf As DAO.TableDef

Set tdf = CurrentDb.TableDefs("VerknüpfteTabelle")
Debug.Print tdf.RecordCount '=> -1 *Da ist die böse -1*

Aber bereits:

Set rs = tdf.OpenRecordset
Debug.Print rs.RecordCount '=> 1 >0

rs.MoveLast
Debug.Print rs.RecordCount '=> korrekte Anzahl >0


Und:

Set tdf = CurrentDb.TableDefs("LokaleTabelle")
Debug.Print tdf.RecordCount '=> korrekte Anzahl >0

Und auch:

Set rs = CurrentDb.OpenRecordset("VerknüpfteTabelle")
Debug.Print rs.RecordCount '=> 1 >0
rs.MoveLast
Debug.Print rs.RecordCount '=> korrekte Anzahl >0

Mit

MsgBox Me.Recordset.RecordCount

in einem an "VerknüpfteTabelle" gebundenen Formular ohne
weiteren Code bekomme ich sofort nach dem Öffnen die
richtige Anzahl.

Ich glaube also nicht, daß man mit der -1 bei expliziten
DAO-Recordsets Probleme zu erwarten hat. Falls aber jemand
eine nachvollziehbare Konstellation erzeugt, die bei einem
ausdrücklichen Recordset - also nicht bei TableDef -
eine -1 erzeugt, dann interessiert mich das natürlich.

Bevor einer fragt: QueryDef-Objekte haben keine
RecordCount-Eigenschaft. ;-)

Gruß aus Mainz
Michael
Olaf Rabbachin
2005-05-06 11:40:09 UTC
Permalink
Hi,
Post by Michael Zimmermann
Ich glaube also nicht, daß man mit der -1 bei expliziten
DAO-Recordsets Probleme zu erwarten hat. Falls aber jemand
eine nachvollziehbare Konstellation erzeugt, die bei einem
ausdrücklichen Recordset - also nicht bei TableDef -
eine -1 erzeugt, dann interessiert mich das natürlich.
warten wir. Versuche werde ich dafür sicher nicht starten ... :-)

Bis dann,
Olaf [MVP]
--
Bitte keine emails auf NG-postings.

My .02: www.Resources.IntuiDev.com

Loading...