Hallo zusammen
Meine Idee ist, einen Wert ParIDRef aus einer Tabelle tblPartner abzufragen innerhalb einer Sub, welche mir dann den Wert tblParTimelogCustomerID zurückgeben soll. ParIDRef verweist immer auf genau einen Datensatz in der Tabelle tblPartner.
Folgendes habe ich probiert
Public Function p_f_TimelogCustomerIDFeedback(lgnParIDRef As Long) As String
Dim rcsP As DAO.Recordset
Dim lngParTimeCustomerID As Long
Set rcsP = CurrentDb.OpenRecordset("SELECT ParTimelogCustomerID " & _
"FROM tblPartner " & _
"WHERE ParID=" & lgnParIDRef, dbOpenDynaset)
p_f_TimelogCustomerIDFeedback = lngParTimeCustomerID
End Function
Scheinbar ist kein Fehler im Code, trotzdem erhalte ich keinen Wert retour bei einem Aufruf. Was habe ich falsch gemacht bzw. falsch angedacht?
Über eure Tipps würde ich mich freuen.
Herzliche Grüsse
Micharius
Hallo,
so geht das gar nicht.
Eher einfach so:
Public Function p_f_TimelogCustomerIDFeedback(lgnParIDRef As Long) As String
p_f_TimelogCustomerIDFeedback = Dlookup("ParTimelogCustomerID","tblPartner","ParID=" & lgnParIDRef)
End Function
Wobei ich hie die Funktion für überflüssig halte, denn das kann man direkt in den Steuerelelementinhalt schreiben.
Außerdem kann man eine Abfrage mit beiden Tabellen verwenden, dann braucht es gar nichts.
Zitat von: Micharius am Juni 18, 2018, 08:18:12Scheinbar ist kein Fehler im Code, trotzdem erhalte ich keinen Wert retour bei einem Aufruf. Was habe ich falsch gemacht bzw. falsch angedacht?
Du hast einen elementaren Teil im Code vergessen. Du öffnest ein Recordset, das wahrscheinlich auch den korrekten Datensatz enthält, aber davon allein kommt der gesuchte Wert noch nicht in deine Variable
lngParTimeCustomerID. Es fehlt die entsprechende Zuweisung.
Public Function p_f_TimelogCustomerIDFeedback(lgnParIDRef As Long) As String
Dim rcsP As DAO.Recordset
Dim lngParTimeCustomerID As Long
Set rcsP = CurrentDb.OpenRecordset("SELECT ParTimelogCustomerID " & _
"FROM tblPartner " & _
"WHERE ParID=" & lgnParIDRef, dbOpenDynaset)
If Not rcsP.Eof Then
lngParTimeCustomerID = rcsP.Fields("ParTimelogCustomerID").Value
End If
p_f_TimelogCustomerIDFeedback = lngParTimeCustomerID
rcsP.Close
Set rcsP = Nothing
End FunctionWenn du ein Recordset öffnest, solltest du das Schließen desselben nicht vergessen.
Je nach Kontext solltest du auch die Anmerkung von Klaus bzgl. der Abfrage beachten!
Hallo,
und das Ganze geht viel kürzer, wenn man statt der Dlookup()-Funktion einen Recordset verwenden möchte:
Public Function p_f_TimelogCustomerIDFeedback(lgnParIDRef As Long)
p_f_TimelogCustomerIDFeedback = CurrentDb.OpenRecordset("SELECT ParTimelogCustomerID " & _
"FROM tblPartner WHERE ParID=" & lgnParIDRef, dbOpenSnapshot)(0)
End Function
Hallo Franz
Vielen Dank! Das geht tatsächlich viel kürzer. Ich habe ehrlich gesagt einen Code von einem anderen Use Case kopiert und angepasst. Tatsächlich würde dieser sogar funktionieren, nur habe ich Schaf im Direktbereich die Funktion falsch geprüft. Aber so ist natürlich noch viel besser.
Beste Grüsse
Micharius
Zitat von: DF6GL am Juni 18, 2018, 09:24:34und das Ganze geht viel kürzer, wenn man statt der Dlookup()-Funktion einen Recordset verwenden möchte:
Funktioniert natürlich, aber neben der etwas schlechteren Lesbarkeit stört mich das fehlende
.Close für das Recordset doch sehr.
Hallo,
naja, nachdem hier keine Recordset-Variable verwendet wird, ist ein .Close auch nicht anwendbar. Ich denke mal, dass VBA bei End Function selbständig das Recordset "zerstört" und entspr. aufräumt, zumal der Scope auf das Recordset nur innerhalb der Funktion liegt (nicht als "Public" deklariert ist).
Ansonsten stehe ich voll dazu, mit .Close einen mit einer Variablen referenzierten Recordset auch wieder zu schließen und die Referenz zu "zerstören" (Set Rs = Nothing).