PDA

Vollständige Version anzeigen : Unterschied zwischen Abfrage und Recordset


Konrad1976
06.07.2006, 07:18
Hallo Leute!

Ich krieg bald ein Nervenleiden. :(

Ich habe eine Abfrage qry_HoechsteVorlage welche folgenden SQL-Code enthält:
SELECT Max(qry_HoechsteVorlageVorbereitung.Zahl) AS MaxVorlage FROM qry_HoechsteVorlageVorbereitung;
Dabei erhalte ich als Ergebnis genau einen Datensatz welcher den höchsten Wert der Spalte "Zahl" enthält.

So nun nehme ich die Abfrage (bzw. den SQL-Code; habe beides versucht) und gebe es an ein Recordset weiter:

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cn = CurrentProject.Connection
cn.CursorLocation = adUseClient

'Abfrage für Höchste Vorlagenzahl öffnen und auswerten
With rs
.Source = "SELECT Max(qry_HoechsteVorlageVorbereitung.Zahl) AS MaxVorlage FROM qry_HoechsteVorlageVorbereitung;"
.ActiveConnection = cn
.LockType = adLockReadOnly
.CursorType = adOpenKeyset
.Open Options:=adCmdTableDirect
End With

Dim HoechsteVorlage As String
rs.MoveLast
HoechsteVorlage = rs("MaxVorlage")

Und jetzt bekomme ich als Ergebnis für HoechsteVorlage NULL. Aber in der Abfrage stimmts. Auch wenn ich rs.RecordCount eingebe bekomme ich als Ergebnis 1 Datensatz.

Ich bin überzeugt daß ihr genau wisst was ich da falsch mache!
Ich danke euch schon mal im Voraus für eure Mühen.

J_Eilers
06.07.2006, 07:25
Hi,

wie sieht denn qry_HoechsteVorlageVorbereitung aus?

LaSweeta
06.07.2006, 08:05
Hi!

Liege ich richtig in der Annahme, das du hier einen Wert aus einem Feld in der Datenbank auslesen willst?
Wenn ja, dann is dein rs.count falsch an dieser Stelle, das würde dir die Anzahl der Datensätze zurückgeben.

Was du hier tun müssest wäre:

HoechsteVorlage = rs!MaxVorlage_Spalte

Hoffe das hilft dir weiter...

Grüße
LaSweeta

Konrad1976
06.07.2006, 08:10
hallo j_eilers!

die Vorbereitung sieht folgendermaßen aus:

SELECT CLng(Replace([STNr],"v","")) AS Zahl FROM tbl_Stoerungen GROUP BY CLng(Replace([STNr],"v","")), tbl_Stoerungen.STNr HAVING (((tbl_Stoerungen.STNr) Like "V*")) ORDER BY CLng(Replace([STNr],"v","")) DESC;

In der Spalte "STNr" sind Vorlagen sind als "V" + einer laufenden Nummer gekennzeichnet (die erste Vorlage heißt also V1, die zweite V2 usw.). Diese filtere ich aus wandle das Ergebnis dann im Feld "Zahl" aus. Dabei wird das V wegrationalisiert und der Inhalt in eine Zahl umgewandelt (Also aus V1 wird 1 und aus V2 wird 2). Am schluss bleibt also ein Feld Zahl übrig welches ich heranziehe um in der zweiten Abfrage den Max-Wert zu berechnen.

Anne Berg
06.07.2006, 08:11
Wozu überhaupt dieser Aufstand mit ADO und Recordset zur Feststellung eines einzelnen Wertes?! :confused:

PS: ist die Option acCmdTableDirect OK?


@LaSweeta: rs!MaxVorlage ist identisch mit rs("MaxVorlage")

Konrad1976
06.07.2006, 08:13
danke LaSweeta aber das ist nicht mein Problem. Ich weiß wie ich (zumindest theoretisch :-( ) die Werte auslesen kann. Das Beispiel mit dem Recordcount hab ich nur angegeben, da dieser mir als Ergbnis einen Datensatz zurückgibt. Genau den finde ich aber nicht um eben seinen Wert auszulesen.

Konrad1976
06.07.2006, 08:17
:D
hallo anne!

Ich möchte automatisch eine neue "Vorlagennummer" anlegen. Dies kann in meinem Fall leider nicht automatisch erledigt werden (und ich erspare euch jetzt mal warum das so gemacht werden muss).

Ich will eigentlich nur die höchste Vorlagennummer ermitteln und dann um 1 erhöhen um einen neue Vorlage anzulegen.

Ich wäre Dir mehr als dankbar wenn du eine einfachere Lösung für dieses Problem weißt als meine ADO Lösung (die ja noch nichtmal eine ist)

J_Eilers
06.07.2006, 08:45
Hast du es mal mit DMax() versucht? Die Gruppierung kannst du doch auch eigentlich rausschmeissen und die Sortierung auch, wenn du dort gleich mit Max() auf die Zahl gehst...

Domänenfunktionen sind zwar bäh, aber ums mal fix zu testen, schaue mal, ob das den richtigen Wert ergibt:

MsgBox DMax(CLng(Replace(STNr,"v","")), "tbl_Stoerungen", "STNr Like 'V*'")

Anne Berg
06.07.2006, 08:51
HoechsteVorlage = DMax("Zahl", "qry_HoechsteVorlageVorbereitung")


PS: ich persönlich finde Domänenaggregatfunktionen absolut praktisch! :p

J_Eilers
06.07.2006, 09:15
@Anne Du hast vielleicht auch die Zeit bei größeren Abfragen bei mehreren Tausend Datensätzen einen Kaffee trinken zu gehen :P ;)

Konrad1976
06.07.2006, 09:16
@Anne
http://img99.exs.cx/img99/8577/yupi3ti.gif
Vielen Dank! Das wars. Ich werd mir das mit dem DMAX nie merken...

@J_Eilers
Vielen dank auch für deine Mühe, aber Anne hats auf den Punkt gebracht.

Thema damit erledigt ;-)

J_Eilers
06.07.2006, 09:26
Zum Merken, schaust du hier (http://www.jans-hp.de/?section=access&thema=vba&page=dom)

Anne Berg
06.07.2006, 09:31
@Jan: deinen Einwand kann ich nicht nachvollziehen. :p

Ich habe in der Praxis damit noch nie ein Problem gehabt, setze das aber auch nur ein, um mir mal eben schnell einen (Max-) Wert aus einer (kleineren) Tabelle zu holen. Im Zweifelsfall ist jedoch

DMax("feldx", "taby")
ebenso langsam wie
DBEngine(0)(0).OpenRecordset("select max(feldx) from taby")(0)

Oder was wäre da die Alternative?

J_Eilers
06.07.2006, 09:46
@Anne Fast, ein dbOpenSnapshot kann Wunder wirken. Innerhalb einer Abfrage, wo diese Funktion nun öfter hintereinander (für jeden Datensatz) ausgeführt wird, bringt es bei mir einen erheblich Unterschied.