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 :

Update à partir d'un select


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Update à partir d'un select
    Bonjour,

    Sous access je cherche simplement à faire en SQL un update d'une table à partir d'un select count d'une autre table.

    J'ai essayer les syntaxes suivantes mais sans succès :
    • update test2 set nbr from (select count(id) from test1 where test1.valeur = test2.valeur)
    • update test2 set nbr = (select count(id) from test1 where test1.valeur = test2.valeur)
    • update test2 set nbr = Dcount( "*", "test1", "test1.valeur = test2.valeur")


    Bon en clair je galère et je n'arrive pas à trouver de l'aide sur le web.

  2. #2
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 968
    Points : 8 420
    Points
    8 420
    Par défaut
    bonsoir,
    la dernière solution est la bonne, après une petite correction:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update test2 set nbr = Dcount( "*", "test1", "valeur=" & test2.valeur)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  3. #3
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Un grand merci

    Cela fonctionne.

    Sans abuser mais tout de même ...

    Juste pour être sûr, n'y a t-il pas moyen de faire un Update du style update test2 set nbr from (select count(id) from test1 where test1.valeur = test2.valeur) qui permet d'être plus proche d'un SQL classique ?

    De plus je me demande comment faire
    1 - Pour mettre à jour plusieurs champs en une seule passe -> Peut-on dans Dcount mettre à jour plusieurs champs ou faut-il le faire plusieurs fois ?
    2 - Comment faire un Update qui va rechercher des valeurs dans une autre table en mélangeant des valeurs unitaire avec des count ?
    Du style : (update test2 set nbr, libellé (select count(id), libellé from test1 where test1.valeur = test2.valeur group by valeur,libellé) <- l'exemple n'est pas forcément le plus représentatif

  4. #4
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 968
    Points : 8 420
    Points
    8 420
    Par défaut
    Juste pour être sûr, n'y a t-il pas moyen de faire un Update du style (update test2 set nbr from (select count(id) from test1 where test1.valeur = test2.valeur) qui permet d'être plus proche d'un SQL classique ?
    non car le SQL d'Access (qui n'est pas 100% standard) ne permet pas de faire des mises à jour avec des requêtes de regroupement, d'où l'obligation de passer par les fonctions de domaine...
    De plus je me demande comment faire
    1 - Pour mettre à jour plusieurs champs en une seule passe -> Peut-on dans Dcount mettre à jour plusieurs champs ou faut-il le faire plusieurs fois ?
    en une seule passe c'est possible: il faut mettre un Dcount() par champ mais les performances peuvent se dégrader rapidement avec des tables volumineuses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update test2 set nbr = Dcount( "*", "test1", "valeur=" & test2.valeur),
     nbr3 = Dcount( "*", "test1", "valeur3=" & test2.valeur3), 
     nbr4 = Dcount( "*", "test1", "valeur4=" & test2.valeur4);
    2 - Comment faire un Update qui va rechercher des valeurs dans une autre table en melangant des valeurs unitaire avec des count ?
    Du style : (update test2 set nbr, libellé (select count(id), libellé from test1 where test1.valeur = test2.valeur group by valeur,libellé)
    comme la première réponse ce ne sera pas possible avec des requêtes de regroupement, il faudra passer par des créations de tables intermédiaires créées pour l'occasion, certes ce n'est pas classique mais c'est la seule solution ou alors il y a la solution VBA mais alors il faut en maitriser l'utilisation.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  5. #5
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Pour finir

    En dehors de l'utilisation de la fonction Dcount (équivalent d'un select count) la syntaxe pour mettre à jour une table à partir d'une autre est la suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update test2,test1  set test2.valeur = test1.valeur where test2.id = test1.id

    Et d'après mes tests, pour mettre à jour une table seule une autre table peut être utilisée. Il ne semble pas possible d'utiliser une Query.

    Est-ce bien cela ?
    Existe-il une encore autre syntaxe ?

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 968
    Points : 8 420
    Points
    8 420
    Par défaut
    non, il est tout à fait possible d'utiliser une requête tant que cette requête ne fait pas de regroupement.
    Une sous-requête peut utiliser plusieurs tables:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE t_facture AS f,
    (SELECT codefacture, round(montant * taux,2) as TT_taxe FROM T_Facture_Detail  AS D, tbl_TVA WHERE Taux="A") as D
    SET f.mt_taxe = [mt_taxe]+[D].[TT_taxe] 
    WHERE (f.N°=[d].[codefacture]);
    La seule exception où l'utilisation d'un regroupement est possible c'est quand il est utilisé dans un critère:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE T_Facture AS f SET f.stRéglé = True
    WHERE (select sum(d.montant) from T_facture_Detail d where (d.codefacture) = f.commande)= f.[mt_contrat];

    Sinon on peut éviter de passer par les fonctions de domaine en utilisant le cumul (set champ = champ + 1):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE test2 INNER JOIN test1 ON test2.id = test1.id SET test2.nbr = test2.[nbr] + 1;
    attention, si le champ à mettre à jour est nul, il faut utiliser Nz() sinon il ne sera pas mis à jour:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SET test2.nbr = Nz(test2.nbr,0) + 1;
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  7. #7
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    6 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 6 420
    Points : 13 538
    Points
    13 538
    Billets dans le blog
    11
    Par défaut
    Salut,

    Citation Envoyé par tee_grandbois Voir le message

    Sinon on peut éviter de passer par les fonctions de domaine en utilisant le cumul (set champ = champ + 1):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE test2 INNER JOIN test1 ON test2.id = test1.id SET test2.nbr = test2.[nbr] + 1;
    attention, si le champ à mettre à jour est nul, il faut utiliser Nz() sinon il ne sera pas mis à jour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET test2.nbr = Nz(test2.nbr,0) + 1;
    Oui, c'est l'idée que j'avais eu également.

    Attention quand même, si la requête s'exécute plusieurs fois tu vas avoir des cumuls supplémentaires.

    Il faudrait donc prévoir une autre requête update pour mettre les compteurs à 0, avant l'exécution de la requête utilisant le cumul ;-)

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Mes tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion de rendez-vous sur un agenda hebdomadaire
    Intégration d'un planning basé sur le module de classe clPlanner
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Un document pour vous aider à créer un formulaire de saisie des pointages dans Access :
    Pré-remplissage de sous-formulaires

  8. #8
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 968
    Points : 8 420
    Points
    8 420
    Par défaut
    bonjour User,
    Il faudrait donc prévoir une autre requête update pour mettre les compteurs à 0, avant l'exécution de la requête utilisant le cumul ;-)
    cela me semblait évident au point que je n'en ai pas fait mention, mais c'est vrai, c'est mieux de le faire remarquer. Du coup, l'utilisation du Nz() est inutile si on met le champ à 0 au préalable.
    Merci.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  9. #9
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Vous êtes super

    Un grand merci pour ces réponses complètes

  10. #10
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 968
    Points : 8 420
    Points
    8 420
    Par défaut
    de rien.
    Pense à mettre le sujet en
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

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

Discussions similaires

  1. Update a partir d'un select
    Par olibara dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/10/2008, 20h03
  2. Update d'une table a partir d'un select recursif
    Par olibara dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/05/2008, 10h44
  3. Update a partir d'une selection
    Par choubak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/05/2007, 18h28
  4. [oracle 9i]update à partir d'une selection complexe
    Par Requin15 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/06/2006, 11h18
  5. UPDATE globale à partir d'un SELECT
    Par lilianen dans le forum Oracle
    Réponses: 2
    Dernier message: 28/11/2005, 16h55

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