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 :

Update d'une table à partir d'une requéte selection


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2007
    Messages : 85
    Points : 68
    Points
    68
    Par défaut Update d'une table à partir d'une requéte selection
    Bonjour,


    J'ai une première requête (Sel_tbl_bene) selection qui selectionne dans une table un certain nombre d'enregistrement et de champs.

    Je souhaite mettre à jour une autre table (Tbl_bénéficiaire) à partir des résultats de la requête.

    Dans Tbl_bénéficiaire existe le champ Num_conv qui est indexé sans doublons et dans Sel_tbl_bene, il y a aussi un champ Num_conv issu d'un regroupement qui fait qu'en théorie il est aussi sans doublons.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Tbl_Bénéficiaire INNER JOIN Sel_tbl_bene ON Tbl_Bénéficiaire.Numero_conv = Sel_tbl_bene.Num_conv SET Tbl_Bénéficiaire.Produit = [Sel_tbl_bene].[Produit];

    Et voici le message d'erreur que j'obtiens lorsque je veux exécuter le requête :

    "L'opération doit utiliser une requête qui peut être mise à jour"

    Si quelqu'un peut m'expliquer ce que cela veut dire, j'en serai bien heureux.

    Merci.

    Xorbane

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut Xorbane et bienvenu,

    cette synthaxe fonctionne correctement s'il s'agit de table.
    ce qui veut dire que tu as un pb du au fait que [Sel_tbl_bene] est une requete.

    tu peux reconstruire ta requete update avec un dlookup et une clause where ce qui t'évitera ce déboire.

    comme tu le dis cela proviendrait surement que:
    Citation Envoyé par Xorbane
    dans Sel_tbl_bene, il y a aussi un champ Num_conv issu d'un regroupement qui fait qu'en théorie il est aussi sans doublons
    [Sel_tbl_bene].Num_conv ne doit pas garantir l'unicité dans le 'ON'.


  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2007
    Messages : 85
    Points : 68
    Points
    68
    Par défaut Dlookup ?
    Bonsoir,

    Merci pour ta réponse... Mais je ne sais pas utiliser la fonction Dlookup... et je n'ai pas bien compris non plus avec l'aide access
    J'ai bien trouvé des exemples d'utilisation sur le forum mais cela reste assez sibyllin pour moi.

    Voici ma requête Sel_tbl_bene si cela peut éclairer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCTROW Fusion.Num_conv, Fusion.Produit, First(Fusion.Titre) , First(Fusion.Sexe), First(Fusion.Nom_usage), First(Fusion.Prénom), First(Fusion.Nom_naissance), First(Fusion.Date_naissance), Min(Fusion.Age)
    FROM Fusion
    GROUP BY Fusion.Num_conv, Fusion.Produit
    ORDER BY Fusion.Num_conv;
    Cela me permet d'obtenir des enregistrements qui sont sans doublons pour Num_conv en utilisant le regroupement à partir de la table fusion qui elle peut contenir des doublons de Num_conv

    Peux-tu m'indiquer la marche à suivre pour que je puisse mettre à jour chaque enregistrement de Tbl_bénéficiaire pour lequel existe un enregistrement dans Sel_tbl_bene sachant que le lien se fait grâce à Num_conv?

    Merci pour ton aide.

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    effectivement cette requete ne garanti pas l'unicité de Num_conv.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Tbl_Bénéficiaire SET Tbl_Bénéficiaire.Produit = DLookup("Produit","Fusion","Num_conv="+CStr(Tbl_Bénéficiaire.Numero_conv))
    devrait te convenir, mais il faut faire attention si (il est sous entendu que) tu peux avoir plusieurs Fusion.Num_conv identique... il y a encore DFirst(), DLast() ou adapter le critère de DLookup pour avoir le bon <Produit> en fonction de tes besoins.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2007
    Messages : 85
    Points : 68
    Points
    68
    Par défaut
    Salut Vodiem,

    Effectivement dans la table Fusion, le champ "Num_conv" contient des doublons, c'est pourquoi initialement j'avais pensé utiliser la requête Sel_tbl_bene qui me permettait de regrouper les valeurs de "Num_conv" et éliminer les doublons. Pour les autres champs (Produit, Titre, Sexe...), j'utilise d'autres fonctions de regroupement (premier, max...) qui me permette de ne garder qu'une valeur (normalement les valeurs sont les mêmes... pour une même convention, la personne ne devrait pas changer de sexe ).

    Il s'agit donc pour moi de mettre à jour une table Tbl_bénéficiaire avec Num_conv comme clé primaire indexé sans doublon et les champs : produit, sexe, titre... non indexé et avec doublons.
    comme pour sexe, produit ne peut être que unique pour une convention, c'est à dire que pour une convention n'existe qu'un produit comme il n'existe qu'un sexe ou qu'un titre.

    Lorsque j'exécute le code que tu m'a transmis en mode feuille de données, tous les enregistrements de Tbl_bénéficiaires apparaissent même si il n'ont pas de correspondance dans Fusion avec comme champ commun la valeur de "Num_conv". Cela me parait normal puisque tous les enregistrements de la table de destination sont susceptible d'être mis à jour mais que seuls ceux qui ont une correspondance dans la table initiale le seront.

    et lors que j'essaie d'exécuter la requête, j'obtiens le message d'erreur suivant "Microsoft Access n'a pas mis à jour X champ à cause d'un échec de conversion de type"

    Est-ce dû au problème que tu avançais sur la gestion des doublons de "Num_conv" dans Fusion:

    il faut faire attention si (il est sous entendu que) tu peux avoir plusieurs Fusion.Num_conv identique
    ou bien est-ce lié au fait que le résultat de DLookup ne serait pas compatible avec le type de champ de Tbl_bénéficiaire (pourtant tout les champs sont de type texte) ?

    Là encore je suis bien en peine de trouver une solution.

    Merci de bien vouloir m'aiguiller.

    Xorbane

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    le dlookup renvoie la première occurence trouvé correspondant au critère: Numero_conv = Num_conv.
    puisque pour ce même critère tu ne peut avoir qu'une seul valeur pour <produit>, ca va il n'y aura pas de pb.

    "Microsoft Access n'a pas mis à jour X champ à cause d'un échec de conversion de type"
    cela viens effectivement d'un problème de type.

    cela devrait mieux marché avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Tbl_Bénéficiaire SET Tbl_Bénéficiaire.Produit = "'"+DLookup("Produit","Fusion","Num_conv="+CStr(Tbl_Bénéficiaire.Numero_conv))+"'"

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2007
    Messages : 85
    Points : 68
    Points
    68
    Par défaut On avance... tu avances
    Salut Vodiem,

    c'était presque ça, les quotes doivent en fait entourer l'expression CStr... Merci (je n'avais pas pensé à mettre des quotes):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Tbl_Bénéficiaire SET Tbl_Bénéficiaire.Produit = DLookUp("Produit","Fusion","Num_conv="+"'"+CStr([Tbl_Bénéficiaire].[Numero_conv])+"'");
    Mais il reste encore un petit problème, tous les enregistrements de "Tbl_bénéficiaire" qui ont une correspondance dans "Fusion" sont correctement mis à jour.

    Mais les enregistrements de Tbl_bénéficiaire qui n'ont pas de correspondance dans Fusion voient la valeur du champ "Produit" effacées.

    C'est bien embêtant. Est-ce dû au fonctionnement de Dlookup ?

  8. #8
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    , oui.
    tu as deux possibilités pour éviter cela:
    l'inner join et le where.
    la jointure reste la plus simple à mettre en oeuvre.

    par l'inner join:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Tbl_Bénéficiaire INNER JOIN Fusion ON Numero_conv=Num_conv SET Tbl_Bénéficiaire.Produit = DLookUp("Produit","Fusion","Num_conv="+"'"+CStr([Tbl_Bénéficiaire].[Numero_conv])+"'");

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2007
    Messages : 85
    Points : 68
    Points
    68
    Par défaut Ca fonctionnne
    Grand merci Vodiem,

    Ça fonctionne parfaitement. Pour le coup de la jointure... j'aurais pu réfléchir un peu, je l'avais prévu dans mon premier post.

    Merci et bonne continuation.

    Xorbane

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. [D7],[Access], update d'une table à partir d'une autre
    Par iam dans le forum Bases de données
    Réponses: 4
    Dernier message: 06/11/2006, 18h14
  3. Création d'une table à partir d'une requête
    Par pedroleouf dans le forum Administration
    Réponses: 16
    Dernier message: 25/10/2006, 18h18
  4. Update d'une table à partir d'une autre
    Par nicoaix dans le forum Access
    Réponses: 5
    Dernier message: 09/03/2006, 11h36
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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