Admettre les doublons sauf une valeur

kaborejean Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -

Bonsoir à tous!
Je me débrouille dans Ms Access et j'ai un souci.

En effet j'ai une table T_Personnel qui a trois champs: ID_Personnel; Nom et Prenom; Fonction. Le champ Fonction est une liste déroulante contenant Directeur, Adjoint, Gardien. J'ai un formulaire de saisie qui alimente la table T_Personnel. L'objectif est de saisir le personnel d'une école primaire.
Je voudrais que lorsque je saisie un nom et lui attribue la fonction Directeur, je ne puisse plus attribuer la même fonction Directeur à un autre. En somme, dans la liste du personnel, la fonction Directeur ne sera pas repétée, mais les autres OUI puisque dans les faits, il n'y a pas deux Directeurs dans une école primaire.
J'ai fait des recherches sur le Net, mais je n'ai eu gain de cause.
Je demande donc votre aide.

A voir également:

3 réponses

Bruno83200_6929 Messages postés 628 Date d'inscription   Statut Membre Dernière intervention   141
 

Bonjour,

Je comprends parfaitement votre problème. Vous voulez vous assurer qu'il ne puisse y avoir qu'un seul Directeur dans votre table T_Personnel, tout en permettant plusieurs Adjoints et Gardiens.


Voici une solution que vous pouvez implémenter :

Validation dans le formulaire


Dans l'événement "Avant MAJ" (BeforeUpdate) de votre formulaire, ajoutez ce code VBA :

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.Fonction = "Directeur" Then
        ' Vérifier s'il existe déjà un directeur (excluant l'enregistrement actuel si on modifie)
        Dim strSQL As String
        Dim intCount As Integer
        
        If Me.NewRecord Then
            ' Nouveau record
            strSQL = "SELECT COUNT(*) FROM T_Personnel WHERE Fonction = 'Directeur'"
        Else
            ' Modification d'un record existant
            strSQL = "SELECT COUNT(*) FROM T_Personnel WHERE Fonction = 'Directeur' AND ID_Personnel <> " & Me.ID_Personnel
        End If
        
        intCount = DCount("*", "T_Personnel", Replace(Mid(strSQL, InStr(strSQL, "WHERE")), "COUNT(*)", "*"))
        
        If intCount > 0 Then
            MsgBox "Il ne peut y avoir qu'un seul Directeur dans l'école !", vbExclamation, "Attention"
            Cancel = True
            Me.Fonction.SetFocus
        End If
    End If
End Sub

Vous pouvez également faire ceci :

Contrainte au niveau de la base de données
Vous pouvez aussi créer un index unique conditionnel :

Ouvrez la table T_Personnel en mode Création
Allez dans l'onglet "Index"
Créez un nouvel index nommé "DirecteurUnique"
Définissez le champ comme "Fonction"
Cochez "Unique" et "Ignorer les valeurs Null"

Mais cette solution est moins flexible car elle donnera une erreur système moins conviviale.


0
kaborejean
 

Bonjour!

Merci à Monsieur Bruno pour l'intérêt qu'il a accordé à mon problème.

j'ai copié le code vba et je l'ai collé dans l'évènement après MAJ de mon formulaire.

Mais je constate un message d'erreur lorsque je passe à l'essai. il est le suivant: Erreur de syntaxe (opérateur absent) dans l'expression WHERE Fonction = 'Directeur'

Que dois-je faire? 

0
Utilisateur anonyme
 

Bonjour,

Disons que tu utilises un champ fonctionne dans la table personne, tu peux créer un index unique qui interdit les doublons de directeur .

CREATE UNIQUE INDEX UniqueDirecteur 
ON personne (fonction) 
WHERE fonction='Directeur';
0