AppUser-Klasse korrekt erstellen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    AppUser-Klasse korrekt erstellen

    Hallo zusammen.

    Ich bin grad dabei meiner Anwendung eine Überarbeitung zu verpassen. Beim Start meldet sich ein User an.
    Bisher hab ich das über ein Public Module gelöst

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Module UserAccess
    3. #Region "Properties"
    4. 'Benutzerbezogene Properties
    5. Public Property _UA_UserID As Integer
    6. Public Property _UA_UserName As String
    7. Public Property _UA_rwUser As BenutzerRow
    8. Public Property _UA_MitarbeiterFullname As String
    9. Public Property _UA_MitarbeiterID As Integer
    10. Public Property _UA_MitarbeiterFunktion As String
    11. Public Property _UA_rwMitarbeiter As MitarbeiterRow
    12. Public Property _UA_IsAdmin As Boolean
    13. Public Property _UA_IsZentrale As Boolean
    14. Public Property _UA_GesellschaftName As String
    15. Public Property _UA_GesellschaftID As Integer
    16. Public Property _UA_GesellschaftNr As Integer
    17. Public Property _UA_Auswertekennzeichen As String
    18. Public Property _UA_rwStandort As StandortRow
    19. Public Property _UA_StandortName As String
    20. Public Property _UA_standortID As Integer
    21. Public Property _UA_UsernameAndStandort As String
    22. Public Property _UA_CanShowGehalt As Boolean = False
    23. Public Property _UA_CanEditGehalt As Boolean = False
    24. Public Property _UA_CanShowBonus As Boolean = False
    25. Public Property _UA_CanEditBonus As Boolean = False
    26. 'Default-Einträge
    27. Public Property _DefVal_GesellschaftName As String = "<keine Angabe>"
    28. Public Property _DefVal_StandortName As String = "<keine Angabe>"
    29. Public Property _DefVal_FzgKennzeichen As String = "<KEINE ANGABE>"
    30. Public Property _DefVal_TourArt As String = "<keine Angabe>"
    31. Public Property _DefVal_TourNr As Integer = 0
    32. Public Property _DefVal_TourName As String = "<keine Angabe>"
    33. Public Property _DefVal_MitarbeiterName As String = "<keine Zuordnung>"
    34. Public Property _DefVal_Date As Date = Date.Parse("01.01.1900")
    35. Public Property _DefVal_TourGebiet As String = "<keine Angabe>"
    36. Public Property _DefVal_UserName As String = "<keine Angabe>"
    37. '
    38. Public Property _frmTourenplan_SetYear As Integer = 0
    39. Public Property _frmTourenplan_StandortID As Integer = 0
    40. #End Region 'Properties
    41. #Region "AccessSettings"
    42. ''' <summary> sorgt dafür, dass für jede MitarbeiterFunktion jede TreeRow angelegt wird. Ist die Freigabe im Tree False wird die DefaultRow gelöscht.</summary>
    43. Public Sub EnsureValidAccessDefaults()
    44. Dim rwAnsichtDefault = Dts.Ansicht.First(Function(x) x.Typ = "kein Zugriff")
    45. For Each rwMaFunc In Dts.MitarbeiterFunktion
    46. For Each rwTree In Dts.Tree
    47. If rwTree.Freigabe Then
    48. If Dts.AccessDefault.Where(Function(x) x.MitarbeiterFunktionRow Is rwMaFunc AndAlso x.TreeRow Is rwTree).Count = 0 Then 'noch nicht vorhanden
    49. Dts.AccessDefault.AddAccessDefaultRow(rwMaFunc, rwTree, False, False, False, False, False, False, rwAnsichtDefault, Date.Now, "automatische Neuanlage", _UA_UsernameAndStandort)
    50. End If
    51. Else 'freigabe wurde entfernt. wenn noch eine AccessDefault-Row dazu da ist, dann diese löschen
    52. Dim rw = Dts.AccessDefault.All.FirstOrDefault(Function(x) x.MitarbeiterFunktionRow Is rwMaFunc AndAlso x.TreeRow Is rwTree)
    53. If rw IsNot Nothing Then rw.Delete()
    54. End If
    55. Next
    56. Next
    57. End Sub
    58. Public Sub SyncAllUsers()
    59. Dim counter = 0
    60. For Each rwUser In Dts.Benutzer
    61. For Each rwTree In Dts.Tree
    62. If rwTree.Freigabe Then
    63. Dim defRow = Dts.AccessDefault.First(Function(x) x.MitarbeiterFunktionRow Is rwUser.MitarbeiterRow.MitarbeiterFunktionRow AndAlso x.TreeRow Is rwTree)
    64. If Dts.AccessSetting.Where(Function(x) x.BenutzerRow Is rwUser AndAlso x.TreeRow Is rwTree).Count = 0 Then
    65. If Not rwUser.Admin Then
    66. Dts.AccessSetting.AddAccessSettingRow(rwUser, rwTree, defRow.Zugriff, defRow.Neu, defRow.Bearbeiten, defRow.MultiEdit, defRow.FastEdit, defRow.Loeschen, defRow.AnsichtRow, defRow, Date.Now, "Migrierung", "Anwendung")
    67. Else
    68. Dts.AccessSetting.AddAccessSettingRow(rwUser, rwTree, True, True, True, True, True, True, Dts.Ansicht.First(Function(x) x.Typ = "Alles"), defRow, Date.Now, "Migrierung", "Anwendung")
    69. End If
    70. counter += 1
    71. End If
    72. End If
    73. Next
    74. Next
    75. msgInformation($"{counter} Berechtigungen wurden angelegt.")
    76. End Sub
    77. #Region "Rechteprüfung"
    78. ''' <summary> Gibt zurück, ob User neue Einträge erstellen darf </summary>
    79. Public Function hasCreateNewAccess(appMod As String) As Boolean
    80. Return Dts.AccessSetting.First(Function(x) x.BenutzerRow Is _UA_rwUser AndAlso x.TreeRow.Key = appMod).Neu
    81. End Function
    82. ''' <summary> Gibt zurück, ob User bearbeiten darf </summary>
    83. Public Function hasEditEntryAccess(appMod As String) As Boolean
    84. Return Dts.AccessSetting.First(Function(x) x.BenutzerRow Is _UA_rwUser AndAlso x.TreeRow.Key = appMod).Bearbeiten
    85. End Function
    86. ''' <summary> Gibt zurück, ob User Schnelländerung(MultiEdit) benutzen darf </summary>
    87. Public Function hasMultiEditAccess(appMod As String) As Boolean
    88. Return Dts.AccessSetting.First(Function(x) x.BenutzerRow Is _UA_rwUser AndAlso x.TreeRow.Key = appMod).MultiEdit
    89. End Function
    90. ''' <summary> Gibt zurück, ob User Schnellbearbeitung(FastEdit) benutzen darf </summary>
    91. Public Function hasFastEditAccess(appMod As String) As Boolean
    92. Return Dts.AccessSetting.First(Function(x) x.BenutzerRow Is _UA_rwUser AndAlso x.TreeRow.Key = appMod).FastEdit
    93. End Function
    94. ''' <summary> Gibt zurück, ob User zum Löschen berechtigt ist </summary>
    95. Public Function hasDeleteAccess(appMod As String) As Boolean
    96. Return Dts.AccessSetting.First(Function(x) x.BenutzerRow Is _UA_rwUser AndAlso x.TreeRow.Key = appMod).Loeschen
    97. End Function
    98. Public Function UserView(appMod As String) As String
    99. Return Dts.AccessSetting.First(Function(x) x.BenutzerRow Is _UA_rwUser AndAlso x.TreeRow.Key = appMod).AnsichtRow.Typ
    100. End Function
    101. ''' <summary> Gibt zurück, ob User "Admin" oder "Zentrale" ist </summary>
    102. Public Function isSuperUser() As Boolean
    103. If _UA_IsAdmin Then Return True
    104. If _UA_IsZentrale Then Return True
    105. Return False
    106. End Function
    107. #End Region 'Rechteprüfung
    108. #End Region 'AccessSettings
    109. #Region "Login"
    110. ''' <summary> Setzt nach erfolgreicher Anmeldung auf dlgLogin die ganzen Userdetails </summary>
    111. <Extension>
    112. Public Sub setUser(user As String)
    113. registerUserDetails(user)
    114. My.Settings.ActiveUser = _UA_UserID
    115. End Sub
    116. Private Sub registerUserDetails(user As String)
    117. _UA_rwUser = Dts.Benutzer.First(Function(x) x.Benutzername = user)
    118. _UA_UserID = _UA_rwUser.ID
    119. _UA_UserName = _UA_rwUser.Benutzername
    120. _UA_GesellschaftName = _UA_rwUser.expGesellschaft
    121. _UA_GesellschaftID = Dts.Gesellschaft.First(Function(x) x.Name = _UA_GesellschaftName).ID
    122. _UA_GesellschaftNr = convertInteger(Dts.Gesellschaft.First(Function(x) x.Name = _UA_GesellschaftName).Nr)
    123. _UA_MitarbeiterFullname = _UA_rwUser.expFullname
    124. _UA_MitarbeiterID = _UA_rwUser.MitarbeiterID
    125. _UA_MitarbeiterFunktion = _UA_rwUser.expFunktion
    126. _UA_IsAdmin = _UA_rwUser.Admin
    127. _UA_IsZentrale = _UA_rwUser.Zentrale
    128. _UA_Auswertekennzeichen = Dts.Gesellschaft.First(Function(x) x.Name = _UA_GesellschaftName).auswKZ
    129. _UA_rwMitarbeiter = Dts.Mitarbeiter.First(Function(x) x.ID = _UA_MitarbeiterID)
    130. _UA_CanShowGehalt = _UA_rwMitarbeiter.flagGehaltEinsehen
    131. _UA_CanEditGehalt = _UA_rwMitarbeiter.flagGehaltAnpassen
    132. _UA_CanShowBonus = _UA_rwMitarbeiter.flagSonderzahlungEinsehen
    133. _UA_CanEditBonus = _UA_rwMitarbeiter.flagSonderzahlungAnpassen
    134. _UA_rwStandort = _UA_rwMitarbeiter.StandortRow
    135. _UA_StandortName = _UA_rwStandort.Name
    136. _UA_standortID = _UA_rwStandort.ID
    137. _UA_UsernameAndStandort = $"{_UA_MitarbeiterFullname} | {_UA_StandortName}"
    138. End Sub
    139. Public Function userExist(username As String) As Boolean
    140. For Each rwUser In Dts.Benutzer
    141. If rwUser.Benutzername = username Then Return True
    142. Next
    143. Return False
    144. End Function
    145. #End Region 'Login
    146. End Module


    Irgendwie hab ich aber im Gefühl, dass zumindest die Properties in eine Klasse gehören. In etwa so:

    VB.NET-Quellcode

    1. Public Class AppUser
    2. Property UserName As String
    3. Public Sub New(rwUser As BenutzerRow)
    4. RegisterUserDetails(rwUser)
    5. End Sub
    6. Private Sub RegisterUserDetails(rwUser As BenutzerRow)
    7. Me.UserName = rwUser.Benutzername
    8. End Sub
    9. End Class


    Dann könnte ich doch sicher beim Anwendungsstart nach erfolgreicher Anmeldung einen New AppUser und dessen Properties Anwendungsweit nutzen oder
    gibt's da was sinnvolleres?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ja, ein Modul.
    Klassen braucht man, wenn man mehrere Objekte derselben Art braucht, die in irgendeiner Form sich im Status unterscheiden.
    Also wenn du mehrere User hättest, und die hätten verschiedene Namen.
    Wenns nur einen User geben kann, dann nimmt man in c# eine static Class, und in vb.net ein Modul.

    Möglicherweise ist dir die vb.net-Unart nicht recht, dass alle Modul-Properties Solutionweit in jedem Code direkt zugreifbar sind.
    Dann kannst du das Modul in einen Namespace tun, zB:

    VB.NET-Quellcode

    1. Public Namespace AppUser
    2. Public Module UserAccess
    3. Public Property _UA_UserID As Integer
    4. Public Property _UA_UserName As String
    5. Public Property _UA_rwUser As BenutzerRow
    6. Public Property _UA_MitarbeiterFullname As String
    7. Public Property _UA_MitarbeiterID As Integer
    8. Public Property _UA_MitarbeiterFunktion As String
    9. Public Property _UA_rwMitarbeiter As MitarbeiterRow
    10. Public Property _UA_IsAdmin As Boolean
    11. Public Property _UA_IsZentrale As Boolean
    12. '...
    13. End Module
    14. End Namespace
    Dann geht der Zugriff

    VB.NET-Quellcode

    1. AppUser.RegisterUserDetails(rwUser)
    Übrigens bezweifel ich, dass wirklich so viele Properties in deim UserModul nötig sind.
    Eine einzige Property vom Typ BenutzerRow dürfte doch schon eine ganze Menge abdecken oder?

    ErfinderDesRades schrieb:

    Eine einzige Property vom Typ BenutzerRow dürfte doch schon eine ganze Menge abdecken oder?

    Das ist korrekt - aber ich will ja nicht AppUser.UserRow.MitarbeiterRow.Standort oder sowas tippen müssen, das sollte schon als Property da sein.
    Ansonsten, ob das von überall direkt aufrufbar ist stört mich nicht - find ich sogar nützlich. Dachte nur es wäre sinniger da eine Klasse zu basteln - aber hast recht,
    es kann ja pro Anwendungsinstanz nur ein User angemeldet sein. Also merk' ich mir: Klassen für mehrere Objekte, die sich ggf. unterscheiden.

    EDIT: @ErfinderDesRades Also sowas hier?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Namespace User
    3. Public Module User
    4. #Region "UserProperties"
    5. 'User
    6. Public Property UserRow As BenutzerRow
    7. Public Property UserID As Integer
    8. Public Property UserName As String
    9. Public Property UserIsAdmin As Boolean
    10. Public Property UserInfo As String 'UserName | StandortName
    11. 'Gesellschaft
    12. Public Property Gesellschaft As String
    13. Public Property GesellschaftID As Integer
    14. Public Property GesellschaftNr As String
    15. Public Property GesellschaftAuswKz As String
    16. 'Standort
    17. Public Property StandortRow As StandortRow
    18. Public Property StandortID As Integer
    19. Public Property StandortName As String
    20. 'Mitarbeiter
    21. Public Property MitarbeiterFullname As String
    22. Public Property MitarbeiterID As Integer
    23. Public Property MitarbeiterFunktion As String
    24. #End Region 'UserProperties
    25. #Region "Login"
    26. ''' <summary>Setzt nach erfolgreicher Anmeldung auf dlgLogin die Userdetails</summary>
    27. <Extension>
    28. Public Sub SetUser(BenutzerName As String)
    29. SetUserProperties(BenutzerName)
    30. 'TODO: nötig? My.Settings.ActiveUser = _UA_UserID
    31. End Sub
    32. Private Sub SetUserProperties(BenutzerName As String)
    33. 'User
    34. UserRow = Dts.Benutzer.First(Function(x) x.Benutzername = BenutzerName)
    35. UserID = UserRow.ID
    36. UserName = UserRow.Benutzername
    37. UserIsAdmin = UserRow.Admin
    38. UserInfo = $"{UserName} | {UserRow.MitarbeiterRow.StandortRow.Name}"
    39. 'Gesellschaft
    40. Dim rwGesellschaft = UserRow.MitarbeiterRow.StandortRow.GesellschaftRow
    41. Gesellschaft = rwGesellschaft.Name
    42. GesellschaftID = rwGesellschaft.ID
    43. GesellschaftNr = rwGesellschaft.Nr
    44. GesellschaftAuswKz = rwGesellschaft.AuswerteKennzeichen
    45. 'Standort
    46. StandortRow = UserRow.MitarbeiterRow.StandortRow
    47. StandortID = StandortRow.ID
    48. StandortName = StandortRow.Name
    49. 'Mitarbeiter
    50. Dim rwMitarbeiter = UserRow.MitarbeiterRow
    51. MitarbeiterFullname = rwMitarbeiter.extMitarbeiterFullname
    52. MitarbeiterID = rwMitarbeiter.ID
    53. MitarbeiterFunktion = Dts.MitarbeiterFunktion.First(Function(x) x.MitarbeiterRow Is rwMitarbeiter AndAlso x.Aktiv).FunktionRow.Bezeichnung
    54. 'TODO: Wird gebraucht? _UA_IsZentrale = _UA_rwUser.Zentrale
    55. End Sub
    56. ''' <summary>Gibt an, ob der Benutzername vorhanden ist.</summary>
    57. Public Function Exist(username As String) As Boolean
    58. Return Dts.Benutzer.Any(Function(x) x.Benutzername = username)
    59. End Function
    60. #End Region 'Login
    61. #Region "UserBerechtigungen"
    62. ''' <summary>Gibt an, ob der User zum Einsehen von Gehältern berechtigt ist</summary>
    63. Public Function MayShowGehalt() As Boolean
    64. Return Dts.MitarbeiterFlag.First(Function(x) x.MitarbeiterRow Is UserRow.MitarbeiterRow).flagGehaltEinsehen
    65. End Function
    66. ''' <summary>Gibt an, ob der User zum Bearbeiten von Gehältern berechtigt ist</summary>
    67. Public Function MayEditGehalt() As Boolean
    68. Return Dts.MitarbeiterFlag.First(Function(x) x.MitarbeiterRow Is UserRow.MitarbeiterRow).flagGehaltAnpassen
    69. End Function
    70. ''' <summary>Gibt zurück, ob User neue Einträge erstellen darf</summary>
    71. Public Function MayCreateNew(appMod As String) As Boolean
    72. Return Dts.AppAccess.First(Function(x) x.BenutzerRow Is UserRow AndAlso x.AppAccessDefaultRow.TreeRow.Key = appMod).Neu
    73. End Function
    74. ''' <summary>Gibt zurück, ob User bearbeiten darf</summary>
    75. Public Function MayEdit(appMod As String) As Boolean
    76. Return Dts.AppAccess.First(Function(x) x.BenutzerRow Is UserRow AndAlso x.AppAccessDefaultRow.TreeRow.Key = appMod).Bearbeiten
    77. End Function
    78. ''' <summary>Gibt zurück, ob User Schnelländerung(MultiEdit) benutzen darf</summary>
    79. Public Function MayMultiEdit(appMod As String) As Boolean
    80. Return Dts.AppAccess.First(Function(x) x.BenutzerRow Is UserRow AndAlso x.AppAccessDefaultRow.TreeRow.Key = appMod).SchnellAenderung
    81. End Function
    82. ''' <summary>Gibt zurück, ob User Schnellbearbeitung(FastEdit) benutzen darf</summary>
    83. Public Function MayFastEdit(appMod As String) As Boolean
    84. Return Dts.AppAccess.First(Function(x) x.BenutzerRow Is UserRow AndAlso x.AppAccessDefaultRow.TreeRow.Key = appMod).SchnellBearbeitung
    85. End Function
    86. ''' <summary>Gibt zurück, ob User zum Löschen berechtigt ist</summary>
    87. Public Function MayDelete(appMod As String) As Boolean
    88. Return Dts.AppAccess.First(Function(x) x.BenutzerRow Is UserRow AndAlso x.AppAccessDefaultRow.TreeRow.Key = appMod).Loeschen
    89. End Function
    90. ''' <summary>Gibt die Ansichtseinstellung des Users für appMod zurück</summary>
    91. Public Function View(appMod As String) As String
    92. Return Dts.AppAccess.First(Function(x) x.BenutzerRow Is UserRow AndAlso x.AppAccessDefaultRow.TreeRow.Key = appMod).AppAnsichtRow.Bezeichnung
    93. End Function
    94. 'TODO: unnötig?
    95. '''' <summary> Gibt zurück, ob User "Admin" oder "Zentrale" ist </summary>
    96. 'Public Function isSuperUser() As Boolean
    97. ' If _UA_IsAdmin Then Return True
    98. ' If _UA_IsZentrale Then Return True
    99. ' Return False
    100. 'End Function
    101. #End Region 'UserBerechtigungen
    102. #Region "UserAccessSetting"
    103. ''' <summary>Sorgt dafür, dass für jede MitarbeiterFunktion jede aktive TreeRow angelegt wird. Ist die Tree Row Aktiv=False, wird die DefaultRow gelöscht.</summary>
    104. Public Sub EnsureValidAccessDefaults()
    105. Dim rwAnsichtDefault = Dts.AppAnsicht.First(Function(x) x.Bezeichnung = "kein Zugriff")
    106. For Each rwFunktion In Dts.Funktion.Where(Function(x) x.Aktiv)
    107. For Each rwTree In Dts.Tree
    108. If rwTree.Aktiv Then
    109. If Dts.AppAccessDefault.Where(Function(x) x.FunktionRow Is rwFunktion AndAlso x.TreeRow Is rwTree).Count = 0 Then 'noch nicht vorhanden
    110. Dts.AppAccessDefault.AddAppAccessDefaultRow(rwFunktion, rwTree, False, False, False, False, False, False, rwAnsichtDefault)
    111. End If
    112. Else 'freigabe wurde entfernt. wenn noch eine AccessDefault-Row dazu da ist, dann diese löschen
    113. Dim rw = Dts.AppAccessDefault.All.FirstOrDefault(Function(x) x.FunktionRow Is rwFunktion AndAlso x.TreeRow Is rwTree)
    114. If rw IsNot Nothing Then rw.Delete()
    115. End If
    116. Next
    117. Next
    118. End Sub
    119. ''' <summary>Fügt Usern ohne Berechtigungen die Standardberechtigungen hinzu</summary>
    120. Public Sub SyncAccessDefaultsWithAllUsers()
    121. Dim counter = 0
    122. For Each rwUser In Dts.Benutzer
    123. For Each rwTree In Dts.Tree
    124. If rwTree.Aktiv Then
    125. Dim defRow = Dts.AppAccessDefault.First(Function(x) x.FunktionRow Is Dts.MitarbeiterFunktion.First(Function(y) y.MitarbeiterRow Is rwUser.MitarbeiterRow AndAlso y.Aktiv).FunktionRow AndAlso x.TreeRow Is rwTree)
    126. If Dts.AppAccess.Where(Function(x) x.BenutzerRow Is rwUser AndAlso x.AppAccessDefaultRow.TreeRow Is rwTree).Count = 0 Then
    127. If Not rwUser.Admin Then
    128. Dts.AppAccess.AddAppAccessRow(rwUser, defRow.Neu, defRow.Bearbeiten, defRow.SchnellAenderung, defRow.SchnellBearbeitung, defRow.Loeschen, defRow.Zugriff, defRow.AppAnsichtRow, defRow)
    129. Else
    130. Dts.AppAccess.AddAppAccessRow(rwUser, True, True, True, True, True, defRow.TreeRow.Aktiv, Dts.AppAnsicht.First(Function(x) x.Bezeichnung = "Alles"), defRow)
    131. End If
    132. counter += 1
    133. End If
    134. End If
    135. Next
    136. Next
    137. msgInformation($"{counter} Berechtigungen wurden angelegt.")
    138. End Sub
    139. #End Region 'UserAccessSetting
    140. End Module
    141. End Namespace
    142. Namespace AppDefaults
    143. Public Module AppDefaults
    144. Public Property Gesellschaftname As String = "<keine Angabe>"
    145. Public Property Standortname As String = "<keine Angabe>"
    146. Public Property FahrzeugKennzeichen As String = "<KEINE ANGABE>"
    147. Public Property TourArt As String = "<keine Angabe>"
    148. Public Property TourNr As Integer = 0
    149. Public Property TourName As String = "<keine Angabe>"
    150. Public Property TourGebiet As String = "<keine Angabe>"
    151. Public Property Mitarbeitername As String = "<keine Angabe>"
    152. Public Property Datum As Date = Date.Parse("01.01.1900")
    153. Public Property UserName As String = "<keine Angabe>"
    154. End Module
    155. End Namespace
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    ja, so unifähr. Man könnte ReadonlyProperties basteln:

    VB.NET-Quellcode

    1. Public Property UserRow As BenutzerRow
    2. Public ReadOnly Property UserID As Integer
    3. Get
    4. Return UserRow.ID
    5. End Get
    6. End Property
    7. '...
    Dann ists Redundanz-Frei.
    Aber elend viel vb-blöd-text.

    Sowas geht aber wirklcih besser:

    VB.NET-Quellcode

    1. Public Function MayShowGehalt() As Boolean
    2. Return Dts.MitarbeiterFlag.First(Function(x) x.MitarbeiterRow Is UserRow.MitarbeiterRow).flagGehaltEinsehen
    3. End Function
    4. ->
    5. Public Function MayShowGehalt() As Boolean
    6. Return UserRow.flagGehaltEinsehen
    7. End Function

    ErfinderDesRades schrieb:

    Man könnte ReadonlyProperties basteln:

    Ne, das macht's mir zu unübersichtlich.

    ErfinderDesRades schrieb:

    Sowas geht aber wirklcih besser:

    Nö, geht ja nicht weil MitarbeiterFlag eine extra Table ist, die mit Benutzer nix zu tun hat. ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Nö, hab die flags in einer separaten Tabelle untergebracht. Diese ist untergeordnet Mitarbeiter.
    Mein Code ist also korrekt ;) - wobei, ggf. kann ich mir eine Tabelle sparen wenn ich das an die Mitarbeiter-Table dranhänge. Muss mal schauen
    die Planung für das neue DataSet ist noch nicht endgültig.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: