![]() |
|
![]() |
#1 |
![]() MOF User |
![]() Hi,
sind folgende Anweisungen gleichwertig, bzw. wo liegen die Vor- u. Nachteile? Zweck der Anweisungen/Funktionen: Übergabe eines einzelnen Wertes aus einer SQl-Abfrage an eine Variable. Code: Variable = CurrentDbC.OpenRecordset(strSQL, dbOpenForwardOnly)(0) Code: Public Function fn_DLookupSQL(strSQL As String) As Variant Dim rs As DAO.Recordset Set rs = CurrentDbC.OpenRecordset(sSQL, dbOpenForwardOnly) With rs If .EOF Then fn_DLookupSQL = Null Else fn_DLookupSQL = .Fields(0) End If .Close End With Set rs = Nothing End Function Variable = fn_DLookUpSQL(strSQL) 2. Wird es auch wieder geschlossen? 3. Ist (0) der Feldindex des Recordsets? __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) |
![]() |
![]() ![]() |
![]() |
#2 |
![]() MOF Guru |
![]() Moin Frank,
Hast Du beide Varianten mal ausprobiert ??? ich bin nicht sicher, ob #1 überhaupt etwas liefert: die Prozedur OpenRecordset liefert eine Recordset-Objektvariable und die muss per 'set variable = ' zugewiesen werden. Auch die Schreibweise mit dem Index 0 habe ich noch nie gesehen. #2 liefert NULL, wenn das RecordSet leer ist aber wenn nicht? .fields(0) ist wiederum ein Objekt und die Zuweisung sollte per 'Set' erfolgen. Code: fn_DLookupSQL = .Fields(0).Name 'liefert den Namen des ersten Felds fn_DLookupSQL = !Fields(0) ' liefert den Inhalt des ersten Felds aus dem ersten Datensatz __________________ Freundlichen GrußHans-Christian ----------------------------------------- Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren ----------------------------------------- Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx). ----------------------------------------- Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier. |
![]() |
![]() ![]() |
![]() |
#3 |
Threadstarter
![]() ![]() MOF User |
![]() Hi Hans-Christian,
beides funktioniert einwandfrei und bringen das gleiche Ergebnis Zitat: #2 liefert NULL, wenn das RecordSet leer ist aber wenn nicht? Code: "SELECT Max(ID) FROM tblFilme;" Zitat: fn_DLookupSQL = !Fields(0) ' liefert den Inhalt des ersten Felds aus dem ersten Datensatz __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) |
![]() |
![]() ![]() |
![]() |
#4 |
![]() MOF Guru |
![]() Die zweite Variante ist die von Josef P., wenn ich mich nicht schwer irre, und ist deswegen alleine schon sauber. Beim leeren Recordset wird analog DLookup Null zurückgegeben.
Bei der ersten Variante müsste man mal testen, wie der Umgang ist, wenn die SQL-Anweisung kein Ergebnis bringt. Das wird der einzige Knackpunkt sein. __________________ Ein freundliches Glück Auf!Eberhard Abfrageperformance ist kein Geheimnis SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11} Dein Dankeschön: DBWiki=>Spende |
![]() |
![]() ![]() |
![]() |
#5 |
Threadstarter
![]() ![]() MOF User |
![]() Hallo Eberhard,
Zitat: Die zweite Variante ist die von Josef P., wenn ich mich nicht schwer irre, und ist deswegen alleine schon sauber. Beim leeren Recordset wird analog DLookup Null zurückgegeben. ![]() Zitat: Bei der ersten Variante müsste man mal testen, wie der Umgang ist, wenn die SQL-Anweisung kein Ergebnis bringt. Das wird der einzige Knackpunkt sein. Code: varID = CurrentDbC.OpenRecordset("SELECT Max(ID) FROM tblLeer;", dbOpenForwardOnly)(0) __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) Geändert von #_Columbo_# (15.08.2009 um 19:21 Uhr). |
![]() |
![]() ![]() |
![]() |
#6 |
Threadstarter
![]() ![]() MOF User |
![]() Code: Variable = CurrentDbC.OpenRecordset("SELECT Max(ID), Filmtitel FROM tblFilme GROUP BY Filmtitel;", dbOpenForwardOnly)(1) Code: Variable = CurrentDbC.OpenRecordset("SELECT Max(ID), Filmtitel FROM tblFilme GROUP BY Filmtitel;", dbOpenForwardOnly)(0) !!! Bei dieser Schreibweise ist die Angabe des Feldindexes (n) scheinbar unbedingt erforderlich, da sonst Fehlermeldung !!! __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) Geändert von #_Columbo_# (15.08.2009 um 19:34 Uhr). |
![]() |
![]() ![]() |
![]() |
#7 |
![]() MOF Guru |
![]() Anm.:
Code: Variable = CurrentDbC.OpenRecordset(...)(0) Code: Variable = CurrentDbC.OpenRecordset(...).Fields(0) CurrentDbC.OpenRecordset(...) ... liefert als Ergebnis ein Recordset, das man im Prinzip ohne Umweg einer Variablen verwenden kann. symbolisch: [Recordset aus CurrentDbC.OpenRecordset(..)].Fields(0) Wenn es keinen Datensatz gibt, kann aber Recordset.Fields(0) nicht ausgewertet werden und es kommt zu einem Fehler. Geändert von Josef P. (15.08.2009 um 22:43 Uhr). |
![]() |
![]() ![]() |
![]() |
#8 |
Threadstarter
![]() ![]() MOF User |
![]() Hi Josef,
Zitat: CurrentDbC.OpenRecordset(...) ... liefert als Ergebnis ein Recordset, das man im Prinzip ohne Umweg einer Variablen verwenden kann. Zitat: Wenn es keinen Datensatz gibt, kann aber Recordset.Fields(0) nicht ausgewertet werden und es kommt zu einem Fehler. __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) |
![]() |
![]() ![]() |
![]() |
#9 |
![]() MOF Guru |
![]() Zitat: Hmmm.... NULL = Fehler ????? -> s. Posting #5 z. B.: Code: varID = CurrentDbC.OpenRecordset("SELECT id FROM tblLeer", dbOpenForwardOnly)(0) Code: varID = CurrentDbC.OpenRecordset("SELECT max(id) FROM tblLeer group by ID", dbOpenForwardOnly)(0) |
![]() |
![]() ![]() |
![]() |
#10 |
![]() MOF Guru |
![]() Jetzt musste ich doch einmal testen - und frage mich, was Du getestet hast.
Zitat: liefert NULL zurück, wobei tblLeer eine leere Tabelle OHNE Datensätze und Felder ist Der gezeigte Test mit Max auf eine Tabelle ohne Datensätze ergibt in der Tat Null. Der Test einer ganz normalen Auswahlabfrage (ebenso typisch für DLookup) mit Code: sSQL = "SELECT * FROM tab WHERE ID = 100" __________________ Ein freundliches Glück Auf!Eberhard Abfrageperformance ist kein Geheimnis SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11} Dein Dankeschön: DBWiki=>Spende |
![]() |
![]() ![]() |
![]() |
#11 |
Threadstarter
![]() ![]() MOF User |
![]() Hi Josef,
ich glaube ich hab's verstanden: Bei existierenden Tabellen MIT Datensätzen kann ich die Kurzvariante nehmen Wenn ich mir da mal nicht so sicher sein sollte, dann doch lieber die ausführliche Variante von Dir __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) |
![]() |
![]() ![]() |
![]() |
#12 |
Threadstarter
![]() ![]() MOF User |
![]() @Eberhard,
sorry das Du Dir die Arbeit gemacht hast, mein Problem nachzuvollziehen ![]() Ich hatte in der Tat nur folgende Zeile angetestet gehabt und die lieferte halt NULL: Zitat: varID = CurrentDbC.OpenRecordset("SELECT Max(ID) FROM tblLeer;", dbOpenForwardOnly)(0) ![]() Bei leeren Tabellen gibts also meist Fehlermeldungen bei dieser Version __________________ Gruß Frank- Win10 Pro (64bit) - MS Office 2010 (32bit) |
![]() |
![]() ![]() |
![]() |
#13 |
![]() MOF Guru |
![]() Die ausführliche Variante wird schnell kurz, wenn man sie in eine Hilfsfunktion steckt. (So wie im Beitrag #1 gezeigt)
Wenn dann später nur noch diese Hilfsfunktion verwendet wird, ist es doch völlig egal wieviele Zeilen in dieser Hilfsfunktion stecken. Eine Funktion, die ich gerne einsetze: Code: Public Function DLookupSQL(ByVal sSQL As String, Optional ByVal index As Variant = 0&) As Variant Dim rst As DAO.Recordset Set rst = CurrentDbC.OpenRecordset(sSQL, dbOpenForwardOnly, dbSeeChanges, dbReadOnly) With rst If .EOF Then DLookupSQL = Null Else DLookupSQL = .Fields(index) End If .Close End With Set rst = Nothing End Function Code: varID = DLookupSQL("SELECT id FROM tblLeer") |
![]() |
![]() ![]() |
![]() |
#14 |
![]() MOF Guru |
![]() Zitat: Bei existierenden Tabellen MIT Datensätzen kann ich die Kurzvariante nehmen Ein Test, ob ein bestimmter Datensatz/Eintrag vorhanden ist, sollte somit mit der Kurzvariante tunlichst unterlassen werden. Fazit: Die Langvariante ist universeller und in der Schreibarbeit kürzer, die einmalige Deklaration der Funktion (Kopieren in ein Modul) kann man als Aufwand vernachlässigen. __________________ Ein freundliches Glück Auf!Eberhard Abfrageperformance ist kein Geheimnis SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11} Dein Dankeschön: DBWiki=>Spende |
![]() |
![]() ![]() |