Velden verbergen op andere formulieren.

Status
Niet open voor verdere reacties.

phoenix83

Gebruiker
Lid geworden
12 aug 2009
Berichten
9
Hallo,

Ik ben net nieuw op dit forum, en sinds een tijdje aan het stoeien met MS access.
Nu stuit ik op een klein probleempje, maar weet zo even niet hoe dit op te lossen.
Ik heb een login scherm gemaakt voor mijn database.
Als ik inlog wordt er gechecked of de gebruiker een administrator is of niet d.m.v. een checkbox in de tabel.
Nu is het de bedoeling dat als de gebruiker administrator is, dat er bepaalde velden op bepaalde formulieren worden weergegeven,
is de gebruiker geen administrator, moeten de velden/knoppen worden verborgen.

Nu heb ik het volgende stukje code daarvoor gebruikt :

Code:
    If DLookup("[Administrator]", "Monteur", "[Administrator] = True") Then
    DoCmd.OpenForm "frmMonteurs", acNormal
    Forms!frmMonteurs!wachtwoord.Visible = True
    DoCmd.Save acForm, "frmMonteurs"
    DoCmd.Close acForm, "frmMonteurs", acSaveYes
    Else
    DoCmd.OpenForm "frmMonteurs", acNormal
    Forms!frmMonteurs!wachtwoord.Visible = False
    DoCmd.Save acForm, "frmMonteurs"
    DoCmd.Close acForm, "frmMonteurs", acSaveYes
    End If

Of ik nu het stukje DoCmd.OpenForm "frmMonteurs", acNormal aanpas naar acDesign of acLayout, maakt helemaal niets uit.
De velden worden niet verborgen. Misschien dat er een andere manier is om dit voor elkaar te krijgen, het liefste wil ik niet allemaal apparte formulieren gaan maken.


M.v.g. Chris
 
Laatst bewerkt:
Tot nu toe nog niemand die een idee heeft ?

Ik heb voor het gemak even het hele stukje code nu inbegrepen, misschien dat het dan een stukje duidelijker wordt.
Vanuit het login scherm, zodra de knop wordt aangeklikt, moeten de velden worden verborgen of worden weergegeven, afhankelijk van het vinkje bij administrator in de tabel monteurs.

Code:
 Option Compare Database
Private intLogonAttempts As Integer

Private Sub Form_Open(Cancel As Integer)
'On open set focus to combo box
Me.gebruikersnaam.SetFocus
End Sub

Private Sub gebruikersnaam_AfterUpdate()
'After selecting user name set focus to password field
Me.wachtwoord.SetFocus
End Sub
Private Sub Inloggen_Click()
'Check to see if data is entered into the UserName combo box

    If IsNull(Me.gebruikersnaam) Or Me.gebruikersnaam = "" Then
            MsgBox "You must enter a User Name.", vbOKOnly, "Required Data"
            Me.gebruikersnaam.SetFocus
        Exit Sub
    End If

'Check to see if data is entered into the password box

    If IsNull(Me.wachtwoord) Or Me.wachtwoord = "" Then
            MsgBox "You must enter a Password.", vbOKOnly, "Required Data"
            Me.wachtwoord.SetFocus
        Exit Sub
    End If

'Check value of password in tblEmployees to see if this matches value chosen in combo box

    If Me.wachtwoord.Value = DLookup("wachtwoord", "Monteur", "[MonteurID]=" & Me.gebruikersnaam.Value) Then

        myMonteurID = Me.gebruikersnaam.Value

If DLookup("[Administrator]", "Monteur", "[Administrator] = True") Then
    DoCmd.OpenForm "frmMonteurs", acDesign
    Forms!frmMonteurs!wachtwoord.Visible = True
    DoCmd.Save acForm, "frmMonteurs"
    DoCmd.Close acForm, "frmMonteurs", acSaveYes
    Else
    DoCmd.OpenForm "frmMonteurs", acDesign
    Forms!frmMonteurs!wachtwoord.Visible = False
    DoCmd.Save acForm, "frmMonteurs"
    DoCmd.Close acForm, "frmMonteurs", acSaveYes
    End If
'Close logon form and open splash screen
        DoCmd.Close acForm, "Login", acSaveNo
        DoCmd.OpenForm "Hoofdmenu"

        Else
        MsgBox "Password Invalid.  Please Try Again", vbOKOnly, "Invalid Entry!"
        Me.wachtwoord.SetFocus
    End If
    
'If User Enters incorrect password 3 times database will shutdown
    
    intLogonAttempts = intLogonAttempts + 1
    If intLogonAttempts > 3 Then
        MsgBox "You do not have access to this database.  Please contact your system administrator.", vbCritical, "Restricted Access!"
        Application.Quit
    End If
    
End Sub


m.v.g. Chris
 
Je denkwijze is verkeerd. Om te beginnen: als je het design van een formulier met VBA wilt veranderen, moet je het formulier openen met de acDesign parameter, niet acNormal. Maar waarom zou je? De status van het veld kun je heel simpel veranderen bij het openen van het formulier. Dáár controleer je de status van de gebruiker, en bepaal je hoe het formulier opent, met welke objecten zichtbaar en welke niet.
Gelukkig voor jou is uitgerekend dít onderwerp behandeld in de Access cursus in de laatste nieuwsbrief. Dus alles wat je nodig hebt, staat daar in :) . Met deze vraag geef je dus onbedoeld ook aan dat je die nog niet leest ;).
 
Bekijk bijlage Autogarage 18-06-2014.rar
Bedankt voor de reactie.
Ik heb die tutorial even zitten doorlezen, maar ik kom er even geen wijs uit hoe dit toe te passen in mijn eigen database.
Het punt dat ik de GEKOZEN userid moet laten terugkomen in de formulieren, snap ik niet helemaal.
Ik heb de database even toegevoegd bij de post, ik snap gewoon niet hoe ik die MonteurID als Tempvar moet zetten.

m.v.g. Chris
 
Laatst bewerkt:
Jij gebruikt, als ik je vraag goed lees, dezelfde constructie
Ik heb een login scherm gemaakt voor mijn database.
Als ik inlog wordt er gechecked of de gebruiker een administrator is of niet d.m.v. een checkbox in de tabel.
Dat doet mijn voorbeeldje ook.
 
Ja dat klopt, ik heb in mijn vorige post even het bestand toegevoegd, zoals ik al aangaf, ik krijg het niet voor elkaar om die userID in de Tempvar te zetten, zodat dat allemaal aan elkaar gekoppeld wordt. Het wordt me toch even te complex geloof ik :p
Ik ben nog niet zo heel lang bezig met access, maar dit is een uit de hand gelopen school project aan het worden zo :d
Maar goed, wel een leuke bezigheid om de avond uurtjes mee te vullen :P

M.v.g. Chris
 
Ok, ik ben weer even aan het stoeien geweest met de "tutorial" in de nieuwsbrief.
Zoals ik het nu een beetje heb weten uit te vogelen moet ik dus een nieuwe module toevoegen in de database waar het volgende in komt te staan :

Code:
Public sMonteurID_ori As String
-------------------------------------------------------------------------------
Fucntion DisplayMenu (UserId As String)
Dim strSQL As String
Dim CheckUser As Integer
'Dim ValidUser As Integer
Dim AccessLevel As Integer

' ******************************************************************
' Validate user_id
' ******************************************************************

strSQL = "SELECT [MonteurID], [wachtwoord], [Administrator] "_
	& "FROM monteurs " _

With CurrentDb.OpenRecordset (strSQL)
	If .RecordCount = 1 Then
		If TempVars.Count > 0 Then TempVars.RemoveAll
		TempVars.Add "sMonteurID", .Fields(0).Value
		TempVars.Add "sWachtwoord", .Fields(1).Value
		TempVars.Add "Accesslevel", .Fields(2).Value
		sMonteurID_ori = sMonteurID
		sMonteurID = .Fields(0)
		'ValidUser = 2
'Else ValidUser = 0
	End If
	.Close
End With

En in de formulieren waar ik rechten wil toepassen komt dat het volgende erbij te staan in de Form_Load :
Code:
 Private Sub Form_Load()
'Validuser = 2
strSQL = "SELECT [administrator],[MonteurID] FROM monteurs " _
	& "WHERE [MonteurID]='" & TempVars!sMonteurID & "'"

With CurrentDb.OpenRecordset(strSQL)
	If .RecordCount = 1 Then
	   'ValidUser = 2
	   AccessLevel = .Fields ("Administrator").Value
	Else 
	   'ValidUser = 1
	   AccessLevel = True
	End If
	.Close
End With

	Select Case AccessLevel
		   Case True 'lv1 menu
			Me.objectnaam.Visible = True/False
			Me.objectnaam.Visible = True/False
			ETC
		   Case False 'lv2 menu
			Me.objectnaam.visible = true/false
			ETC
	End Select
End Sub

Aangezien ik een andere manier gebruik om de gebruikers te valideren, heb ik het kopje ValidUser helemaal achterwege gelaten. daar heb ik een ' voorgeplaatst.

M.v.g. Chris
 
Je functie mist een regel (naast de typfout):
Code:
Function DisplayMenu(UserId As String)
Dim strSQL As String
Dim CheckUser As Integer
'Dim ValidUser As Integer
Dim AccessLevel As Integer
strSQL = "SELECT [MonteurID], [wachtwoord], [Administrator] FROM monteurs " _
[B]    & "WHERE [MonteurID] = " & UserId
[/B]
With CurrentDb.OpenRecordset(strSQL)
    If .RecordCount = 1 Then
        If TempVars.Count > 0 Then TempVars.RemoveAll
        TempVars.Add "sMonteurID", .Fields(0).Value
        TempVars.Add "sWachtwoord", .Fields(1).Value
        TempVars.Add "sAccesslevel", .Fields(2).Value
        sMonteurID_ori = sMonteurID
        sMonteurID = .Fields(0)
    End If
    .Close
End With
End Function

En dit snap ik ook niet, tenzij je valideert op een tekstveld. Maar ik vermoed dat MonteurID een autonummerveld is, en dan moet het zo:
Code:
strSQL = "SELECT [administrator],[MonteurID] FROM monteurs WHERE [MonteurID]= " & TempVars!sMonteurID
Is MonteurID wél een tekstveld, dan moet dat in de functie uiteraard ook worden aangepast.
 
Ik ben momenteel op vakantie, dus ik heb niet meteen de tijd om het te testen, maar het klopt dat het MonteurID een autonummering veld is.
Ik zal van de week, en anders volgende week even kijken of ik die code krijg verwerkt in mijn database.
Nogmaals, ik ben nog een leek in access op gebied van VBA :P maar in ieder geval bedankt voor de hulp zover.

M.v.g. Chris
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan