Globale Funktion mit zugriff auf Tabelle im Modul

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Globale Funktion mit zugriff auf Tabelle im Modul

    Tach auch,

    Sinn dieser Funktion ist es, unabhängig vom gerade verwendeten Formular jeweils den Anwendername aus einer Tabelle auszulesen. Eben eine Globale Funktion.

    nachfolgender Code funktioniert einwandfrei, jedoch nur für das Formular FrmHaupt
    Jedoch benötige ich die Funktion für jedes Formular. Wie geht das?

    VB.NET-Quellcode

    1. Module UserLogin
    2. Public Function FncVertreterProjekt(intVertreterNr As Integer) As String
    3. FncVertreterProjekt = "unbekannt"
    4. Dim i As Integer
    5. Dim intNr As Integer = 0
    6. Dim intAnzDS As Integer = FrmHaupt.PVDataSet.anwenderliste.Rows.Count
    7. For i = 0 To intAnzDS - 1
    8. intNr = FrmHaupt.PVDataSet.anwenderliste.Rows(i).Field(Of Integer)("VertreterNr")
    9. If intVertreterNr = intNr Then
    10. If String.IsNullOrEmpty(FrmHaupt.PVDataSet.anwenderliste.Rows(i).Field(Of String)("Vorname")) = False Then
    11. FncVertreterProjekt = FrmHaupt.PVDataSet.anwenderliste.Rows(i).Field(Of String)("Nachname") & ", " & FrmHaupt.PVDataSet.anwenderliste.Rows(i).Field(Of String)("Vorname")
    12. Else
    13. FncVertreterProjekt = FrmHaupt.PVDataSet.anwenderliste.Rows(i).Field(Of String)("Nachname")
    14. End If
    15. End If
    16. Next
    17. End Function
    18. End Module

    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lupusverlach“ ()

    @Lupusverlach Arbeite mit Interfaces und übergib die Form bzw. das implementierte Interface als Parameter an diese Funktion.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Thread-Titel lautet: "Globale Funktion mit zugriff auf Tabelle im Modul".
    Wenn du mit 'Tabelle' eine DataTable meinst, dann liegt mein Lösungsvorschlag ganz nahebei:
    Arbeite mit einer globalen Dataset-Instanz.
    Dann kann auch eine globale Funktion im Modul auf deren Tabellen zugreifen.
    Das Problem ist der VS-Form-Designer. Der kann keine Bindings einrichten an ein globales Dataset, sondern jedes Form erhält sein eigenes Dataset .
    Da ich sehr viel mit Databinding arbeite habich mir eine (komplizierte) Methode geschrieben, die ein datengebundens Form umstellt von ihrem eigenem Dataset auf ein Globales, indem sie die DataSources aller ans lokale Dataset gebundenen BindingSources aufs Globale umstellt.
    Wenn wolle gugge Form-übergreifemdes Databinding
    Sehe gerade, da fehlt von mir noch ein wenig Text.

    RodFromGermany schrieb:

    @Lupusverlach Arbeite mit Interfaces und übergib die Form bzw. das implementierte Interface als Parameter an diese Funktion.

    Danke Dir, hätte nun nicht gedacht das es mal wieder (für mich als alter VBA Accessler) so ein Umstand gibt :(
    Mit Interfaces habe ich noch nie was gemacht und sozusagen damit vorerst Null Plan.

    ErfinderDesRades schrieb:

    Arbeite mit einer globalen Dataset-Instanz.
    Dann kann auch eine globale Funktion im Modul auf deren Tabellen zugreifen.
    Das Problem ist der VS-Form-Designer. Der kann keine Bindings einrichten an ein globales Dataset, sondern jedes Form erhält sein eigenes Dataset .
    Da ich sehr viel mit Databinding arbeite habich mir eine (komplizierte) Methode geschrieben, die ein datengebundens Form umstellt von ihrem eigenem Dataset auf ein Globales, indem sie die DataSources aller ans lokale Dataset gebundenen BindingSources aufs Globale umstellt.
    Wenn wolle gugge Form-übergreifemdes Databinding


    Irgendwie habe ich genau das befürchtet jedes Form erhält sein eigenes Dataset

    Fakt ist jedoch, die Funktion wird zu 100% von Formularen aufgerufen, in denen es ein Dataset, bzw. die Tabelle AnwenderListe verwendet wird.
    Mein Gedanke war es die Funktion aufzurufen z.B. mit

    VB.NET-Quellcode

    1. Public Function FncVertreterProjekt(intVertreterNr As Integer, strFormName As String) As String

    Und dann hier das FrmHaupt. durch die Variable (strFormName) zu ersetzen.

    VB.NET-Quellcode

    1. [....]
    2. FrmHaupt.PVDataSet.anwenderliste.Rows(2).Field(Of String)("Nachname")
    3. [.....]


    Nachtrag am 29.01.2022 um 00:18 Uhr
    Hier hätte noch das stehen sollen: Jedoch befürchte ich das auch das nicht gehen wird, oder etwa doch? Wäre es dann nicht das einfachste?
    Ich hatte das erst mit einen DataReader gelöst. Jedoch dachte ich halt, ein Dataset ist ja vorhanden, also warum nicht den kurzen Weg darüber gehen.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lupusverlach“ ()

    Vererbung und Implementierung sind zwei der wichtigsten Techniken im Umgang mit objektorientierten Sprachen und viel einfacher zu handhaben als man glaubt. Wenn vb.NET dann bitte auch abstrakte Basisklassen und Interfaces. Wie auch immer, da du bereits ein Module hast, können wir auch dabei bleiben. Ein Interface ist hier nicht zwangsweise nötig. Der Vollständigkeit halber habe ich hier die Alternative, auch wenn ich der Meinung bin, dass du dir Interfaces dringend anschauen solltest.

    Prinzipiell gehe ich davon aus, dass die Tabelle auf jeder Form mit den gleichen Daten gefüllt ist. Also wieso die Daten aus dem DataSet nicht beim Öffnen des Programms in das Modul laden, beispielsweise als Dictionary.

    Dein Module sieht dann wie folgt aus:

    VB.NET-Quellcode

    1. Public Property UserList As Dictionary(Of Integer, String)
    2. Public Shared Function GetUser(ID As Integer) As String
    3. Return UserList(ID)
    4. End Function


    Und UserList füllst du in der ersten Maske, die du aufrufst, mit Daten (In meinem Beispiel frmLogin):

    VB.NET-Quellcode

    1. Private Sub ReadUsers()
    2. UserList = New Dictionary(Of Integer, String)
    3. For Each Row In frmLogin.PVDataSet.anwenderliste.Rows
    4. If Not String.IsNullOrWhiteSpace(Row.Field(Of String)("Vorname")) Then
    5. UserList.Add(Row.Field(Of Integer)("VertreterNr"), String.Concat(Row.Field(Of String)("Nachname"), ", ", Row.Field(Of String)("Vorname")))
    6. End If
    7. Next
    8. End Sub


    PS: Der gesamte Code wurde nicht getestet und ist auch nicht programmiert worden. Ich sitze gerade im Zug und habe kein VS auf dem Notebook.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Yanbel“ ()