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 table à partir d'une autre table


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 29
    Points : 15
    Points
    15
    Par défaut Update table à partir d'une autre table
    Bonjour à tous,

    Je souhaiterai mettre à jour ma table "T_Produit" à partir des élément d'une autre table intitulé "PPI".
    Tous 2 ont un champ appelé "référence" caractérisant le produit concerné (permettant la jointure).
    Dans ma table "PPI" j'ai un champ "PPI TTC" désignant le prix public de mon produit.
    Je souhaiterai donc, mettre à jour le champ "PPI" de la table T_Produit à partir des valeurs de la table "PPI"

    J'ai fait quelques tentative mais j'ai toujours un message d'erreur lors de l'execution.

    Voici mon code ci dessous, si quelqu'un peut m'aider :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Public Sub B_ProdMaj_Click()
    On Error GoTo Err_B_ProdMaj_Click
    
    'MAJ table Produit et Produit1 depuis extraction Iseries
    ExecutionSQL ("delete * FROM T_Produits;")
    ExecutionSQL ("delete * FROM T_Produits1;")
    
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_Produits1", "\\frwsf0002\cogene\RRR\Etiquette\Produits.xls", True
    
    Docmd.RunSql ("INSERT INTO T_Produits ( PNC, Référence, Désignation, STK, SBG, [Sales Company] ) SELECT T_Produits1.AAAANB, T_Produits1.AABTTX, T_Produits1.AAAATX, T_Produits1.AACKVA, T_Produits1.AACLCD, T_Produits1.AAFGCD FROM T_Produits1;")
    
    Docmd.RunSql ("Update T_Produits set T_Produits.PPI = (Select [PPI].[PPI TTC] from PPI, T_Produits where T_Produits.Référence = [PPI].[Réf]) where T_Produits.Référence = (Select PPI.Réf from PPI, T_Produits where T_Produits.Référence = PPI.Réf);") --> C'est la que je bloque !
    
    MsgBox ("Mise à jour des produits terminé !")
    
    Exit_B_ProdMaj_Click:
        Exit Sub
    
    Err_B_ProdMaj_Click:
        MsgBox Err.Description
        Resume Exit_B_ProdMaj_Click
    
    
    End Sub
    (PS: J'arrive à effectuer mon update en utilisant des recordset, mais la MAJ est assez longue via ce procédé. Donc si quelqu'un s'y connait mieu que moi en SQL je lui serait très reconnaissant )

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour,
    Comme on est en sql je ne parlerais que de la requête, et je voudrais te signaler que l'on ne fais plus les jointures comme ça depuis des années.
    En effet séparer les tables par des virgules effectue un produit cartésien de ces tables ou est appliquée ensuite la condition.

    la requête modifiée deviendrait donc:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    UPDATE
        [T_Produits]
    SET
        [T_Produits].[PPI] = (
                              SELECT
                                  [PPI].[PPI TTC],
                              FROM
                                  [PPI]
                                  INNER JOIN
                                      [T_Produits]
                                      ON
                                          [T_Produits].[Référence] = [PPI].[Réf]
                             )
    WHERE
        [T_Produits].[Référence] = (
                                    SELECT
                                        [PPI].[Réf]
                                    FROM
                                        [PPI]
                                        INNER JOIN
                                            [T_Produits]
                                            ON
                                                [T_Produits].[Référence] = [PPI].[Réf]
                                   )

    Désolé si la présentation n'est pas génialissime j'ai l'habitude d'indenter pour y voir plus clair, en espérant avoir été utile !

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Salut a toi Sehnsucht

    Je vais tester ça et je te tiens au courant rapidement.

    Pour ta présentation, ne t'excuse pas, je trouve au contraire que c'est beaucoup plus lisible de cette manière la

    Merci bien

    Bonne journée

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 730
    Points : 57 434
    Points
    57 434
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    Ce ne serait pas plus simple avec :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T_Produits INNER JOIN PPI ON T_Produits.Référence = PPI.Réf SET PPI = [PPI TTC];

    Ou me trompé-je quelque part ?

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Je n'étais pas au courant de la possibilité de faire des jointures dans un UPDATE après quelques recherches je suis dubitatif car ici on dit que ce n'est pas supporté, néanmoins quelqu'un en réalise (avec des tables en mémoire) par contre comme la syntaxe diffère je mets l'équivalent pour le cas en cours, sans être sûr que cela fonctionne

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    UPDATE
        tp
    SET
        tp.PPI = p.[PPI TTC]
    FROM
        T_Produits tp
        INNER JOIN
            PPI p
            ON
                tp.[Référence] = p.[Réf]

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    J'ai essayé la requete mais j'ai un message du type "L'opération doit utiliser une requete qui peut etre mise à jour" !

    Pensant que c'etait un problème de "guilemet" ou autre, j'ai essayé divers syntaxe mais ca ne marche pas :

    Voici ma requete SQL pour rappel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DoCmd.RunSQL ("Update [T_Produits] SET [T_Produits].[PPI] = (SELECT [PPI].[PPI TTC] FROM [PPI] INNER Join [T_Produits] ON [T_Produits].[Référence] = [PPI].[Réf]) " & _
            " WHERE [T_Produits].[Référence] = ""(SELECT [PPI].[Réf] FROM [PPI] INNER Join [T_Produits] ON [T_Produits].[Référence] = [PPI].[Réf])"" ;")
    (J'ai ajouter les "guillemet" dans le Where car ma référence est un champ texte. Par contre mon champ PPI est de type monétaire et je ne sais pas quoi mettre exactement.

    Merci d'avance

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 730
    Points : 57 434
    Points
    57 434
    Billets dans le blog
    42
    Par défaut
    Non, ce n’est pas un problème de guillemets.

    Le message "L'opération doit utiliser une requête qui peut être mise à jour" indique simplement que l’opération avec des sous-requêtes utilisant la même table que celle devant être mise à jour n’est pas autorisée sous Access.

    Par contre, l’UPDATE sur des tables jointes fonctionne sous Access :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Docmd.RunSQL ("UPDATE T_Produits INNER JOIN PPI ON T_Produits.[Référence] = PPI.[Réf] SET PPI = [PPI TTC];")

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Re-Bonjour à tous,

    En effet, je me prenais vraiment trop la tête, mais access n'est pas si bête que ça en fin de compte !

    C'est carrément plus facile comme ça et ça fonctionne très bien, avec un temps de MAJ très acceptable en plus (avec les recordset qui parcourait toute ma table à chaque ligne MAJ, c'était vraiment pas possible !)

    Merci à vous pour ce coup de pouce !

    A bientot surement

    Daimadoshi

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut remarques
    Petite remarque en passant, l'UPDATE ne fonctionne pas si la table de jointure est une requête.

    A ce moment, il faut créer une table à partir de la requête avec la commande SELECT * INTO nom_de_table FROM nom_de_requete et utiliser cette table dans la requête UPDATE

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

Discussions similaires

  1. update d'une table à partir d'une autre table
    Par sab_info dans le forum Développement
    Réponses: 1
    Dernier message: 11/04/2013, 10h06
  2. SQL Update d'une table à partir d'une autre table
    Par Jean-Marc68 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/03/2007, 13h22
  3. Réponses: 4
    Dernier message: 03/06/2006, 12h45
  4. remplir un champ d'une table à partir d'une autre table
    Par MrsFrizz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/02/2005, 16h48
  5. Réponses: 5
    Dernier message: 06/01/2005, 12h07

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