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

VBA Access Discussion :

Forcer l'exécution d'une requête action en cas de violation de clé


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Forcer l'exécution d'une requête action en cas de violation de clé
    Bonjour à tous,

    Lors du déroulement du code dans mon programme, j'exécute une requête action qui ajoute des enregistrements à une table. Le code est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cnn As ADODB.Connection
    Set Cnn = CurrentProject.Connection
    Texte_SQL = "INSERT INTO .... SELECT .... WHERE ....;"
    Cnn.Execute Texte_SQL
    Simplement, lorsque au moins un des enregistrements à ajouter existe déjà dans la table, un erreur est générée (et rattrapable) et la requête n'est pas exécutée, pour cause de violation de clé notamment.

    Or, lorsque l'on fait la même manipulation 'à la main' à partir de l'onglet 'Requêtes', un message nous informe de la violation de clé, nous demande si l'on veut continuer, et, dans l'affirmative, n'ajoute à la table que les enregistrements inexistants, qui ne provoquent pas de violation de clé.

    Ma question est donc de savoir comment forcer par programme l'exécution de la requête comme je la force manuellement.
    Il y a bien entendu la possibilité de tester les enregistrements avant de les insérer, mais c'est une perte de temps dans l'exécution de mon programme.

    Merci à tous par avance !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello et bienvenue sur le forum
    Pourquoi utiliser une connexion ADODB?
    en effet, on peut utiliser des trucs plus simples comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DoCmd.SetWarnings False
    Texte_sql = "INSERT INTO .... SELECT .... WHERE ....;"
    DoCmd.RunSQL Texte_sql
    DoCmd.SetWarnings True

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Ou même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDB.Execute("INSERT INTO....")

    Il y a bien entendu la possibilité de tester les enregistrements avant de les insérer, mais c'est une perte de temps dans l'exécution de mon programme.
    A moins que tu n'aies une quantité impressionnante de données à traiter, perso c'est ce que j'utilise et ça marche très bien. Grâce à un objet DAO.recordset, je parcours le SELECT. Je fais un Dcount pour savoir s'il y a violation de clé et s'il n'y en a pas, je fais un INSERT INTO VALUES

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci Simplifi,

    C'est effectivement ce que je m'étais finalement résolu à faire...
    Néanmoins la portabilité du code est plus souple et plus efficace (tout du moins me semble-t-il) avec ADODB, alors que les méthodes de l'objet Docmd sont spécifiques à Access.

    Mais bon, cette solution règle le problème !
    Il reste que j'aurais bien aimé avoir la solution avec ADODB, et je vais continuer à chercher (à temps perdu, si je puis dire )
    Evidemment je viendrai mettre la solution ici si je parviens à l'obtenir.

    Encore merci. Bien cordialement,

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci Paidge,

    C'est aussi une solution. Pour ma part je n'utilise pas DAO dans la mesure où je peux faire autrement, toujours pour des raisons de portabilité éventuelle.
    Mes applications sont en général en structure frontale / dorsale, il y a donc le réseau entre les deux si je puis dire donc ouvrir un recordset et le parcourir via le curseur sur des paquets de 500 ou 1000 enregistrements à la fois me semble être de nature à dégrader les performances. Je crois que si j'avais dû conserver la solution du test des enregistrements, j'aurais fait une requête de non correspondance entre les données éventuelles à ajouter et celles contenues dans la table de destination, à laquelle j'aurais ajouté les enregistrements issus de cette requête.

    En tout cas mille mercis et c'est de la discussion que naît la lumière !

    Bien cordialement,

  6. #6
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Blaonambé,

    Pourquoi ne pas utiliser l'instruction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On Error GoTo <etiquette de gestion d'erreur >
    Dans la gestion d'erreur, il te suffit de tester la variable SQLState qui indique le code de l'erreur. ils suivent la norme SQL ANSI

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour Dumas.blr,

    En fait, je l'utilise déjà le tout, c'est de savoir comment forcer la requête ensuite

    Merci. Bien cordialement,

  8. #8
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Blaonambé,

    Pour moi, le plus simple serait de créer un recordset avec ta table et rajouter un flag insert. Tu ferais l'insert à partir de ce recordset en testant la valeur du flag insert.
    Lors de l'erreur, en fonction du SQLcode, tu peut mettre à jour ton flag dans le recordet en recherchant la clé de l'enregistrement, et recommencer l’opération d'insert

  9. #9
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Bonjour

    Dans la mesure ou un utilisateur est présent pour répondre à l'éventuelle question, il ne parait pas embarrassant d'utiliser la méthode DoCmd.RunSql, avec la commande SetWarnings mise à Vrai, non ?

    Ce n'est certes pas portable, mais c'est bien la manière exacte d'implémenter la fonctionnalité que tu demandes, qui est native à Access.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonsoir Mumen,

    Dans cette application destinée à des personnes qui n'ont qu'une très vague idée de ce qu'est l'informatique et surtout de ce que sont les bases de données , il me paraît impensable de leur infliger un message qui parle de violation de clé, etc ! et surtout d'y répondre...

    Merci et bonne soirée

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

Discussions similaires

  1. [AC-2010] Forcer l'exécution d'une requête d'action
    Par bokharisaad dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/04/2013, 10h22
  2. Forcer le choix du plan d'exécution d'une requête
    Par hmechbal dans le forum Oracle
    Réponses: 5
    Dernier message: 20/01/2011, 23h28
  3. Réponses: 1
    Dernier message: 05/12/2005, 23h24
  4. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  5. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48

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