Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Function für Wert aus Tabelle abfragen

Begonnen von Micharius, Juni 18, 2018, 08:18:12

⏪ vorheriges - nächstes ⏩

Micharius

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

MzKlMu

#1
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.
Gruß Klaus

PhilS

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 Function

Wenn 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!
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

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


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Micharius

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

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

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).
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access