multi-user inlogscherm incl doorverwijzing eigen opstartformulier

Status
Niet open voor verdere reacties.

Dencar77

Gebruiker
Lid geworden
15 mrt 2013
Berichten
131
Beste allen,

ik zit even met een dilemma waarmee ik door het bos de bomen niet meer zie.

Ik heb een inlogscherm (gebruiker en wachtwoord) gemaakt en deze werkt uitstekend.
Echter...nu komt het...ik zou graag dat wanneer een gebruiker zich aanmeld dat hij of zij naar zijn eigen formulier gaat.
Nu is het geval dat iedereen hetzelfde formulier opent, nl "Hoofdscherm". Dat wil ik dus niet. Pietje moet Hoofdscherm_Pietje openen na aanmelden en Henkie zou Hoofdscherm_Henkie moeten openen. Er zijn max drie varianten op de hoofschermen btw.

Weet iemand hier de oplossing voor?

CODE:
==================================

Code:
Private Sub BtnAanmelden_Click()

'Controleert of er data in de Werknemer combo box is ingevoerd

    If IsNull(Me.cboWerknemer) Or Me.cboWerknemer = "" Then
        MsgBox "U dient een medewerker te kiezen.", vbOKOnly, "Required Data"
       Me.cboWerknemer.SetFocus
      Exit Sub
    End If
    
  'Controleert of data is ingevoerd in het wachtwoord tekstvlak
  
    If IsNull(Me.txtWachtwoord) Or Me.txtWachtwoord = "" Then
        MsgBox "U dient een wachtwoord in te vullen.", vbOKOnly, "Required Data"
        Me.txtWachtwoord.SetFocus
      Exit Sub
    End If
    
  'Controleert de waarde van het wachtwoord in Tbl_medewerker of deze past bij de gekozen waarde in combo box
    
    If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then
      MyMedId = Me.cboWerknemer.Value
      
  'Sluit aanmeldscherm en open hoofdmenu
  
      DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
      DoCmd.OpenForm "Hoofdscherm"
      
      Else
      MsgBox "Wachtwoord niet valide. Probeert u nogmaals.", vbCritical + vbOKOnly, "Ongeldige invoer!"
      Me.txtWachtwoord.SetFocus
   End If
   
  'Wanneer gebruiker het wachtwoord 3 keer onjuist invoert dan zal de database sluiten
  
     intLogonAttempts = intLogonAttempts + 1
    If intLogonAttempts > 2 Then
      MsgBox "U heeft geen toegang tot de database. Neem contact op met de beheerder.", vbCritical, "Toegang geweigerd!"
      Application.Quit
      
    End If

End Sub


================================
 
Laatst bewerkt:
Zoiets:

Code:
select case .cbowerknemer 

case "pietje"
DoCmd.OpenForm "Hoofdscherm-pietje"

case "henkie"
DoCmd.OpenForm "Hoofdscherm-henkie"

end select

groet jan
 
Goedemorgen Jan,

hartstikke bedankt voor je snelle reactie. Ik weet alleen niet waar ik het stukje moet tussenvoegen om het te laten werken.

CODE
==================================

Code:
'Controleert de waarde van het wachtwoord in Tbl_medewerker of deze past bij de gekozen waarde in combo box

 If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then
 MyMedId = Me.cboWerknemer.Value
select case Me.cbowerknemer.Value 

case "pietje"
DoCmd.OpenForm "Hoofdscherm-pietje"

case "henkie"
DoCmd.OpenForm "Hoofdscherm-henkie"

end select

 'Sluit aanmeldscherm en open hoofdmenu

 DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
 DoCmd.OpenForm "Hoofdscherm

=============================

Iets doe ik niet goed, want Select is inderdaad de opdracht die ik nodig heb.
Ik denk dat het stukje 'sluit aanmeldscherm en open hoofdmenu, en wat er daarna komt geheel weggelaten kan worden (DoCmd's).
Ook heb ik bij SELECT CASE het stukje aangepast tot SELECT CASE ME.CBOWERKNEMER.VALUE, anders pakte de opdracht niet goed uit.


Indien ik bovenstaande invoer dan opent hij nog steeds voor eenieder dezelfde formulier.
 
Laatst bewerkt:
Zou je (want je bent er consequent in om het niet te doen) je code (liefst dus ook de vorige post) willen opmaken met de CODE knop? Jan laat zien hoe dat er uit ziet.
 
Verder heb je de Select Case (al werkt die natuurlijk wel) niet nodig, als de formulieren overeenkomen met de naam van de ingelogde gebruiker, en je die naam ook in de keuzelijst op je aanmeldformulier hebt staan.
Code:
If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then
    Dim sForm As String
    sForm = "Hoofdscherm-" & Me.cboWerknemer.Column(1)
    DoCmd.Close acForm, "Aanmeldscherm"
    DoCmd.OpenForm sForm
Else
    MsgBox "Wachtwoord niet valide. Probeert u nogmaals.", vbCritical + vbOKOnly, "Ongeldige invoer!"
    Me.txtWachtwoord.SetFocus
End If
Zelf zou ik deze constructie never nooit gebruiken, want veel te onderhoudsgevoelig. Wat doe je als er iemand weggaat? Moet je al die code aanpassen. Veel beter is het om één hoofdformulier te maken, waarop je op basis van een rechtenstructuur knoppen etc. zichtbaar maakt of niet. Dan hoef je alleen maar een nieuwe gebruiker toe te voegen, en een rechtenwaarde toe te kennen, en alles werkt gelijk. Maar dat is mijn voorkeur...
 
zo?
Code:
'Controleert de waarde van het wachtwoord in Tbl_medewerker of deze past bij de gekozen waarde in combo box

 If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then  MyMedId = Me.cboWerknemer.Value

 Select case Me.cbowerknemer.Value 

 case "pietje"
   DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
   DoCmd.OpenForm "Hoofdscherm-pietje"

 case "henkie"
   DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
   DoCmd.OpenForm "Hoofdscherm-henkie"

 end select

' einde voorbeeld

gr jan
 
Laatst bewerkt:
Excuses voor het consequent niet gebruiken van CODE.


Nee, ik heb niet de naam van de ingelogde gebruiker als naam van de aanmeldformulier gebruikt. De gebruikte namen dienen als voorbeelden.
Daarnaast heb je zeker een punt vwb onderhoudsgevoeligheid, echter die kennis moet ik me nog geheel aanleren. Een zeer goede tip, bedankt!

Code:
'Controleert de waarde van het wachtwoord in Tbl_medewerker of deze past bij de gekozen waarde in combo box
    
    If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then MyMedId = Me.cboWerknemer.Value
    Select Case Me.cboWerknemer.Value
        Case "Dennis"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm"
        Case "Suzan"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Marielle"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Hans"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Gertjan"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Karel"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
        Case "Fred"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
        Case "Jan"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
        End Select
Else
    MsgBox "Wachtwoord niet valide. Probeert u nogmaals.", vbCritical + vbOKOnly, "Ongeldige invoer!"
    Me.txtWachtwoord.SetFocus
   End If
   
  'Wanneer gebruiker het wachtwoord 3 keer onjuist invoert dan zal de database sluiten
  
     intLogonAttempts = intLogonAttempts + 1
    If intLogonAttempts > 2 Then
      MsgBox "U heeft geen toegang tot de database. Neem contact op met de beheerder, Dennis Karssen.", vbCritical, "Toegang geweigerd!"
      Application.Quit
      
    End If

Wanneer ik bovenstaande gebruik dan krijg ik de foutmelding End zonder If en benadrukt de Else,.
 
Code:
'Controleert de waarde van het wachtwoord in Tbl_medewerker of deze past bij de gekozen waarde in combo box
    
    If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then 
MyMedId = Me.cboWerknemer.Value
    Select Case Me.cboWerknemer.Value
        Case "Dennis"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm"
        Case "Suzan"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Marielle"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Hans"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Gertjan"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Medewerker"
        Case "Karel"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
        Case "Fred"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
        Case "Jan"
            DoCmd.Close acForm, "Aanmeldscherm", acSaveNo
            DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
        End Select
Else
    MsgBox "Wachtwoord niet valide. Probeert u nogmaals.", vbCritical + vbOKOnly, "Ongeldige invoer!"
    Me.txtWachtwoord.SetFocus
   End If
   
  'Wanneer gebruiker het wachtwoord 3 keer onjuist invoert dan zal de database sluiten
  
     intLogonAttempts = intLogonAttempts + 1
    If intLogonAttempts > 2 Then
      MsgBox "U heeft geen toegang tot de database. Neem contact op met de beheerder, Dennis Karssen.", vbCritical, "Toegang geweigerd!"
      Application.Quit
      
    End If

met smartindenter op http://www.oaltd.co.uk/Indenter/Default.htm kun je op een handige manier zien waar je if then etc. het misloopt. Het zorgt trouwens ook voor een mooie layout van de vba code.
 
Laatst bewerkt:
En om te laten zien hoe mooi het allemaal kan (want dit is toch wel een verkeerde aanpak): als je in je tabel [Tbl_Medewerker] een veld Niveau o.i.d. hebt, en daar een getal invult voor een authorisatieniveau, en je neemt dat veld ook op in je keuzelijst (in mijn voorbeeldje is het dan het derde veld) dan kun je hiermee volstaan:
Code:
Dim iLevel As Integer
    
    If Me.txtWachtwoord.Value = DLookup("Wachtwoord", "[Tbl_Medewerker]", "[MedId]=" & Me.cboWerknemer.Value) Then
        iLevel = Me.cboWerknemer.Column(2)
        DoCmd.Close acForm, "Aanmeldscherm"
        Select Case iLevel
            Case 1
                DoCmd.OpenForm "Hoofdscherm"
            Case 2
                DoCmd.OpenForm "Hoofdscherm_Leidinggevenden"
            Case 3
                DoCmd.OpenForm "Hoofdscherm_Admin"
        End Select
    Else
        MsgBox "Wachtwoord niet valide. Probeert u nogmaals.", vbCritical + vbOKOnly, "Ongeldige invoer!"
        Me.txtWachtwoord.SetFocus
   End If
Lijkt me een heel stuk simpeler, en zeker veel beter te onderhouden.
 
Laatst bewerkt:
Jan en Michel,

beiden ontzettend bedankt voor jullie hulp. Ik heb de database gekopieerd en een nieuwe naam eraan gegeven.
Met die DB ga ik met Michels advies aan de slag, want inderdaad is dat de beste oplossing voor wat ik wil. Dus ben druk doende om het een en ander aan te passen.

Voor wat betreft de CASE opdracht, helaas is dat nog niet geheel in orde, maar ik moet nog de VBA cleaner erop na gooien.

Nogmaals, bedankt voor jullie topadvies.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan