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

Requêtes et SQL. Discussion :

requête ajout qui ne crée pas de doublons


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut requête ajout qui ne crée pas de doublons
    Bonjour à toutes et tous,

    Je vais essayer d’être clair et concis… Dans une base de données Access 2003, j’ai deux tables :

    • T_Stagiaires (ID_Stagiaire, Nom, Prénom + diverses infos) : chaque entrée représente une personne
    • T_Journées (ID_Journée + date + diverses infos) : chaque entrée représente une journée de cours


    J’ai une troisième table pour gérer les présences de chaque stagiaire pour chacune des journées :

    • T_Présences (REF_Stagiaire, REF_Journée, EstPrésent (Oui/Non))


    J’ai créé une requête Ajout qui crée tous les enregistrements dans T_Présences (exemple : 6 stagiaires et 30 journées : 6 x 30 = 180 entrées dans T_Présences)

    Ca marche très bien si ma table T_Présences est vide. Par contre, si les enregistrements existent déjà dans T_Présences et que je ré-exécute ma requête Ajout, les 180 enregistrements sont une nouvelle fois ajoutés.

    Ma question est : comment faire pour que ma requête Ajout crée les enregistrements uniquement s’ils n’existent pas déjà (c'est-à-dire uniquement si la paire REF_Stagiaire – REF_Journée n’est pas encore présente dans T_Présences) ?

    Le but du jeu, c’est de pouvoir ré-exécuter la requête quand on ajoute de nouveaux stagiaires ou de nouvelles dates pour ajouter facilement les enregistrements manquants dans T_Présences

    Ma requête ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T_Présences ( REF_Stagiaire, REF_Stagiaire )
    SELECT T_Stagiaires.ID_Stagiaire, T_Journées.[ID_Journée]
    FROM T_Stagiaires, T_Journées;
    J’ai une solution qui ne me convient qu’à moitié : j’ai défini une clé primaire composite dans T_Présences, composée de la paire REF_Stagiaire – REF_Journée. Quand je ré-exécute la requête, un message d’erreur me prévient que certains enregistrements ne peuvent pas être créés car « violation de clé » (normal, puisqu’on ne peut pas avoir 2 clés primaires identiques dans une même table) et je peux cliquer sur « Oui » pour ignorer et exécuter la requête quand même. Je n’aime pas trop car je ne serai pas l’utilisateur final et celui-ci ne comprendra certainement pas le message d’erreur…

    Merci à toute personne qui pourra m’éclairer

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    J’ai une solution qui ne me convient qu’à moitié
    A mon avis, c'est la plus simple et la plus sûre.

    un message d’erreur me prévient...
    Essaie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim strSql As String
     
    strSql = "INSERT INTO T_Présences ( REF_Stagiaire, REF_Stagiaire ) " & _
             "SELECT T_Stagiaires.ID_Stagiaire, T_Journées.[ID_Journée] "  & _
             "FROM T_Stagiaires, T_Journées;"
     
    CurrentDb.Execute strsql, dbFailOnError
    Tu ne devrais pas avoir de message d'avertissement et tu as une gestion d'erreur en prime.

    Domi2

  3. #3
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    Merci Domi2, et désolé pour le retard mais j'avais d'autres chats à fouetter

    J'ai essayé ta méthode, mais ça ne fonctionne pas comme je voudrais. L'exécution de ce code provoque bien une erreur (puisque j'ai déjà des données dans T_Présences) mais je ne sais pas trop comment gérer l'erreur et surtout comment forcer l'exécution malgré l'erreur.

    J'ai donc trouvé une autre solution en trois étapes :

    1) construction d'une requête R_TousLesCouplesStagiaireJournée pour trouver toutes les combinaisons possibles [Stagiaire, Journée]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T_Stagiaires.ID_Stagiaire, T_Journée.ID_Journée
    FROM T_Journée, T_Stagiaires;
    2) construction d'une requête de non correspondance pour trouver les combinaisons manquantes R_CouplesStagiaiesJournéeManquants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT R_TousLesCouplesStagiaireJournée.ID_Stagiaire,
               R_TousLesCouplesStagiaireJournée.ID_Journée,
               T_Présences.REF_Stagiarie, 
               T_Présences.REF_Journée
    FROM R_TousLesCouplesStagiaireJournée LEFT JOIN T_Présences
    ON (R_TousLesCouplesStagiaireJournée.ID_Journée = T_Présences.REF_Journée)
         AND (R_TousLesCouplesStagiaireJournée.ID_Stagiaire = T_Présences.REF_Stagiarie)
    WHERE (((T_Présences.REF_Stagiarie) Is Null) AND ((T_Présences.REF_Journée) Is Null));
    3) Création d'une requête "ajout" pour ajouter à T_Présences les couples manquants R_AjouterPrésencesManquantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T_Présences ( REF_Stagiarie, REF_Journée )
    SELECT R_CouplesStagiaiesJournéeManquants.ID_Stagiaire, R_CouplesStagiaiesJournéeManquants.ID_Journée
    FROM R_CouplesStagiaiesJournéeManquants;
    Ca marche très bien. On va donc dire

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

Discussions similaires

  1. Requête AJOUT qui ne fonctionne pas complètement
    Par cgteddy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/07/2013, 21h53
  2. requête match qui ne fonctionne pas.
    Par sam01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/05/2006, 20h28
  3. [MySQL] requête upload qui ne marche pas en local
    Par stuef dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/03/2006, 17h32
  4. [MySQL] Requête update qui ne fonctionne pas
    Par Sylvain245 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/12/2005, 16h40
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

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