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

Bases de données Delphi Discussion :

COmment modifier des valeurs dans une requête?


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut COmment modifier des valeurs dans une requête?
    Je dois utiliser une requête car j'ai plusieurs tables en relation maître/détail mais surtout des tables spécialisant une table générale (une forme d'héritage si on veut).

    La requête pour afficher les enregistrements ne pose pas de problème en soi, Access m'a généré ça sans problème (mais quelle tartine par contre .... ).

    Mon problème maintenant est: comment je fais pour éditer un tel enregistrement...

    Pour vous donner une idée de la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Tconduite.conduite_nom, Tconduite.conduite_desc, Ttypeconduite.type, Tcompany.com_name, Conduite_electricite.elec_tension, Conduite_electricite.elec_intensite, type_electricite.type_elec, Materiau_elec.mat_elec
    FROM (Tcompany INNER JOIN (Ttypeconduite INNER JOIN Tconduite ON Ttypeconduite.id_typeconduite = Tconduite.id_typeconduite) ON Tcompany.id_company = Tconduite.id_company) INNER JOIN (Materiau_elec INNER JOIN (type_electricite INNER JOIN Conduite_electricite ON type_electricite.id_type_elec = Conduite_electricite.id_type_elec) ON Materiau_elec.id_mat_elec = Conduite_electricite.id_mat_elec) ON Tconduite.id_conduite = Conduite_electricite.id_conduite;

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    quel sgbd, Access ?

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut
    oui, Access en effet.

    Peut-on modifier des valeurs directement dans une requête ou faut-il les modifier dans les tables?

    EDIT pour expliciter un peu le problème:

    Changer des valeurs dans une table: OK
    Changer des valeurs dans une table esclave avec un TDBLookupComboBox: OK
    Changer des valeurs dans une table esclave d'une table enfant d'une table de base: Moi pas savoir

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Tu ne peux pas modifier le resultat d'une requete avec une jointure (Pas d'édition/insertion/suppression).
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Comme d'hab. je n'ai peut être rien compris...
    Pour moi tu peux tout a fait changer une valeur d'une table utilisée avec une jointure.
    Si tu passes tes tables en pièces jointes je te donne un exemple de requête.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 48
    Points
    48
    Par défaut Je ne comprends pas
    Excuse moi mais je ne comprends pas vraiment ce que tu veux faire. Afficher les données renvoyées par ta requête, imprimer les données renvoyées par ta requête ou modifier les données de ta requête pour les insérer ensuite?

    Si tes jointures sont bien faites quand tu vas modifier dans la table maître les données dans les tables esclaves vont aussi se mettre à jour.
    Tu peux être plus claire s'il te plait?

  7. #7
    Membre régulier Avatar de Nzs26
    Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 136
    Points : 76
    Points
    76
    Par défaut
    Je confirmais les dire de Rayek.

    Ici, tu nous montre une requête de sélection. Les données obtenues ne peuvent donc être seulement exploitées pour de l'affichage.

    Pour modifier les tables en conséquent de ta requête, tu dois utiliser une requête d'insertion, de modification, ou alors un trigger : "si le résultat de la requête est ... alors le préciser dans tellle table ou modifier telle table en conséquent " !

    J'espère que ma réponse t'aidera

    NZs

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    L'assemblage d'un TUpdateSQL sur un TQuery issu d'une jointure, permet pour un artiste du SQL, de le faire, perso, je trouve cela impossible à maintenir, car c'est vicieux de cacher des SQL si complexe, ainsi avec la propriété UpdateObject affecté sur un TUpdateSQL, chaque Edit,Append,Post sera remplacé par le SQL équivalent, de façon implicite mais un peu trop "mystérieuse" à mon gout ...

    mieux vaut récupérer dans sa jointure les ID de chaque table, puis ensuite, avec une requête par table, faire les Update ...

    il y a aussi l'équivalent pour le TClientDataSet mais je ne sais plus son nom, ...

    Je pense aussi à SQLUpdate, SQLInsert, ... d'un objet TCustomDADataSet de CoreLab qui fournisse des accesseurs pour MySQL, Oracle, Access, ... assez intéressant ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par evarisnea Voir le message

    quel sgbd, Access ?
    Citation Envoyé par thibouille Voir le message
    oui, Access en effet.
    Citation Envoyé par Nzs26 Voir le message
    Pour modifier les tables en conséquent de ta requête, tu dois utiliser une requête d'insertion, de modification, ou alors un trigger : "si le résultat de la requête est ... alors le préciser dans tellle table ou modifier telle table en conséquent " !
    l'usage des triggers est en effet une solution, mais Access jusqu'à preuve du contraire ne les implémente pas malheureusement.

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut
    C'est donc moi qui m'y prend mal...

    Bon je dispose de 4 tables: 1 maître et 3 "esclaves". En réalité il s'agit d'héritage: les 3 autres tables ont donc la même clé que la table "maître" (logique). Bien évidemment dans ce cas l'héritage est exclusif.

    Bon je fais une requête pour sélectionner les champs à afficher de la table maître et une 2e requête pour les champs de la table enfant, liée à la première (comme indiqué dans la faq) pour que la sélection de l'enregistrement n°XY sur la table parent entraine l'affichage des champs correspondant de la table enfant.

    Ca, ça marche très bien. Mais voilà, pour éditer/ajouter je sèche. J'ai bien utilisé AdoqueryX.edit ou .append. Ca marche presque en fait mais il me fait toujours une erreur comme quoi mon dataset n'est pas en mode append ou edit, ce qui est idiot, j'ai vérifier 50 fois.

    De ce que je comprends c'est moi qui m'y prends comme un manche
    Mais comment faire alors? Je change des valeurs et puis?

    Je suis paumé là, complètement ...

    SQL de la requête "parent":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Tconduite.id_conduite, Tconduite.id_company, Tconduite.id_typeconduite, Tconduite.conduite_nom, Tconduite.conduite_desc, Tconduite.conduite_contenu
    FROM Tconduite;
    SQL de la requête "enfant":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select * from Conduite_electricite WHERE Conduite_electricite.id_conduite =:id_conduite;

  11. #11
    Membre régulier Avatar de Nzs26
    Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 136
    Points : 76
    Points
    76
    Par défaut
    l'usage des triggers est en effet une solution, mais Access jusqu'à preuve du contraire ne les implémente pas malheureusement.
    Pour Access, autant pour moi, j'avoue que je suis pas trop fan donc je me pense pas trop dessus !

    Sinon pour ton problème, je pense avoir compris ton soucis mais tu ne peux pas éditer / ajouter en utilisant SELECT. Pour insérer dans plusieurs table, je te conseille d'exécuter à la suite les différentes requêtes d'insertion :

    INSERT TABLE MAITRE
    INSERT TABLE HERITEE 1
    INSERT TABLE HERITEE 2
    INSERT TABLE HERITEE 3

    Et procéder de la même manière pour la modification.

    Je ne vous que cette solution, ou alors j'ai vraiment pas compris ton problème !

    En espérant t'avoir aider un peu !

    NZs

  12. #12
    Membre régulier Avatar de Nzs26
    Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 136
    Points : 76
    Points
    76
    Par défaut
    Oups j'avais lu de travers le moment ou tu parle de ton dataset

    Quelle est la requête d'édition que tu utilise donc ?

    Et celle d'insertion ?

  13. #13
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Coimme déjà dit si tu passes ta base (avec juste 2 tables) en PJ je te fournis la solution...

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut
    Ma BD est dispo ici:

    http://rj45.dommel.be/bd.mdb

  15. #15
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    et bien voici une requête qui fonctionne avec ta base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE Conduite_electricite set elec_intensite=555 
    WHERE id_type_elec IN
    (SELECT id_type_elec from Conduite_electricite,TConduite 
    WHERE Conduite_electricite.id_conduite =TConduite.id_conduite);

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut
    Merci Philnext, cela m'est bien utile !

    Je pense qu'une partie de mon problème vient du fait que j'utilise un champ AutoInc pour Tconduite, que je dois utiliser la même clé pour Conduite_electricite et que... je ne vois pas comment récupérer cette clé après le Post (ou Insert) de TConduite et avant le Insert de conduite_electricite.

  17. #17
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 116
    Points : 45
    Points
    45
    Par défaut
    Je progresse. Mon update sur conduite_electricite fonctionne à présent.

    Par contre pour le Insert comment récupérer la clé (champ AutoInc, id_conduite dans ce cas-ci) qu'Access attribue au nouvel record de Tconduite afin de l'assigner également à conduite_electricite ?

  18. #18
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il te faut récupérer avec une requete le numéro le plus grand

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select max(id_conduite) from la_bonne_table
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  19. #19
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    EN fait la manip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT max(id_conduite) FROM la_bonne_table
    ne fonctionne que si 1 seul utilisateur accède à la base à la fois et si tu en as plus qui créent des enreg. celà peut générer des pb très classiques de réservation.

    Le plus simple et sûr est de rajouter un champ dans Tconduite dans lequel tu mets un GUID lors de l'insert.
    Tu te sers ensuite de ce GUID pour retrouver l'enregistrement créé.

  20. #20
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par philnext Voir le message
    EN fait la manip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT max(id_conduite) FROM la_bonne_table
    ne fonctionne que si 1 seul utilisateur accède à la base à la fois et si tu en as plus qui créent des enreg. celà peut générer des pb très classiques de réservation.

    Le plus simple et sûr est de rajouter un champ dans Tconduite dans lequel tu mets un GUID lors de l'insert.
    Tu te sers ensuite de ce GUID pour retrouver l'enregistrement créé.
    Sauf si tu utilises les transactions (fonctionnelles avec Access).

    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
     
    AdoConnection1.BeginTrans;
    try
     
      // traitement des requetes insertion,; recherche etc...
     
      // validation de la transaction et de tout ce qui a été réalisé
      AdoConnection1.CommitTrans;
     
    Except on E:Exception do
      begin
      // annulation de la transaction et de tout ce qui a été réalisé     
        AdoConnection1.RollbackTrans; 
        Showmessage ('Erreur : ' + E.MEssage);
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Modifier des valeurs dans une matrice
    Par m4tl4b dans le forum MATLAB
    Réponses: 4
    Dernier message: 04/04/2008, 16h51
  2. Réponses: 6
    Dernier message: 15/02/2008, 11h10
  3. modifier des données dans une requête multi table
    Par Bluman dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/02/2008, 10h00
  4. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  5. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24

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