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 :

MySQL Update imbriqués


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut MySQL Update imbriqués
    Encore une colle
    J'ai besoin de calculer le STDDEV de valeurs se trouvant dans une table (QC_RES) en filtrant les données sur deux critères (TEST et QC_Lot)
    Je dois placer le résultat de ce SELECT dans une autre table (QC_Val) dans le champs ETCalc correspondant à ce test et ce lot (dans QC_Val: Test et QCLot)
    et ce pour chaque test d'ou la première requête.
    Voici mon code:
    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
           Query.Active:=False;
                    Query.SQL.Clear;
                    Query.SQL.Add('SELECT TestName FROM Tests');                                   // sélection du nom du test dans la liste des tests
                    Query.Active:=true;
                    Query.First;
                    while not Query.eof do begin                                                              //boucle de calcul pour chaque test
                          if (Query.FieldByName('TestName').AsString)<>'' then
                          begin
                              Memo3.Lines.Append(Query.FieldByName('TestName').AsString);     // juste pour vérifier que la requète 1 renvoie qq chose: oui (1 ligne)
                              //Update
                              Query2.Active:=False;
                              Query2.SQL.Clear;
                              Query2.SQL.Add('UPDATE qc_val SET ETCalc = (SELECT STDDEV(result) FROM qc_res WHERE qc_lot=33501102 AND Test= '+(Query.FieldByName('TestName').AsString));
                              Query2.Active:=true;
                          end;
                    Query.Next;
                    end;
    J'ai tenté de multiples variantes aussi avec des JOIN sans meilleurs résultat
    Le système me retourne: Error Syntax; check the manual MySQL server version; je suis en 5.6.12 et ne peux pas changer pour une plus récente.

    Qui peux m'aider?
    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Sans connaitre mySQL , je vois au moins 2 erreurs

    1- L'update se fait sur toute la table QC_val ce qui me parait étrange , il doit certainement manquer un WHERE quelque part (condition sur QC_Val)
    2- un Update ne renvoi pas de résultat donc Query2.ExecSQL; (ou Execute ) <<< ne sachant pas de quel set de composants il s'agit et pas Open

    Autre questionnement : Test est numérique (auquel cas ok) ou string ?

    il doit certainement y avoir une solution plus "élegante" au niveau de la Query évitant un While not EOF do sur la table Test
    mais dans ce genre de problème il est bon d'avoir , en premier lieu, la description des tables (Test,QC_val,qc_res) en cause et leur(s) relation(s)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    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
    SergioMaster a déjà donner pas mal d'info

    utilise des paramètres pour la lisibilité
    Mon MySQL date un peu !

    J'ai repris ton SQL et j'ai juste mis les ( ) et les tests à l'endroit que me semble logique par rapport au code que tu as fourni !
    Sans la structure de la DB comme le fait remarquer SergioMaster, on joue à la loterie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Query2.SQL.Add(
      ' UPDATE qc_val '+
      ' SET ETCalc = ( ' +
      '   SELECT STDDEV(qc_res.result) ' +
      '   FROM qc_res ' +
      '   WHERE Test = :pTestName ' +
      ' ) '
      ' WHERE qc_lot = :pLot ' );
     
    Query2.ParamByName('pLot').AsString := '33501102'; // Toujours le même ??? ça ne va pas !
    Query2.ParamByName('pTestName').AsString := Query.FieldByName('TestName').AsString
    Gros avantage, tu peux définir le SQL une seule fois, faire un Prepare
    Puis à chaque itération fournir de nouvelles valeurs pour le Execute
    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

  4. #4
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    De fait, j'ai des résultats dans la table de destination, uniquement pour le lot choisi mais la même valeur partout???
    Voici le code:
    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
          Query.Active:=False;
                    Query.SQL.Clear;
                    Query.SQL.Add('SELECT TestName FROM System.Tests');
                    Query.Active:=true;
                    Query.First;
                    while not Query.eof do begin
                          if (Query.FieldByName('TestName').AsString)<>'' then
                          begin
                              Memo3.Lines.Append(Query.FieldByName('TestName').AsString);
     
                              Query2.SQL.Add(
                              ' UPDATE qc_val '+
                              ' SET ETCalc = ( ' +
                              '   SELECT STDDEV(qc_res.result) ' +
                              '   FROM qc_res ' +
                              '   WHERE Test = :pTestName ' +
                              ' ) WHERE qc_lot = :pLot ' );
     
                              Query2.ParamByName('pLot').AsString := '33501102'; // Toujours le même ??? ça ne va pas !
                              Query2.ParamByName('pTestName').AsString := Query.FieldByName('TestName').AsString;
                              //Query2.active:=True;      ???
                          end;
                    Query.Next;
    Je continue de chercher...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Au cas où... dans ta première requête il manque une parenthèse à la fin, d'où probablement l'erreur de syntaxe...

  6. #6
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Au cas où... dans ta première requête il manque une parenthèse à la fin, d'où probablement l'erreur de syntaxe...
    J'ai beau chercher, je ne vois pas où!?!

  7. #7
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Avec ce code, j'obtient bien des valeurs (toutes mes mêmes pour tous les tests d'un même lot)
    Le système me retourne aussi l'erreur: Query2: Curseur non renvoyé par query

    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
    Query.Active:=False;
                    Query.SQL.Clear;
                    Query.SQL.Add('SELECT TestName FROM System.Tests');
                    Query.Active:=true;
                    Query.First;
                    while not Query.eof do begin
                          if (Query.FieldByName('TestName').AsString)<>'' then
                          begin
                              Memo3.Lines.Append(Query.FieldByName('TestName').AsString);
                              Query2.SQL.Add(
                              ' UPDATE qc_val '+
                              ' SET ETCalc = ( ' +
                              '   SELECT STDDEV(qc_res.result) ' +
                              '   FROM qc_res ' +
                              '   WHERE Test = :pTestName ' +
                              ' ) WHERE qclot = :pLot ' );
     
                              //Query2.ParamByName('pLot').AsString := '40411101'; // Toujours le même ??? ça ne va pas !
                              Query2.ParamByName('pLot').AsString := (sellot.items[sellot.itemIndex]); //remplacé ligne précédente par combobox de choix
                              Query2.ParamByName('pTestName').AsString := Query.FieldByName('TestName').AsString;
                              Query2.active:=True;
                          end;
                    Query.Next;
                    end;

    Merci pour votre aide!!!

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Pas Query2.Active:=True mais Query2.Execute ; comme shailetroll et moi-même te l'avons indiqué
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par PhilLU Voir le message
    J'ai beau chercher, je ne vois pas où!?!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query2.SQL.Add('UPDATE qc_val SET ETCalc = (SELECT STDDEV(result) FROM qc_res WHERE qc_lot=33501102 AND Test= '+(Query.FieldByName('TestName').AsString));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query2.SQL.Add('UPDATE qc_val SET ETCalc = (SELECT STDDEV(result) FROM qc_res WHERE qc_lot=33501102 AND Test= '+(Query.FieldByName('TestName').AsString) + ')');

  10. #10
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Voici mon code qui roule mais sans query imbriqués:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
              Query.Active:=False;
              Query.SQL.Clear;
              Query.SQL.Add('UPDATE qc_val SET ETCalc = ( SELECT STDDEV(qc_res.result) FROM qc_res Where Test ='
              + quotedStr(seltest.items[seltest.itemIndex])
              +'AND QC_Lot ='+quotedStr(sellot.items[sellot.itemIndex])
              +') Where Test ='
              + quotedStr(seltest.items[seltest.itemIndex])
              +'AND QCLot ='+quotedStr(sellot.items[sellot.itemIndex])
              +'');
              Query.ExecSQL();
    pour vos conseils!

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

Discussions similaires

  1. MySQL - Update et insert Multiple
    Par mastronic dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2006, 09h28
  2. Mysql update supprime un enregistrement
    Par Langly dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/08/2006, 17h46
  3. [MySQL] updater un seul tuple a la fois+increment de la cle
    Par kenny49 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/07/2006, 12h13
  4. [MySQL] update a partir du resultat d'un select
    Par brice01 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 05/04/2006, 22h44
  5. prob. d' incrémentation /mysql UPDATE
    Par K4trix dans le forum Requêtes
    Réponses: 15
    Dernier message: 01/12/2005, 17h27

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