Identification dans une base access et vu réduite
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 - 2 oct. 2024 à 19:37
- Identification dans une base access et vu réduite
- Entrer les informations d'identification reseau - Guide
- Vu profil instagram - Guide
- Qui a vu mon profil facebook - Guide
- Vu satellite google maps - Guide
- Formules excel de base - Guide
4 réponses
1 oct. 2024 à 15:12
Bonjour,
Le message d'erreur que tu reçois est probablement dû au fait que le champ "Groupe" que tu utilises dans tes tables est un champ à plusieurs valeurs, ce qui est une fonctionnalité d'Access. Ces champs ne peuvent pas être directement utilisés dans des clauses WHERE ou HAVING.
Pour contourner ce problème, il est préférable de normaliser ta base de données en utilisant une table de jointure pour représenter la relation entre les affaires, les matériels, et les groupes.
Puisque plusieurs groupes peuvent être associés à une affaire ou un matériel, crée deux tables de jointure :
T_affaire_groupe : Relie chaque affaire avec ses groupes.
T_materiel_groupe : Relie chaque matériel avec ses groupes.
La structure de ces tables sera simple :
T_affaire_groupe : ID_Affaire, ID_Groupe
T_materiel_groupe : ID_Materiel, ID_Groupe
Chaque table va associer un enregistrement d'affaire ou de matériel à plusieurs groupes sans utiliser des champs à plusieurs valeurs.
Modifier les requêtes pour filtrer selon le groupe
Plutôt que d'utiliser directement le champ "Groupe" dans les affaires et matériels, tu vas utiliser une jointure dans la requête pour récupérer les groupes auxquels appartient chaque affaire ou matériel.
Voici un exemple pour le formulaire des affaires.
Tu dois maintenant ajuster le filtre dans tes formulaires pour qu'ils se basent sur la table de jointure.
Exemple pour le formulaire des affaires (en utilisant la table T_affaire_groupe) :
Private Sub Form_Open(Cancel As Integer) Dim UserGroup As String ' Récupérer le groupe de l'utilisateur depuis T_users UserGroup = DLookup("Groupe", "T_users", "UserName='" & CurrentUser & "'") ' Appliquer le filtre pour afficher uniquement les affaires appartenant au groupe de l'utilisateur Me.RecordSource = "SELECT T_affaire.* " & _ "FROM T_affaire INNER JOIN T_affaire_groupe " & _ "ON T_affaire.ID_Affaire = T_affaire_groupe.ID_Affaire " & _ "WHERE T_affaire_groupe.ID_Groupe='" & UserGroup & "'" End Sub
Pour les matériels, il suffira d'utiliser la même logique mais avec la table T_materiel_groupe.
Bruno
30 sept. 2024 à 18:30
Bonjour,
Je vais essayer de t'aider. Pour réaliser ce que tu souhaites dans ta base de données Access, voici une approche en plusieurs étapes :
- PRIMO - Créer le formulaire F_login
Crée un formulaire simple avec un champ de texte où l'utilisateur pourra entrer son nom. Pas besoin de mot de passe, donc un seul contrôle est nécessaire.
Ajoute un bouton pour soumettre le nom de l'utilisateur.
- SECUNDO - Enregistrer le nom de l'utilisateur dans une variable
Dans VBA, tu peux déclarer une variable globale qui va contenir le nom de l'utilisateur une fois qu'il l'aura entré. Cette variable sera accessible dans d'autres modules ou formulaires.
' Module VBA pour stocker la variable utilisateur Public CurrentUser As String ' Code pour le bouton de connexion dans le formulaire F_login Private Sub btnLogin_Click() ' Récupérer le nom d'utilisateur depuis le champ de texte CurrentUser = Me.txtUserName.Value ' Vérifier si l'utilisateur existe dans la table T_users If DCount("*", "T_users", "UserName='" & CurrentUser & "'") > 0 Then ' Si l'utilisateur existe, ouvrir les formulaires et fermer celui de login DoCmd.OpenForm "F_affaires" DoCmd.OpenForm "F_materiels" DoCmd.Close acForm, "F_login" Else MsgBox "Nom d'utilisateur non trouvé", vbExclamation End If End Sub
- TERTIO - Filtrer les formulaires F_affaires et F_materiels
Dans les formulaires "F_affaires" et "F_matériels", tu vas appliquer un filtre pour ne montrer que les affaires et matériels appartenant au groupe de l'utilisateur connecté.
Utilise une requête qui associe les tables et filtre les enregistrements.
Voici un exemple de code à ajouter dans l’événement On Open des formulaires "F_affaires" et "F_matériels" :
Private Sub Form_Open(Cancel As Integer) Dim UserGroup As String ' Récupérer le groupe de l'utilisateur depuis T_users UserGroup = DLookup("Groupe", "T_users", "UserName='" & CurrentUser & "'") ' Appliquer le filtre pour afficher les affaires ou matériels du groupe de l'utilisateur Me.Filter = "Groupe='" & UserGroup & "'" Me.FilterOn = True End Sub
Structure des tables
T_users : Contient les utilisateurs et leur groupe.
T_groupe : Contient les informations des groupes.
T_affaire et T_matériel : Contiennent les informations des affaires et matériels et leur groupe respectif. Si une affaire ou un matériel peut appartenir à plusieurs groupes, il peut être nécessaire d'utiliser une table de jointure pour gérer ces relations plusieurs-à-plusieurs (par exemple, T_affaire_groupe et T_materiel_groupe).
Perso, j'aurais essayé de faire comme cela :
Le formulaire F_login récupère le nom d'utilisateur et le stocke dans une variable globale.
Les formulaires F_affaires et F_matériels utilisent cette variable pour appliquer un filtre basé sur le groupe de l'utilisateur.
Les données sont filtrées à l'ouverture des formulaires en fonction du groupe de l'utilisateur.
Cela devrait te permettre de gérer dynamiquement l'affichage des affaires et matériels en fonction du groupe auquel appartient l'utilisateur connecté.
1 oct. 2024 à 13:56
Merci infiniment pour cette aide précieuse.
J'ai cependant un petit message d'erreur
"le champ à plusieurs valeurs "groupe" ne peut pas être utilisé dans une close WHERE ou HAVING"
une affaire ou un objet peut appartenir à plusieurs groupes.
j'ai corrigé quelques incohérances de nommage ( user , username, code_f) présent dans la base.
Celle dans le lien joint est corrigée et contient vos scripts.
si vous pouvez y jeter un oeil.
Merci encore
https://drive.google.com/file/d/1m7uKH_wG3Sh5x_sGb4O6urZgEbSq3rUj/view?usp=sharing
2 oct. 2024 à 19:37
Bonsoir,
Je suis désolé, mais j'ai désinstallé dernièrement ACCESS de ma machine, je ne peux pas ouvrir votre projet.
Cependant, l'erreur que vous recevez vient du fait que tu utilises un champ à plusieurs valeurs pour "Groupe".
Comme expliqué précédemment, il est recommandé de ne pas utiliser de champs à plusieurs valeurs dans Access, d'où l'intérêt de créer des tables de jointure pour gérer les relations plusieurs-à-plusieurs (entre les affaires/matériels et les groupes).
Il faut bien représenter les relations entre les affaires/matériels et les groupes. Voici un exemple de structure pour les deux tables :
Crée les tables T_affaire_groupe et T_materiel_groupe dans ta base de données.
Modifie les formulaires pour utiliser des requêtes SQL avec des jointures sur ces tables de relation.
Supprime les champs à plusieurs valeurs pour éviter les limitations d'Access dans tes requêtes.
Modifié le 2 oct. 2024 à 14:53
Merci pour votre travail.
Je bloque encore, mais c'est due à un niveau bien trop faible de ma part.
il va falloir que je potasse le sujet de manière approfondie.
Merci encore
Si vous pouviez modifier ma base de test, je pourrais l'étudier de manière plus précise. Bie n à vous.
Modifié le 2 oct. 2024 à 15:55
bonjour, Base de test adaptée pour le matériel:
https://www.cjoint.com/c/NJcn2MeVGlD
2 oct. 2024 à 16:11
Splendide.
je vais étudier ça de près
Merci encore