MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 15.08.2009, 16:52   #1
#_Columbo_#
MOF User
MOF User
Standard Sonstiges - Vgl. 2er DLookUp-Varianten

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)
und
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)
1. Wird im ersten Fall eine Recordset geöffnet?
2. Wird es auch wieder geschlossen?
3. Ist (0) der Feldindex des Recordsets?

__________________

Gruß Frank

- Win10 Pro (64bit) - MS Office 2010 (32bit)
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.08.2009, 17:13   #2
hcscherzer
MOF Guru
MOF Guru
Standard

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.
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.08.2009, 17:42   #3
#_Columbo_#
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hi Hans-Christian,

beides funktioniert einwandfrei und bringen das gleiche Ergebnis

Zitat:

#2 liefert NULL, wenn das RecordSet leer ist aber wenn nicht?

Bei folgender SQL-Abfrage wird immer EIN Ergebnis geliefert:
Code:

"SELECT Max(ID) FROM tblFilme;"

Zitat:

fn_DLookupSQL = !Fields(0) ' liefert den Inhalt des ersten Felds aus dem ersten Datensatz

liefert aber einen Fehler. Eigentlich logisch, da Fields ja kein definiertes Feld ist, sondern die Feld-Auflistung des Recordsets und da ist die !-Schreibweise IMHO falsch.

__________________

Gruß Frank

- Win10 Pro (64bit) - MS Office 2010 (32bit)
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.08.2009, 17:50   #4
ebs17
MOF Guru
MOF Guru
Standard

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
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.08.2009, 18:14   #5
#_Columbo_#
Threadstarter Threadstarter
MOF User
MOF User
Standard

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.

Da hast Du vollkommen recht und läuft natürlich auch hervorragend

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)
liefert NULL zurück, wobei tblLeer eine leere Tabelle OHNE Datensätze und Felder ist und daher die Funktion Max(ID) keinen Wert zurückgibt.

__________________

Gruß Frank

- Win10 Pro (64bit) - MS Office 2010 (32bit)

Geändert von #_Columbo_# (15.08.2009 um 18:21 Uhr).
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.08.2009, 18:29   #6
#_Columbo_#
Threadstarter Threadstarter
MOF User
MOF User
Standard

Code:

  Variable = CurrentDbC.OpenRecordset("SELECT Max(ID), Filmtitel FROM tblFilme GROUP BY Filmtitel;", dbOpenForwardOnly)(1)
die eingeklammerte Zahl ist der Feldindex des Recordset. Hier der Filmtitel
Code:

  Variable = CurrentDbC.OpenRecordset("SELECT Max(ID), Filmtitel FROM tblFilme GROUP BY Filmtitel;", dbOpenForwardOnly)(0)
hier die ID

!!! 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 18:34 Uhr).
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.08.2009, 20:10   #7
Josef P.
MOF Guru
MOF Guru
Standard

Anm.:
Code:

Variable = CurrentDbC.OpenRecordset(...)(0)
steht für
Code:

Variable = CurrentDbC.OpenRecordset(...).Fields(0)
weil Fields das Standardelement von Recordset ist.
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 21:43 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 04:34   #8
#_Columbo_#
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hi Josef,

Zitat:

CurrentDbC.OpenRecordset(...) ... liefert als Ergebnis ein Recordset, das man im Prinzip ohne Umweg einer Variablen verwenden kann.
symbolisch: [Recordset aus CurrentDbC.OpenRecordset(..)].Fields(0)

Danke, sowas in der Art hatte ich auch vermutet (siehe #6)

Zitat:

Wenn es keinen Datensatz gibt, kann aber Recordset.Fields(0) nicht ausgewertet werden und es kommt zu einem Fehler.

Hmmm.... NULL = Fehler ????? -> s. Posting #5

__________________

Gruß Frank

- Win10 Pro (64bit) - MS Office 2010 (32bit)
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 08:38   #9
Josef P.
MOF Guru
MOF Guru
Standard

Zitat:

Hmmm.... NULL = Fehler ????? -> s. Posting #5

Nein, NULL führt zu keinem Fehler. Nur wenn kein DS vorhanden ist, kommt es zu einem Fehler.
z. B.:
Code:

 varID = CurrentDbC.OpenRecordset("SELECT id FROM tblLeer", dbOpenForwardOnly)(0)
oder
Code:

varID = CurrentDbC.OpenRecordset("SELECT max(id) FROM tblLeer group by ID", dbOpenForwardOnly)(0)
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 08:51   #10
ebs17
MOF Guru
MOF Guru
Standard

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

Ich scheitere schon daran, eine Tabelle ohne Felder anzulegen.

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"
..., wobei ID 100 in der Tabelle nicht vorhanden ist, ergibt LZF 3021 (Kein aktueller Datensatz).

__________________

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
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 09:13   #11
#_Columbo_#
Threadstarter Threadstarter
MOF User
MOF User
Standard

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)
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 09:22   #12
#_Columbo_#
Threadstarter Threadstarter
MOF User
MOF User
Standard

@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)

Asche über mein Haupt
Bei leeren Tabellen gibts also meist Fehlermeldungen bei dieser Version

__________________

Gruß Frank

- Win10 Pro (64bit) - MS Office 2010 (32bit)
#_Columbo_# ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 09:25   #13
Josef P.
MOF Guru
MOF Guru
Standard

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")
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.08.2009, 09:33   #14
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

Bei existierenden Tabellen MIT Datensätzen kann ich die Kurzvariante nehmen

Wenn es mit Sicherheit den gewünschten Datensatz laut Kriterium gibt. Wer kann das schon sagen?

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
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.