IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Ecriture VBA éviter doublon


Sujet :

IHM

  1. #1
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Novembre 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2019
    Messages : 108
    Points : 78
    Points
    78
    Par défaut Ecriture VBA éviter doublon
    Bonjour,

    j'avais trouvé une formule pour éviter les doublons qui fonctionnait très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'If Not IsNull(DLookup("[référence facture]", "Factures", "[référence facture]='" & Me.référence_facture & "'")) Then
            'MsgBox "Cette référence existe déjà"
    (ceci est inscrit dans "After_update" de mon formulaire sur la case [référence facture])
    Nom : Capture.PNG
Affichages : 407
Taille : 8,1 Ko


    Cependant, j'aurai voulu aller un peu plus loin et faire en sorte que le message d'erreur apparaisse lorsque je clique sur le bouton "Ajouter" si la référence ET le Montant ET la date sont les mêmes qu'un ancien enregistrement. J'ai essayé avec des select case ou alors Iif AND, mais chaque fois il me débogue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Commande9_Click()
     
    Select Case [référence facture]
     Case Not IsNull(DLookup("[référence facture]", "Factures", "[référence facture]='" & Me.référence_facture & "'"))
    Case Not IsNull(DLookup("[Montant]", "Factures", "[Montant]='" & Me.Montant & "'"))
      MsgBox "enregitsrement déjà présent"
     
     Case Else
     
     DoCmd.GoToRecord , , acNext
     
     
     End Select
     
    End Sub
    J'ai vu aussi la proposition avec l'indexe sans doublon, mais il ne l'applique que pour une colonne.


    Est-ce qu'il est possible de faire en sorte qu'il empêche l’enregistrement si les 3 composantes d'un enregistrement sont les mêmes qu'un précédent ?

    merci bien

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 769
    Points : 14 810
    Points
    14 810
    Par défaut
    bonsoir,
    J'ai vu aussi la proposition avec l'indexe sans doublon, mais il ne l'applique que pour une colonne.
    non, il suffit de créer un index composé (primaire ou non):
    Nom : tbl_pk_composée.JPG
Affichages : 333
Taille : 43,0 Ko
    c'est plus simple et plus efficace que ta tentative d'utilisation de Select Case
    j'avais trouvé une formule pour éviter les doublons qui fonctionnait très bien :
    ceci est inscrit dans "After_update" de mon formulaire sur la case [référence facture]
    c'est bizarre car sur After Update c'est déjà trop tard puisque déjà enregistré dans la table, sauf si, bien sur, il n'y a pas de table et que ce sont des contrôles indépendants (sans source de données)

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    J'ai vu aussi la proposition avec l'indexe sans doublon, mais il ne l'applique que pour une colonne.
    Absolument pas, tu peux avoir un index unique composé d'autant (ou presque) de champs que tu veux.
    1. Tu vas en mode création de la table dans les index(via l'icône avec un éclair).
    2. Tu te mets sur une ligne vierge et dans la 1ère colonne tu entres un nom (ex : Unicite).
    3. Dans la seconde colonne tu choisis le 1er champ que tu veux (ex : référence)
    4. en bas sous la liste tu coches Unique.
    5. Après tu reviens dans la liste et toujours dans la 2ième colonnes tu choisis le 2ième champ (ex :Montant)
    6. Même chose sur la 3ième ligne ou tu choisis le dernier champ (la date).
    7. Tu fermes la fenêtre des index.
    8. Tu sauvegardes.


    Et voilà avec cela Access va et crier dessus si tu essayes de mettre 2 fois exactement les même données.
    Attention cela ne sera un "gentil" message explicatif mais un truc du genre "Erreur 3022, Il y a un doublon."
    Donc soit tu mets du code pour gérer l'erreur
    (ici une discussion sur ce sujet https://p2p.wrox.com/access/37362-ha...dex-error.html)

    Soit tu testes préalablement.

    Pour tester avant que l'enregistrement existe tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim critere as string
    critere="[Reference]=""" & me.Reference & """" 'Suppose que la référence est un texte.
    critere = critere & " and [Montant]=" & me.Montant
    critere = critere & " and [Date]=#" & format(me.Date,"yyyy-mm-dd") & "#"
     
    if not insull(dfirst("Reference","Factures", critere)) then
        msgbox "Référence, Montant et Date existent déjà"
    end if
    Passer par une variable temporaire pour l'écriture du critère facilite la mise au point et le débogage.
    Tu peux valider ce que cela contient avant de t'en servir vraiment.

    A+

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 547
    Points
    24 547
    Par défaut
    Bonjour,

    Depuis un formulaire tu peux traiter les erreurs en utilisant l'évènement Sur Erreur.

    Cf le tuto sur les évènements sur ma page perso.

    Cordialement,

  5. #5
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Novembre 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2019
    Messages : 108
    Points : 78
    Points
    78
    Par défaut
    Un tout grand merci pour vos réponses, ça m'aide énormément !

    bien à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. javascript array > éviter doublons
    Par taffMan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/12/2007, 11h56
  2. conflit d'ecriture VBA Access 2003 SQL
    Par christian81 dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/09/2007, 10h30
  3. [VBA-A]Doublon et Combobox
    Par VitamineC dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/06/2007, 21h20
  4. [VBA-A] Doublons dans un champs
    Par dev81 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/05/2007, 09h42
  5. Formulaire, éviter doublons
    Par faulk dans le forum Access
    Réponses: 3
    Dernier message: 11/09/2006, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo