Admettre les doublons sauf une valeur

kaborejean Messages postés 1 Statut Membre -  
 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.

3 réponses

  1. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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
  2. 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
  3. 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