Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Nur ein Feld einer Abfrage ausgeben

41 views
Skip to first unread message

Heike Böhm

unread,
Feb 25, 2005, 2:18:21 AM2/25/05
to

Heike Böhm schrieb:
Hallo,

ich habe eine Abfrage mit dem Namen "AgreeNC" und von der möchte ich
nur das Feld (Spalte) "Request" ausgeben. Aber es bringt mir immer nur
die Fehlermeldung "3021 Entweder BOF oder EOF ist True, oder der
aktuelle
Datensatz wurde gelöscht. Der angeforderte Vorgang benötigt einen
aktuellen
Datensatz.". Benutze ich eine andere Abfrage funktionierts,
blöderweise brauche ich aber die von AgreeNC! *g*
Hier mal der Code, wie ich bisher vorgegangen bin:


Public Sub RequestVergleichen()
Dim DBS As New ADODB.Recordset
Dim feldinhalt As String

Set DBS = New ADODB.Recordset
On Error GoTo fehler
DBS.Open " SELECT Request " & _
" FROM AgreeNC ORDER by Date", _
CurrentProject.Connection
feldinhalt = DBS.GetString
Debug.Print feldinhalt
DBS.Close
Set DBS = Nothing
Exit Sub

fehler:
MsgBox Err.Number & " " & Err.Description
End Sub


Vielleicht hat jemand von euch eine Idee, wie ich mein Ziel erreichen
kann und sei es auch mit einem anderen Code... Ich will doch nur ein
einziges Feld ausgeben *seuftz*

Liebe Grüße
Heike Böhm


Jörg Ackermann <trashf...@gmx.de> wrote in message
news:<3865g9F...@individual.net>...
> Hi,
>
> Jörg Ackermann schreibselte:
>
> nochwas...
>
> Du solltest auch auf EOF/BOF prüfen und damit, ob die
> Abfrage überhaupt Daten liefert
>
> ...
> If Not DBS.EOF Then
> feldinhalt = DBS.Fields("Request")
> Debug.Print feldinhalt
> End If

Hallo zusammen,

Ich hab den Code jetzt komplett so übernommen:


Public Sub RequestVergleichen()
Dim DBS As ADODB.Recordset 'ohne New!
Dim feldinhalt As String

Set DBS = New ADODB.Recordset
On Error GoTo fehler
'Leerzeichen zuviel, Date in Klammern
DBS.Open " SELECT Request" & _
" FROM AgreeNC ORDER by Date", _
CurrentProject.Connection
If Not DBS.EOF Then
feldinhalt = DBS.Fields("Request")
Debug.Print feldinhalt
End If
DBS.Close
Set DBS = Nothing
Exit Sub

fehler:
MsgBox Err.Number & " " & Err.Description
End Sub


Und es läuft immer noch nicht, es macht zwar irgendwas, aber die Daten gibt
es mir nicht aus! Zumindest gibt es keine Fehlermeldung mehr. An was könnte
das denn noch liegen? Die Abfrage hat doch 1777 Datensätze...

Liebe Grüße
Heike Böhm

Gerald Aichholzer

unread,
Feb 25, 2005, 2:47:15 AM2/25/05
to
Hallo Heike,

Heike Böhm wrote:
>
> Jörg Ackermann <trashf...@gmx.de> wrote in message
> news:<3865g9F...@individual.net>...
>

du hast das Feld "Date" nicht in Klammern geschrieben (zu-
mindest in obigem Beispiel nicht) - es sollte genau so aus-
sehen (siehst du die Klammern bei Date?):

DBS.Open " SELECT Request" & _
" FROM AgreeNC ORDER by [Date]", _
CurrentProject.Connection


Die Fehlermeldung ist weg, weil du auf EOF prüfst:

If Not DBS.EOF Then
feldinhalt = DBS.Fields("Request")
Debug.Print feldinhalt
End If

Deine Abfrage liefert keine Datensätze (weil du das Feld "Date"
nicht in eckige Klammern geschrieben hast und Access daher die
eingebaute Funktion Date anstatt deines Feldes genommen hat -
vermute ich mal), daher ist auch EOF Wahr und der Code zwischen
"If" und "End If" wird nicht ausgeführt. Genau dieser Code er-
zeugt jedoch den Fehler.

schöne Grüße,
Gerald

Heike Böhm

unread,
Feb 25, 2005, 3:02:12 AM2/25/05
to
Hi du,

Am Fri, 25 Feb 2005 08:47:15 +0100 schrieb Gerald Aichholzer:
> du hast das Feld "Date" nicht in Klammern geschrieben (zu-
> mindest in obigem Beispiel nicht) - es sollte genau so aus-
> sehen (siehst du die Klammern bei Date?):
>
> DBS.Open " SELECT Request" & _
> " FROM AgreeNC ORDER by [Date]", _
> CurrentProject.Connection
>
>
> Die Fehlermeldung ist weg, weil du auf EOF prüfst:
>
> If Not DBS.EOF Then
> feldinhalt = DBS.Fields("Request")
> Debug.Print feldinhalt
> End If
>
> Deine Abfrage liefert keine Datensätze (weil du das Feld "Date"
> nicht in eckige Klammern geschrieben hast und Access daher die
> eingebaute Funktion Date anstatt deines Feldes genommen hat -
> vermute ich mal), daher ist auch EOF Wahr und der Code zwischen
> "If" und "End If" wird nicht ausgeführt. Genau dieser Code er-
> zeugt jedoch den Fehler.


Habs versucht, es klappt nicht. Hab Date in eckige Klammern gesetzt, damit
es auf mein Abfragefeld "Date" zugreift. Es gibt mir wie gesagt keine
Fehlermeldung mehr, aber es gibt mir auch nichts im Direktfenster aus!
Seltsam *grübel*
Hast du sonst noch ne Idee, an was es liegen könnte?

Liebe Grüße
Heike Böhm

Gerald Aichholzer

unread,
Feb 25, 2005, 4:09:17 AM2/25/05
to

Hallo Heike,

wenn du die Abfrage "AgreeNC" per Doppelklick öffnest, dann werden
Datensätze angezeigt ohne das vorher Parameter o.ä. abgefragt wer-
den?

Falls ja, dann gib mal folgende Funktion in ein Modul:

Public Sub PrintRecCount(ByVal sSQL As String)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
Set rs.ActiveConnetion = cn
rs.Source = sSQL
rs.Open

If (rs.EOF And rs.BOF) Then
Debug.Print "keine Datensätze!"
Else
rs.MoveLast
Debug.Print rs.RecordCount; " Datensätze!"
End If

Set rs = Nothing
Set cn = Nothing
End Sub

und gib im Direktfenster folgendes ein (und schau dann, was ausge-
geben wird):

Call PrintRecCount("AgreeNC")
Call PrintRecCount("SELECT * FROM AgreeNC")
Call PrintRecCount("SELECT * FROM AgreeNC ORDER BY [Date]")
Call PrintRecCount("SELECT Request FROM AgreeNC ORDER BY [Date]")

eigentlich sollten alle vier Varianten die selbe Ausgabe liefern.

HTH
Gerald

Michael Zimmermann

unread,
Feb 25, 2005, 4:26:19 AM2/25/05
to
Hallo!

Gerald Aichholzer:
> Dim rs As ADODB.Recordset
^^^^^
> ...


> If (rs.EOF And rs.BOF) Then
> Debug.Print "keine Datensätze!"
> Else
> rs.MoveLast

^^^^^^^^


> Debug.Print rs.RecordCount; " Datensätze!"
> End If

Das Movelast kannst Du Dir bei einem *ADO*-RS schenken, das
liefert nach Erzeugung gleich die richtige Anzahl.

Gut, "gleich" ist vielleicht der falsche Ausdruck, wenn
man bedenkt, daß seine Erzeugung über 10mal länger als die
eines DAO-RS dauert. Da kann man dann schon fast erwarten,
daß es in dieser Zeit nicht nur seine Datensatzanzahl
selbst bestimmt, sondern auch noch Kaffe kocht und vom
Bäcker unterwegs ein paar Teilchen mitbringt. ;-)

Gruß aus Mainz
Michael

Josef Poetzl

unread,
Feb 25, 2005, 4:39:49 AM2/25/05
to
Hallo!

Michael Zimmermann schrieb:


> Gerald Aichholzer:
>> Dim rs As ADODB.Recordset
> ^^^^^
>> ...
>> If (rs.EOF And rs.BOF) Then
>> Debug.Print "keine Datensätze!"
>> Else
>> rs.MoveLast
> ^^^^^^^^
>> Debug.Print rs.RecordCount; " Datensätze!"
>> End If
>
> Das Movelast kannst Du Dir bei einem *ADO*-RS schenken, das
> liefert nach Erzeugung gleich die richtige Anzahl.

Da ist nicht richtig. Hängt nämlich vom Cursor ab.
(siehe OH)

> Gut, "gleich" ist vielleicht der falsche Ausdruck, wenn
> man bedenkt, daß seine Erzeugung über 10mal länger als die
> eines DAO-RS dauert.

Also ich finde ADO-Recordsets schneller.
Vielleicht sollte ich erwähnen, dass ich einen SQL-Server als BE
verwende. ;-)

mfg
Josef

--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Gerald Aichholzer

unread,
Feb 25, 2005, 4:43:02 AM2/25/05
to
Hallo Michael,

Michael Zimmermann wrote:
>
> Gerald Aichholzer:
>
>> Dim rs As ADODB.Recordset
>
> ^^^^^
>

[snip]

> Gut, "gleich" ist vielleicht der falsche Ausdruck, wenn
> man bedenkt, daß seine Erzeugung über 10mal länger als die
> eines DAO-RS dauert.

auch wenn du mich aufgrund früherer Aussagen von mir für
immer als ADO-Fan abgestempelt hast (dabei verwende ich
ADO erst seit 1.1.2005) ;) ...

... ich verwende in meinen Beispielen immer die Methode,
die auch vom OP verwendet wird. Da Heike mit ADO arbeitet,
verwende ich auch ADO.

schöne Grüße,
Gerald

Heike Böhm

unread,
Feb 25, 2005, 4:53:20 AM2/25/05
to

Hallo Gerald,

öffne ich die Abfrage "AgreeNC" (ist übrigens ne ganz normale
Auswahlabfrage) per Doppelklick, fragt es mich weder nach Parameter noch
nach sonst irgendwas. Es öffnet sie ganz normal und zeigt mir 1777
Datensätze an. Der erste Datensatz bzw. das Feld Date des ersten
Datensatzes ist makiert.
Alle vier Varianten geben die selbe Ausgabe und zwar : "keine Datensätze!"
Ist echt lustig! Keine Datensätze und in Wirklichkeit sinds 1777! Ich werd
noch verrückt *g*
Naja, irgendne Idee?
Danke schon mal für weitere Ideen und Liebe Grüße
Heike Böhm

Michael Zimmermann

unread,
Feb 25, 2005, 5:17:54 AM2/25/05
to
Hallo!

Josef Poetzl:


> Michael Zimmermann schrieb:
> > Gerald Aichholzer:
> > > Dim rs As ADODB.Recordset
> > ^^^^^
> > > ...
> > > If (rs.EOF And rs.BOF) Then
> > > Debug.Print "keine Datensätze!"
> > > Else
> > > rs.MoveLast
> > ^^^^^^^^
> > > Debug.Print rs.RecordCount; " Datensätze!"
> > > End If
> >
> > Das Movelast kannst Du Dir bei einem *ADO*-RS schenken,
> > das liefert nach Erzeugung gleich die richtige Anzahl.
>
> Da ist nicht richtig. Hängt nämlich vom Cursor ab.

Stimmt auch wieder. Ordentlicherweise sollte man das
über Supports prüfen, bzw. den Cursor entsprechend
festlegen. Mit dem Standardwert adOpenForwardOnly
geht's nicht; gibt aber auch bei MoveLast einen Fehler.
Bei Dynamic hilft auch kein Movelast, bei KeySet und Static
stimmt die Anzahl direkt (CursorLocation und LockType
Standard).

Also genauer formuliert: Bemerkenswerterweise (für
eingefleischte DAOisten) gibt es bei ADO-RS überhaupt bei
geeigneter Konstellation die Möglichkeit, in einer
Jet-Umgebung die genaue DS-Anzahl über Recordcount ohne
Movelast zu bestimmen, auch wenn das RS nicht auf einer
lokalen Tabelle beruht. ;-)

> Also ich finde ADO-Recordsets schneller.
> Vielleicht sollte ich erwähnen, dass ich einen SQL-Server
> als BE verwende. ;-)

In /dieser/ Gruppe unterstelle ich, falls nicht
ausdrücklich etwas anderes gesagt ist, daß als BE
Jet, Jet oder Jet Verwendung findet. ;-)

Gruß aus Mainz ins hoffentlich sonnige Graz
Michael

Josef Poetzl

unread,
Feb 25, 2005, 5:34:39 AM2/25/05
to
Hallo!

Michael Zimmermann schrieb:


>>> Das Movelast kannst Du Dir bei einem *ADO*-RS schenken,
>>> das liefert nach Erzeugung gleich die richtige Anzahl.
>>
>> Da ist nicht richtig. Hängt nämlich vom Cursor ab.

Trotzdem ist es richtig, dass man sich das Movelast schenken kann.

> Stimmt auch wieder. Ordentlicherweise sollte man das
> über Supports prüfen, bzw. den Cursor entsprechend
> festlegen. Mit dem Standardwert adOpenForwardOnly
> geht's nicht; gibt aber auch bei MoveLast einen Fehler.
> Bei Dynamic hilft auch kein Movelast, bei KeySet und Static
> stimmt die Anzahl direkt (CursorLocation und LockType
> Standard).
>
> Also genauer formuliert: Bemerkenswerterweise (für
> eingefleischte DAOisten) gibt es bei ADO-RS überhaupt bei
> geeigneter Konstellation die Möglichkeit, in einer
> Jet-Umgebung die genaue DS-Anzahl über Recordcount ohne
> Movelast zu bestimmen, auch wenn das RS nicht auf einer
> lokalen Tabelle beruht. ;-)

Ja:
rst.CursorLocation = adUseClient
=> Es stimmt auch bei Dynamic und OpenForwardOnly
(Das ist übrigens eine wichtige Einstellung, die man bei einem
SQL-Server-BE für ein mdb-FE beachten sollte.)

>> Also ich finde ADO-Recordsets schneller.
>> Vielleicht sollte ich erwähnen, dass ich einen SQL-Server
>> als BE verwende. ;-)
>
> In /dieser/ Gruppe unterstelle ich, falls nicht
> ausdrücklich etwas anderes gesagt ist, daß als BE
> Jet, Jet oder Jet Verwendung findet. ;-)

Ich wollte nur die pauschale Aussage "ADO ist langsam" nicht so stehen
lassen. ;-)

Gerald Aichholzer

unread,
Feb 25, 2005, 7:20:02 AM2/25/05
to
Hallo Heike,

> öffne ich die Abfrage "AgreeNC" (ist übrigens ne ganz normale
> Auswahlabfrage) per Doppelklick, fragt es mich weder nach Parameter noch
> nach sonst irgendwas. Es öffnet sie ganz normal und zeigt mir 1777
> Datensätze an. Der erste Datensatz bzw. das Feld Date des ersten
> Datensatzes ist makiert.
> Alle vier Varianten geben die selbe Ausgabe und zwar : "keine Datensätze!"
> Ist echt lustig! Keine Datensätze und in Wirklichkeit sinds 1777! Ich werd
> noch verrückt *g*
> Naja, irgendne Idee?

jetzt bin ich mit meinem Latein auch langsam am Ende, ich
weiß nicht, ob es sinnvoll ist, das ganze nochmals mit DAO
anstatt ADO zu probieren *grübel*:

Public Sub PrintRecCountDAO(ByVal sSQL As String)
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset(sSQL)

If (rs.EOF And rs.BOF) Then
Debug.Print "keine Datensätze!"
Else
rs.MoveLast
Debug.Print rs.RecordCount; " Datensätze!"
End If

rs.Close
Set rs = Nothing
Set db = Nothing
End Sub


Call PrintRecCountDAO("AgreeNC")
Call PrintRecCountDAO("SELECT * FROM AgreeNC")
Call PrintRecCountDAO("SELECT * FROM AgreeNC ORDER BY [Date]")
Call PrintRecCountDAO("SELECT Request FROM AgreeNC ORDER BY [Date]")

lg,
Gerald

Heike Böhm

unread,
Feb 25, 2005, 7:26:04 AM2/25/05
to
Hallo Gerald,

Freude! Jetzt sagt es mir immerhin, das es 1777 Datensätze enthält! Heißt
das, dass es über DAO laufen könnte? Wie sieht dann der Code dafür aus?
Vielen Dank erstmal!
Liebe Grüße
Heike Böhm

Josef Poetzl

unread,
Feb 25, 2005, 7:38:02 AM2/25/05
to
Hallo!

Heike Böhm schrieb:


> Freude! Jetzt sagt es mir immerhin, das es 1777 Datensätze enthält! Heißt
> das, dass es über DAO laufen könnte?

Das liegt vermutlich an Deiner Abfrage.

Beispiel
SELECT * FROM Tabelle WHERE TextFeld like 'A*'

=> liefert mit DAO Datensätze die mit "A" beginnen
=> liefert mit ADO nur jene DS die "A*" entsprechen.

Grund: bei ADO musst Du % statt * als Platzhalter verwenden.

Gerald Aichholzer

unread,
Feb 25, 2005, 7:39:39 AM2/25/05
to
Josef Poetzl wrote:
>
> Heike Böhm schrieb:
>
>>Freude! Jetzt sagt es mir immerhin, das es 1777 Datensätze enthält! Heißt
>>das, dass es über DAO laufen könnte?
>
>
> Das liegt vermutlich an Deiner Abfrage.
>
> Beispiel
> SELECT * FROM Tabelle WHERE TextFeld like 'A*'
>
> => liefert mit DAO Datensätze die mit "A" beginnen
> => liefert mit ADO nur jene DS die "A*" entsprechen.
>
> Grund: bei ADO musst Du % statt * als Platzhalter verwenden.
>

Hallo Josef,

bezieht sich das auch auf die in der Abfrage AgreeNC
gespeicherten Platzhalter? Auf die Idee wäre ich nie
gekommen, da Heikes Vorgabe ja

SELECT Request FROM AgreeNC ORDER BY [Date]

war.

In diesem Fall hat Heike aber ein anderes Problem:
die Abfrage funktioniert entweder in Access (DAO-
Jokerzeichen) oder mit VBA/ADO (SQL Server Joker-
zeichen).

lg,
Gerald

Gerald Aichholzer

unread,
Feb 25, 2005, 7:45:34 AM2/25/05
to
Hallo Heike,

wie meinst du deine letzte Frage? Du arbeitest einfach mit DAO.Recordset
und DAO.Database anstatt ADODB.Recordset und ADODB.Connection. Der Rest
ist (zumindest für Recordset) sehr ähnlich (so auch der Zugriff auf die
Werte eines Feldes).

lg,
Gerald

PS: vielleicht helfen dir folgende Links (englisch, falls nicht anders
angegeben) - schnell mit Google gesucht - bei dir natürlich die umge-
kehrte Richtung ;)

http://download.microsoft.com/download/7/a/a/7aa1a824-fa93-4349-a466-92950e5bbb17/ms-tt-03-2000.ppt
deutsch, Datenbankprogrammierung: Von DAO nach ADO

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconadocomparedwithrdodao.asp
ADO Compared with RDO and DAO

http://www.convertertechnology.com/uploadedfiles/DAO_to_ADO.pdf
Make the Leap from DAO to ADO

http://www.databasejournal.com/features/mssql/article.php/1490571
From DAO to ADO

Josef Poetzl

unread,
Feb 25, 2005, 7:49:01 AM2/25/05
to
Hallo!

Gerald Aichholzer schrieb:


>> Grund: bei ADO musst Du % statt * als Platzhalter verwenden.
>

> bezieht sich das auch auf die in der Abfrage AgreeNC
> gespeicherten Platzhalter?

Ja.

> Auf die Idee wäre ich nie
> gekommen, da Heikes Vorgabe ja
> SELECT Request FROM AgreeNC ORDER BY [Date]
> war.

Kommt vermutlich daher, dass Heike schon einige Threads zu diesem
Problem geöffnet hat. Irgendwo stand einmal, dass die Abfrage
"AgreeNC" Platzhalter verwendet.

> In diesem Fall hat Heike aber ein anderes Problem:
> die Abfrage funktioniert entweder in Access (DAO-
> Jokerzeichen) oder mit VBA/ADO (SQL Server Joker-
> zeichen).

Das ist wieder ein Grund mehr, in einer für Zugriffe auf mdb-Objekte
DAO zu verwenden. ;-)

Gerald Aichholzer

unread,
Feb 25, 2005, 9:07:45 AM2/25/05
to
Hallo Josef,

Josef Poetzl wrote:
>
> Gerald Aichholzer schrieb:
>
>>>Grund: bei ADO musst Du % statt * als Platzhalter verwenden.
>>
>>bezieht sich das auch auf die in der Abfrage AgreeNC
>>gespeicherten Platzhalter?
>
> Ja.
>

[snip]


>
>>In diesem Fall hat Heike aber ein anderes Problem:
>>die Abfrage funktioniert entweder in Access (DAO-
>>Jokerzeichen) oder mit VBA/ADO (SQL Server Joker-
>>zeichen).
>
>
> Das ist wieder ein Grund mehr, in einer für Zugriffe auf mdb-Objekte
> DAO zu verwenden. ;-)
>

gut, dass du mir das sagst, bevor ich Joker-Zeichen in einem
Projekt verwendet habe ;-)

lg,
Gerald

Heike Böhm

unread,
Feb 28, 2005, 3:47:09 AM2/28/05
to
Hallo Gerald,

Danke für deine Linktipps, mit dem einen konnte ich was anfangen, denn
jetzt läuft es! Das hier ist der Code dafür :
(Die Variable "feldinhalt" ist übrigens als "Private" deklariert, weil ich
die später noch brauche und taucht deshalb nicht als Deklaration selbst
auf!)


Sub DatensätzeAuslesen()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim fld As DAO.Field

Dim strEingabe As String

strEingabe = InputBox("Bitte geben Sie den gesuchten Request ein!")
If strEingabe = vbNullString Then
Exit Sub
Else
'Öffnet Datenbank
Set db =
DBEngine.OpenDatabase("T:\BADOC\P21_SC&F_BW_Europe\Projects\Transport
Verification Tool\TVT.mdb")

'Öffnet Recordset
Set rst = db.OpenRecordset("SELECT Request FROM AgreeNC Where [Short
Text]" & _
"LIKE '*" & strEingabe & "*' ")

'Gibt die Requests im Direktbereich aus
While Not rst.EOF
For Each fld In rst.Fields
feldinhalt = fld.Value & ","
Debug.Print feldinhalt
Next
Debug.Print
rst.MoveNext
Wend
'Schließt recordset
rst.Close

End If
End Sub


Danke auch an alle anderen, die mir geholfen haben!
Bis gleich beim nächsten Posting, mit nem anderen Problem *g*

Ganz liebe Grüße
Heike Böhm

0 new messages