Access formulieren en lezen

Status
Niet open voor verdere reacties.

annetiti

Gebruiker
Lid geworden
6 aug 2007
Berichten
195
Dag

Ik heb een access-database(2010) gemaakt met verschillende(20-tal) formulieren.
Nu mogen een aantal personen enkel de inhoud in de formulieren zien maar niet wijzigen.

Maak ik een kopie van de database en wijzig ik
- alle eigenschappen van het formulier naar veld.locked = true

of is er een andere mogelijkheid?

Alvast bedankt voor hulp of tips
Anne
 
Hoi Anne,

Het kan een stuk simpeler als je de gebruikers laat inloggen in de database m.b.v. een inlogscherm. Daar hangt dan een tabel achter met gebruikersgroepen/rechten die je kan instellen. Ik gebruik dat zelf ook regelmatig om gebruikers bepaalde dingen wel of niet te laten doen.
 
Dag octafish

is dit een tabel met
naam gebruiker - rechten zoals lezen schrijven
moet je dan bij het open van het formulier nazien welke rechten de persoon heeft en de veldeigenschappen van het formulier programmeren?

dit is echt nieuw voor mij!

groeten Anne
 
Ik gebruik deze tabel (tMedewerkers) om de rechten vast te leggen:
MedewerkerID - Autonummering
inlognaam - Tekst
medewerker_naam - Tekst
rechten - Numeriek
Actief - Ja/Nee
WW_Datum - Datum/Tijd
Wachtwoord - Tekst (invoermasker: Wachtwoord)

Het veld Rechten is een keuzelijst met de waarden 1;"Beheerder";2;"Superuser";3;"Gebruiker";4;"Gast".
Ik doe eerlijk gezegd niet heel veel met 'losse' rechten, zoals een veld wel of niet mogen muteren; bij mij is het meer op formulierniveau. En ik gebruik de rechten om bepaalde tabbladen en knoppen wel of niet te mogen zien.

De code voor het inloggen zelf is nogal uitgebreid, dus die zal ik je hier niet helemaal voorschotelen. De essentie is redelijk simpel, maar daar heb je wel een hoop regels voor nodig :)
Code:
Private Sub Form_Current()
    strSQL = "SELECT [medewerkerID], [inlognaam], [Wachtwoord], [rechten], [Actief] FROM tMedewerkers " _
        & "WHERE [Inlognaam] = """ & Environ("USERNAME") & """"
    Set rst = CurrentDb.OpenRecordset(strSQL)
    With rst
        If .RecordCount = 1 Then
            strWW = !Wachtwoord
            iMed = !MedewerkerID
            TempVars.Add "varMedID", !MedewerkerID.Value
            TempVars.Add "varMedInlog", !inlognaam.Value
            TempVars.Add "varAccessLevel", !rechten.Value
            TempVars.Add "varActief", !Actief.Value
            TempVars("varWW").Value = !Wachtwoord.Value
            .Close
        Else
            MsgBox "U heeft geen geldige inlognaam." & vbLf & "Neem contact op met de beheerder", vbCritical
            Application.Quit
        End If
    End With

AdminInstellen:
    'Admin knop verbergen of tonen
    If TempVars("varAccessLevel").Value > 2 Then
        Me.cmdDisableBypassKey.Visible = False
    Else
        Me.cmdDisableBypassKey.Visible = True
    End If
End Sub

Code:
Private Sub knOK_Click()
    
    '   User has entered user_id and Password
     Call DisplayMenu(TempVars("varMedID").Value, TempVars("varWW").Value, Me)
End Sub

Code:
Function DisplayMenu(UserId As Variant, WW As String, frm As Form)
   
' at this stage the userId and access level has been checked
Dim FinishDate As Date, tmpDate As Date, PasswordPeriod As Date
Dim CheckPassword As String, strMsg As String
Dim strSQL As String, sFilter As String
Dim ValidUser As Integer, AccessLevel As Integer
Dim Actief As Boolean, PJK As Boolean
Dim rst As DAO.Recordset
Dim tmpVar As TempVar

    ValidUser = 2
    ' *****************************************************************************************************************
    ' validate user_id
    ' *****************************************************************************************************************
    strSQL = "SELECT [medewerkerID], [inlognaam], [medewerker_naam], [Wachtwoord], [rechten], [WW_Datum], " _
        & "[Actief] FROM tMedewerkers WHERE [medewerkerID] = " & UserId
    Set rst = CurrentDb.OpenRecordset(strSQL)
    With rst
        .MoveLast
        .MoveFirst
        If .RecordCount = 1 Then
            ValidUser = 2
            If .Fields("Wachtwoord") = WW Then
                AccessLevel = !rechten.Value
                Actief = !Actief.Value
                If IsNull(.Fields("[WW_Datum]")) Then
                    tmpDate = DateAdd("yyyy", -1, Date)
                Else
                    tmpDate = .Fields("[WW_Datum]").Value
                End If
                PasswordPeriod = tmpDate
            ElseIf IsNull(.Fields("Wachtwoord")) Or .Fields("Wachtwoord") = "welkom" Then
                ValidUser = 5
            Else
                If sUserID = sUserID_ori Then
                    iPW_Count = iPW_Count + 1
                Else
                    iPW_Count = 1
                End If
                ValidUser = 1
                AccessLevel = 3
            End If
        Else
            ValidUser = 0
        End If
        .Close
    End With

    ' *****************************************************************************************************************
    ' validate access_level
    ' *****************************************************************************************************************
    Select Case ValidUser
        Case 0, 1
                If iPW_Count < 3 Then
                    strMsg = "Geen toegang tot Database; " & vbCrLf _
                        & "Je hebt een verkeerd wachtwoord ingetypt." & vbCrLf _
                        & "Je hebt nog " & 3 - iPW_Count & " poging(en)."
                    MsgBox strMsg, vbInformation, "ONGELDIGE  INLOGPOGING"
                    Exit Function
                Else
                    DoCmd.Quit
                End If
        Case 2
            ' validate password expiry
            If PasswordPeriod < DateAdd("m", -3, Date) Or IsNull(PasswordPeriod) Then
                strMsg = "Je wachtwoord is verlopen. Je moet het wachtwoord eerst veranderen."
                MsgBox strMsg, vbInformation, "Verlopen wachtwoord"
                sFilter = "MedewerkerID= " & UserId
                frm.Visible = False
                DoCmd.OpenForm "f_change_password", acNormal, , , , acDialog, sFilter
                frm.Visible = True
            Else
                DoCmd.Close acForm, frm.Name
                '-----------------------------------------------------------------------------------------------------
                'Startformulier openen
                '-----------------------------------------------------------------------------------------------------
                DoCmd.OpenForm "Startformulier"
                If Not TempVars("varCheckTempVars").Value & "" = "" Then TempVars("varCheckTempVars").Value = False
            End If
        Case 5
            ' validate password expiry
                strMsg = "Je heeft nog geen wachtwoord ingevoerd. Je moet eerst een wachtwoord invoeren."
                MsgBox strMsg, vbInformation, "Geen wachtwoord"
                sFilter = "MedewerkerID= " & UserId
                frm.Visible = False
                DoCmd.OpenForm "f_change_password", acNormal, , , , acDialog, sFilter
                frm.Visible = True
        Case Else
            strMsg = "Geen toegang" & vbCrLf & "Neem contact op met de Administrator als het probleem blijft bestaan."
            MsgBox strMsg, vbInformation, "ONBEKENDE GEBRUIKER OF WACHTWOORD"
    End Select
    Exit Function
    
err_display_menu:
    MsgBox Err.Description

End Function

Alle codes staan op het inlogformulier, en bij het inloggen controleer ik dan op basis van de User Inlognaam (waarmee ze inloggen op de computer) of ze er in mogen of niet. Werkt als een tierelier; andere personen komen er niet in. Beheerders krijgen richten om een extra knop te zien (AdminInstellen:) en voor de rest wordt het wachtwoord gecontroleerd en als dat niet correct is, wordt een formulier geopend waarmee je dat kunt veranderen.
Niet compleet, maar geeft hopelijk wel een idee.
 
Dag Octafish

Heb je code nog niet volledig kunnen verwerken.
een beetje tijd tekort daar ik weer een ander probleem heb. Moet ik dit bericht al afsluiten?
gr anne
 
Als de moderator hem open laat staan, dan zou ik zeggen: gewoon open laten. Mocht je nog ergens tegen aan lopen, dan zie ik dat vanzelf wel en pakken we dat uiteraard voor je op.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan