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

Access Discussion :

Comment savoir si une insertion a marché ?


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Par défaut Comment savoir si une insertion a marché ?
    Bonjour à tous,


    sur une application multi-postes, on insère des enregistrements dans une même table. Je génère manuellement (dmax+1) l'identifiant du nouvel enregistrement avant de faire mon insert.
    Or je sais que dans certains cas mon insert ne sera pas fait car un autre utilisateur a déjà pu avoir inséré un enregistrement avec le meme identifiant.

    Je voudrai donc tester si mon insert a marché convenablement.
    Mais aucune erreur n'est levée alors qu'il y a un doublon de clé primaire.
    Ma requête d'insertion affiche bien un message d'erreur de clé sous Access mais en VBA, rien, aucun message !!

    Si vous avez une idée, je suis preneur parce que la...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2003
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2003
    Messages : 116
    Par défaut
    et pquoi ne pas utiliser un numéroauto? ça serait plus fiable et tu serais sur que ton insertion marcherait.

    An plus si deux utilisateurs peuvent avoir le même identifiant c'est que l'attribution de cet identifiant ne se fait pas lors de l'enregistrement. Et c'est à ce niveau là que tu devrais revoir le code.

  3. #3
    Membre expérimenté
    Avatar de Trini
    Homme Profil pro
    Dresseur de puce
    Inscrit en
    Juillet 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dresseur de puce

    Informations forums :
    Inscription : Juillet 2005
    Messages : 189
    Par défaut
    Bonjour,

    Tu dis que tu as essayé en VBA, c'est quoi tes lignes de code ?
    Parce que avec une petite gestion d'erreur tu dois pouvoir rattrapper l'erreur.

    Salut,

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Salut,

    Y a pas de gestion d'erreur VB pour les requêtes SQL, sauf si la requête est explicitement annulée par l'utilisateur lorsque les avertissements sont actifs.

    Par contre tu peux récupérer le nombre d'enregistrements sur lequel la requête a agit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim db As Database
    Set db = CurrentDb
    db.Execute "insert into ..."
    MsgBox db.RecordsAffected
    Donc si c'est 0 ben c'est qu'il y a eu une erreur.

  5. #5
    Rédacteur/Modérateur


    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 649
    Billets dans le blog
    67
    Par défaut
    Salut,

    Si tu es au niveau de ton formulaire tu peux faire sur beforeInsert de ton form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_BeforeInsert(Cancel As Integer) 
     
    ..... 
     
    Me!num = DMax("[num]", "maTable") + 1 
     
    End Sub
    et récupérer l'erreur en cas de doublon:
    sur l'évenement error de ton form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Error(DataErr As Integer, Response As Integer) 
     
        If DataErr = 3022 Then 'erreur doublon 
        Response = acDataErrContinue 
        Me!num = DMax("[num]", "maTable") + 1  'recalcule le Me!num 
     
        End If 
     
     
    End Sub
    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre expérimenté
    Avatar de Trini
    Homme Profil pro
    Dresseur de puce
    Inscrit en
    Juillet 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dresseur de puce

    Informations forums :
    Inscription : Juillet 2005
    Messages : 189
    Par défaut
    Re,

    Pour récupérer une erreur sur une requete SQL en VBA il faut ajouter DbFailOnError après l' Execute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    db.Execute "insert into ..." ,DbFailOnError
    Un On Error et hop, on gère !

    Salut

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    le mieux serait de laisser access gérer la clef en automatique

    mais si pour des raisons que j'ignore tu tiens à ton système il va falloir
    utiliser des transactions

    pour cela regarde dans l'aide et dans la faq mots clefs transaction
    rollback

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 5
    Par défaut
    ok merci beaucoup à vous tous pour vos réponses

    au final c'est la solution de Trini qui marche avec le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.Execute "insert into ..." ,DbFailOnError

    Je pense que c'est la solution la plus adaptée à mon problème (je ne pouvais pas utiliser le numéroAuto car j'avais besoin de garder de "petits" identifiants)

    A noter que le db.recordsAffected me retournait 0 à chaque fois, que la requête marche ou ne marche pas.

    Merci encore, toujours bien efficace ce forum ...

    et bonne journée !

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

Discussions similaires

  1. Comment savoir qu'une fonction a bien marché?
    Par muaddibx dans le forum Administration système
    Réponses: 2
    Dernier message: 27/03/2009, 12h21
  2. Réponses: 2
    Dernier message: 04/08/2007, 09h27
  3. Comment savoir si une requete INSERT INTO a bien marché ?
    Par Whattt dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 09h06
  4. Comment savoir qu'une fonction est standard ?
    Par D[r]eadLock dans le forum C
    Réponses: 5
    Dernier message: 24/03/2003, 15h42
  5. Réponses: 4
    Dernier message: 10/09/2002, 18h09

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