Forum Clubic

Access : Décocher une case si modification et mot de passe

Bonjour à tous,

J’ai un formulaire dans Access avec plein de données.

J’aimerai faire en sorte que si on modifie une donnée manuellement dans le formulaire, mes cases “cocher18”,“cocher19” et “cocher20” se décochent.

Est-ce possible ?

Merci !
Edité le 19/12/2011 à 12:29

Pour chacun des objets modifiables de ton formulaire, tu dois avoir un événement change().
Il suffit que tu associes la modification de tes cases à cet évènement.
C’est à faire pour chacun des objets, par contre tu peux faire appel à un sub unique si les cases à décocher sont toujours les mêmes.

Merci, je ne m’y connais pas trop en access pour le moment mais je vais chercher sur la vois du sub étant donné que c’est toujours les mêmes cases.

Si j’ai un soucis je reviendrai ^^

Merci gcc !

Re !!

Alors j’ai bien compris avec l’événement change() (bon moi je l’ai en francais mais c’est pareil) mais par contre je ne comprends pas l’histoire du sub unique. C’est effectivement toujours les mêmes cases qui seront décoché et il y a beaucoup d’élément modifiable donc si je peux simplifier… ^^

De plus, j’aimerai faire en sorte que, dès qu’une personne veux cocher sa signature, une demande de mot de passe lui soit demandé. J’ai déjà créer la table avec les 6 utilisateurs avec leurs nom (qui est le même que sur les étiquettes des cases à cocher) et leurs mot de passe.
Maintenant il faudrait que :
Si un utilisateur veux cocher une case de l’utilisateur C, c’est le mot de passe de l’utilsateur C qui lui est demandé dans une petite fenêtre, si le mot de passe est bon, la case sera bien coché, sinon un message lui dira que le mot de passe n’ai pas bon et lui proposera de réessayer (avec possibilité d’annulé par l’utilisateur).

Est-ce que quelqu’un serai comment faire ? Par état, formulaire, autre ?

Merci !

Tu peux donner le code de 2 ou 3 des change() que tu as remplis ? ce sera plus facile pour expliquer

Tu mets les mots de passe de chaque utilisateur dans un champ caché (un champ par mot de passe). Et ensuite, dans ton change(), tu n’as plus qu’à vérifier la correspondance avant de cocher la case

En faite, pour une zone de texte par exemple, j’ai mis le code suivant :

Private Sub Texte281_Change()
    Cocher332.Value = False
    Cocher328.Value = False
    Cocher326.Value = False
    Cocher26.Value = False
    Cocher28.Value = False
    Cocher30.Value = False
End Sub

Ce code, je dois le mettre sur toutes les zones modifiables mais il y en a vraiment beaucoup ! Si il y avais un autre moyen plus simple/cour et avec moins de code (Parce que recopier ce code sur chaque élément sa fait beaucoup de code pour faire une seul chose), je prends !

Pour les champs cachés, je ne pense pas que sa fonctionnerai étant donné que les 6 personnes qui peuvent cocher les cases ont la possibilités d’éditer les formulaires et donc de voir les champs cachés.

J’avais plutôt pensé à faire une table “password” avec tous les MDP et, dans les restrictions (J’utilise des groupes d’utilisateurs) je met :
1 - Les utilisateurs en lecture seul sur les formulaires et aucune visibilité des tables, requêtes ect…
2 - Les 6 utilisateurs avec pouvoir qui cochent les cases avec demande de MDP et qui ont accès aux tables et requêtes avec des droits de modifications SAUF qu’ils n’auraient pas la visibilités sur la table “password
3 - DMMASTER => moi : FULL CONTROL
Edité le 16/12/2011 à 08:55

Si c’est bien toujours les mêmes cases qui sont à décocher, tu procèdes de la manière suivante :

Private Sub Texte281_Change()
Decocher
End Sub
Private Sub Texte282_Change()
Decocher
End Sub
Private Sub Texte283_Change()
Decocher
End Sub
idem pour l’ensemble des objets texte concernés

puis dans ton module (tu le crées si ce n’est pas déjà fait)
sub Decocher()
Cocher332.Value = False
Cocher328.Value = False
Cocher326.Value = False
Cocher26.Value = False
Cocher28.Value = False
Cocher30.Value = False
EndSub

Oui, l’idée c’est bien de mettre les mots de passe dans une table à consultation c’est la bonne.
Après, à la création, tes champs cachés sont vides.
Et à l’affichage du formulaire tu les remplis à partir de la table en question.

Il doit aussi y avoir une solution pour extraire directement la valeur de la table et la mettre dans une variable VBA (avec recordset), mais je laisse à un spécialiste le soin de t’expliquer comment procéder, moi je ne me rappelle plus du tout.

Merci pour ta première solution qui, effectivement, évite pas mal de code ! :super: Ca va être long à appliquer au vu de la petite 50ène de champs texte et liste déroulante à faire ^^.

Je planche maintenant sur le mot de passe, c’est assez difficile pour moi aussi étant donné que je débute dans Access (je ne le trouve pas super pratique d’ailleurs…).

Quand je code du php avec du sql par exemple c’est d’une rapidité déconcertante alors qu’avec Acces, il faut passer par un truc, puis un autre puis un autre…

Ce serai si simple que, quand je coche, j’ai une petite fenêtre qui s’ouvre avec un texte du genre “Entrer le mot de passe de machin”, une zone de texte dans laquelle on entre son mot de passe, un bouton valider et un bouton annuler.
Quand on clic sur valider, il recherche le nom d’utilisateurs et le mot de passe associé, si c’est bon, on valide bien !

Bref, on est pas sorti de l’auberge ^^
Edité le 16/12/2011 à 09:54

Petite précision : Dans mon module, j’ai du mettre

[nom du formulaire]!Cocher332.Value = False

Car sinon il ne trouvé pas “Cocher332” :stuck_out_tongue:

Aller op je continu !
Edité le 16/12/2011 à 10:10

C’est exactement comme ça que ça marche dans acces !
1- tu crées une table à deux champs : utilisateur - mot de passe.
2- sur cette table, tu crées une requête (un select) qui te donnera le mot de passe en fonction de l’utilisateur.
l’idée, c’est de n’obtenir en sortie de requête qu’une seule valeur pour un utilisateur donné.
3- tu crées ton formulaire en le basant sur la requête en question.

  • les labels
  • une zone de texte pour le nom d’utilisateur
  • une zone de texte cachée pour le mot de passe.
  • les boutons

A l’appui sur valider, tu demandes à ta macro de rafraichir le formulaire (pour que la requête affiche le bon mot de passe), tu compares ensuite les deux valeurs et tu poursuis en fonction du résultat trouvé.

Pour en revenir à l’histoire des cases à décocher, j’ai trouvé une solution plus simple par hasard !

J’ai créé un sous-formulaire avec les cases à cocher dans mon formulaire principal et dans les propriétés de mon formulaire principal je lui met dans l’événement change() la fonction de décoché ^^.

Par contre je me heurte à un problème : Je n’arrive pas, dans le module que nous avons créé, à coder la décoche de la case comme ceci par exemple :

[Form_Sous-Formulaire Signatures].Cocher1.Value = False

J’essaye des choses mais rien ne marche :etonne2:

Mets un point d’arrêt sur la ligne de code en question pour être sûr que tu passes bien dedans.
Et au moment où ton code est stoppé sur l’instruction, tu peux faire tes différents essais dans la fenêtre d’exécution, tu pourras voir immédiatement ce qui marche et ce qui ne marche pas.

Si je met cette ligne, il veux pas rentrer dans la fonction, si je la met pas, il passe mais comme il n’y a pas de code… je vais rechercher après je mange un peu là ^^

[Form_Sous-Formulaire Signatures].Cocher1.Value
Tu es sûr de ta syntaxe ?
Normalement, je pense que ça devrait se présenter de cette manière
Forms![NomFormulaire]![NomSousFormulaire].Form![MaZoneDeText].Value

Après, à toi de voir ce qui est implicite, donc supprimable

Je te remercie de toute ton aide, je boss dessus et je te tiens au courant de l’avancement (bon le week approche, j’aurai surement pas fini aujourd’hui :stuck_out_tongue: ) .

Je posterai plus pour aujourd’hui je pense. Bon Week à toi et à très bientôt :super:
Edité le 16/12/2011 à 15:07

Je vais quand même devoir poster car je m’énerve…

J’ai créé une table avec 3 champs => Numéro, Login, Password et j’ai mis mes 6 utilisateurs avec les passwords.

J’ai créer un formulaire avec mes 2 champs (X et Z) à remplir par l’utilisateur (login et password) + un bouton valider et annuler.

Point noir :
La parti code => J’aimerai que mon code face ceci à l’appui du bouton valider :

1 - Recherche le nom d’utilisateur dans la table password qui a été taper dans le champs X.
2 - Si il existe, récupérer son mot de passe et le comparer avec celui taper dans le champ Z.
2bis - Si il n’existe pas, message d’erreur qui invite à recommencer.
3 - Si le mot de passe de cet utilisateur est le même que celui taper dans le champs Z, alors on valide la coche.
3bis - Si c’est incorrect, op un message d’erreur qui invite à recommencer.

En PHP j’aurai mis 10 minutes, Access est vraiment une usine à gaz !

Petit plus : Ce serai bien que le mot de passe soit crypté à l’affichage pour les yeux indiscret sur l’écran.
Edité le 16/12/2011 à 15:54

Tu ne peux pas comparer php à access, ça n’est pas fait pour faire la même chose.
Par contre, tu peux le comparer avec VBA, le langage de programmation qui t’est fourni avec access.
Ce que tu veux faire là, c’est effectivement plus facile à réaliser en VBA pur qu’en access.
Après, si tu optes pour cette solution, c’est comme php, c’est un langage à part entière à apprendre.

Je connais un peu le VB et j’aimerai vraiment pouvoir faire cela en VB mais je ne sais pas comment communiquer avec une base access via un code VB créé avec Access… je vais essayer de trouver des info la semaines prochaines… j’arrête pour aujourd’hui, je mange de l’access depuis 1 semaines non stop !

Merci de ton aide et de ta patience ! Tchouss !!!

Bonjour bonjour !!

J’ai fini !! Et voici comment j’ai procédé (Ça peut toujours en aider d’autres) :

Pour décocher les cases automatiquement j’ai bien fais avec l’événement change() de chaque élément qui lance un code qui décoche toutes mes cases.

Pour faire une demande de mot de passe :

1- Création d’une table Password avec colonnes “Nom” et “Password” que j’ai remplis.

2 - Création d’une requête Requête MDP qui demande un mon mot de passe et affiche le nom lié au mot de passe.

3 - Création d’un petit formulaire qui sert à lancer la requête précédente et, du coup, récupéré le nom d’utilisateur lié au mot de passe.

4 - J’ai mis dans l’événement click de mes cases, ce code (X étant variable):

Info : Cocher06 => Pour l’utilisateur Guillaume


Private Sub [i]Cocher06[/i]_Click()
    DoCmd.OpenForm "Form Affichage Nom selon MDP", acFormDS, "", "", , acNormal
    
    If (Forms![Form Affichage Nom selon MDP]!LoginAff = "[i]Guillaume[/i]") Then
        DoCmd.Close acForm, "Form Affichage Nom selon MDP"
    Else
        If ([Form_Formulaire découpe]![i]Cocher06[/i].Value = True) Then
            [Form_Formulaire découpe]![i]Cocher06[/i].Value = False
        Else
            [Form_Formulaire découpe]![i]Cocher06[/i].Value = True
        End If
        DoCmd.Close acForm, "Form Affichage Nom selon MDP"
        Beep
        MsgBox "Mot de passe incorrect", vbOKOnly, ""
    End If
End Sub

Et donc pour résumé le process parfait (sans erreur ^^) :

1- L’utilisateur ouvre une fiche et coche la signature qui s’appelle Coche06
2- Access demande de taper un mot de passe et recherche le nom lié à ce mot de passe. (Si le mot de passe est bon, Access trouve comme résultat le nom Guillaume dans la table Password via la requête Requête MDP.)
3- Access va ensuite vérifié que le nom lié au mot de passe (Donc Guillaume) soit bien le nom lié à la case Coche06.
4- Si les 2 noms correspondent, donc Guillaume de la requête = Guillaume de la case Coche06, alors on coche la case.

Voilà voilà, hésitez pas pour des précisions !!

Un grand merci gcc pour ton aide très précieuse !!!