This is my corner for documenting my ideas.
It mostly contains posts for Access Databases (samples, full applications, etc.) as i like rapid software application development. Occasionally you will find other stuff like physics notes.

Saturday, 14 April 2012

Είσοδος Χρηστών στην Εφαρμογή μας σε Access

Μερικές εφαρμογές που μπορεί να αναπτύξουμε σε Access μπορεί να απαιτούν ένα επίπεδο ασφάλειας που υλοποιείται συνήθως από την είσοδο στην εφαρμογή συγκεκριμένων χρηστών που έχουν οριστεί από αυτή και που ο καθένας έχει ένα όνομα χρήστη και ένα κωδικό. Επίσης σε εφαρμογές που χρησιμοποιούνται από πολλούς χρήστες συμβαίνει να μην έχουν όλοι τα ίδια δικαιώματα χρήσης οπότε θα πρέπει ανά λογαριασμό χρήστη να οριστεί ένα επίπεδο χρήστη στο οποίο θα αντιστοιχούν κάποια δικαιώματα. Επειδή τα δικαιώματα αυτά διαφέρουν από εφαρμογή σε εφαρμογή εδώ θα λάβουμε απλώς μέριμνα δημιουργώντας την υποδομή και εξηγώντας τη λογική.


Για μια πρώτη αντιμετώπιση του θέματος θα χρειαστούμε
  • ένα πίνακα που θα είναι καταχωρημένοι οι λογαριασμοί των χρηστών
  • μία φόρμα για να διαχειριζόμαστε τους λογαριασμούς χρηστών
  • μία φόρμα εισόδου στην εφαρμογή
  • λίγο κώδικα σε μερικά σημεία

Στην παραπάνω εικόνα φαίνονται όλα τα απαραίτητα πεδία
  • AppUserID (το πρωτεύων κλειδί του πίνακα)
  • ΑppUserName (για το ονόματα εισόδου των χρηστών)
  • AppUserPassword (για τους κωδικούς εισόδου των χρηστών)
Στην ιδιότητα Input Mask του παραπάνω πεδίου έχω βάλει Password έτσι ώστε όταν το πληκτρολογούμε να μην εμφανίζονται οι χαρακτήρες αλλά αστεράκια
  • AppUserAccess (για το επίπεδο δικαιωμάτων κάθε χρήστη - εδώ μπορούμε να αντιστοιχήσουμε αριθμούς σε επίπεδα ή και χαρακτηρισμούς π.χ. "admin")
  • AppUserBuiltIn (τύπου yes/no και χρειάζεται γιατί κάποιοι λογαριασμοί θα πρέπει να είναι ενσωματωμένοι στην εφαρμογή και να μην μπορούν να αλλάξουν όπως του διαχειριστή της εφαρμογής- administrator ή ενός χρήστη για σκοπούς επίδειξης - demo)

Ανοίγουμε τώρα τον πίνακα (tblAppUsers) για να καταχωρήσουμε λογαριασμούς χρηστών. Θα καταχωρήσουμε τον admin που θα έχει όλα τα δικαιώματα και τον user που θα έχει περιορισμένα (και οι δύο λογαριασμοί είναι ενσωματωμένοι της εφαρμογής) και κωδικούς admin και user αντίστοιχα.


Ας φτιάξουμε τώρα τη φόρμα εισόδου. Αυτή θα αποτελείται από ένα combo box (cboAppUser) που θα παίρνει τιμές από τα ονόματα των χρηστών (για ευκολία αλλά μειωμένη ασφάλεια αλλιώς χρησιμοποιούμε text box) - χρησιμοποιούμε τον Wizard της Access για να του πούμε από θα πάρει τις τιμές, ένα text box που θα πληκτρολογείται ο κωδικός (txtPassword) και δύο κουμπιά, ένα για επιβεβαίωση της καταχώρησης και συνέχεια στην εφαρμογή (cmdLogin) και ένα για έξοδο από την εφαρμογή (cmdExitApp). Επειδή θέλουμε να κρατιέται ο αριθμός χρήστη αντί να τον καταχωρούμε σε έναν άλλο πίνακα (πιο σωστό) εδώ για να γλιτώσουμε κόπο και χρόνο θα κάνουμε το εξής κόλπο: μετά την επιτυχή είσοδο η φόρμα θα κρύβεται (αλλά δεν θα κλείνει).


Για τον παραπάνω λόγω προσθέτουμε στην ιδιότητα On Open της φόρμας το Event Procedure (που την κρατάει ορατή και εστιάζει στο combo box)
Private Sub Form_Open(Cancel As Integer)
    Me.Visible = True
    Me.cboAppUser.SetFocus
End Sub

στην ιδιότητα Αfter Update του combo cboAppUser (που μετά την επιλογή στο combo box εστιάζει στο πεδίο του κωδικού)

Private Sub cboAppUser_AfterUpdate()
    Me.txtPassword.SetFocus
End Sub

στο κουμπί cmdLogin, Event Procedure στο On Click

Private Sub cmdLogin_Click()

'Έλεγχος αν έχει επιλεχθεί όνομα στο combo box
    If IsNull(Me.cboAppUser) Or Me.cboAppUser = "" Then
            MsgBox "Πρέπει να εισάγετε όνομα χρήστη.", vbOKOnly, "Απαιτούμενα Δεδομένα"
            Me.cboAppUser.SetFocus
        Exit Sub
        Else
          strPass1 = Me.cboAppUser.Column(2)
    End If

'Έλεγχος αν έχει καταχωρηθεί κείμενο στο πεδίο του κωδικού εισόδου
    If IsNull(Me.txtPassword) Or Me.txtPassword = "" Then
            MsgBox "Πρέπει να εισάγετε κωδικό.", vbOKOnly, "Απαιτούμενα Δεδομένα"
            Me.txtPassword.SetFocus
        Exit Sub
    End If

'Έλεγχος ταιριάσματος κωδικού και ονόματος
   strPass2 = Me.txtPassword
      If StrComp(strPass1, strPass2, vbBinaryCompare) = 0 Then
          AppUserID = Me.cboAppUser.Value
'Κρύψιμο της φόρμας και άνοιγμα της διαφημιστικής φόρμας
        Me.Visible = False
        DoCmd.OpenForm "frmSplashScreen"
        Else
        MsgBox "Λάθος κωδικός. Δοκιμάστε ξανά.", vbOKOnly, "Άκυρη Εισαγωγή!"
        Me.txtPassword.SetFocus
    End If

End Sub


Για το κουμπί cmdExitApp αν χρησιμοποιήσουμε τον Wizard της Access o κώδικας για την έξοδο από την εφαρμογή φτιάχνεται αυτόματα. 

Μετά την επιτυχή είσοδο μπορεί να πετάγεται μία διαφημιστική οθόνη όπως γίνεται στο παράδειγμα που σας δίνω και μετά το κλείσιμο αυτής να πηγαίνει στο κύριο μενού της εφαρμογής.


Για την σχεδίαση της φόρμας διαχείρισης των χρηστών (frmAppUsers) δεν χρειάζεται να πούμε τίποτα καθώς σας την παρέχω έτοιμη με χρωματάκια και γραφικούλια για να είναι πιο νόστιμη. Πρέπει όμως να προσθέσουμε κάποιες λογικές ενέργειες.


Έτσι στα Events (των ιδιοτήτων-properties της φόρμας) On Load έχω προσθέσει Event Procedure

Private Sub Form_Load()
If Forms!frmLogin!cboAppUser = 2 Then
Me.AllowDeletions = False
Me.AllowAdditions = False
Me.AllowEdits = False
End If
End Sub
και στο On Current
Private Sub Form_Current()
If Me.AppUserBuiltIn.Value = -1 Then    Me.AppUserPassword.SetFocus    Me.AppUserName.Enabled = False    Me.AppUserName.Locked = True    Me.AllowDeletions = FalseElse    Me.AppUserPassword.SetFocus    Me.AppUserName.Enabled = True    Me.AppUserName.Locked = False    Me.AllowDeletions = TrueEnd If
End Sub
Η πρώτη λογική διαδικασία (όταν φορτώνεται η φόρμα για πρώτη φορά - On Load) πάει στη φόρμα frmLogin και κοιτάει ποιος χρήστης έχει συνδεθεί. Αν είναι ο χρήστης με AppUserID=2 (ο γενικός χρήστης δηλαδή) δεν επιτρέπονται (=false) οι διαγραφές (deletions), Οι προσθήκες (additions) και οι διορθώσεις (edits) στη φόρμα (αλλιώς επιτρέποντα όλα στον άλλο χρήστη που είναι ο admin). Βέβαια αυτή η λογική ισχύει για δύο επίπεδα χρηστών. Αν υπάρχουν περισσότερα τότε θα πρέπει για κάθε επίπεδο χρήστη σε κάθε if να οριστούν τα δικαιώματα.

Η δεύτερη λογική διαδικασία (On Current) δουλεύει με βάση σε ποια εγγραφή βρισκόμαστε. Αν ο λογαριασμός είναι ενσωματωμένος (Me.AppUserBuiltIn.Value = -1) δεν επιτρέπει την διαγραφή ή την αλλαγή του ονόματος χρήστη. Αν ο λογαριασμός δεν είναι ενσωματωμένος τότε επιτρέπονται όλα (ανεξαρτήτως χρήστη).

Τέλος θα πρέπει να πούμε στην Access όταν ξεκινάει η εφαρμογή να τρέχει πρώτα η οθόνη εισόδου των χρηστών.


Όλα τα παραπάνω δεν είναι καθόλου δεσμευτικά και μπορούν αλλαχθούν κατά το δοκούν. Πειραματιστείτε και μάθετε!





Wednesday, 1 February 2012

Αλληλεπίδραση Ακτινοβολίας με την Ύλη