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 :

A nouveau syntaxe update imbriqués


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 478
    Par défaut A nouveau syntaxe update imbriqués
    Décidément, je sèche avec les requêtes imbriquées

    Voici le cas qui me préoccupe:
    J'ai deux tables qui contiennent respectivement
    Table1: QC_Res champs: Test, QC_lot, Result, Flag
    Table2: QC_Val Champs: Test, QCLot, Mean, ETCalc
    Tout est en VARCHAR!!!

    Je souhaite mettre un Flag à "2SD" quand le Flag est vide et que le Result<Mean-(2*ETCalc)
    pour le lot et le test correspondant bien sûr

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
                    Query.Active:=False;
                    Query.SQL.Clear;
                    Query.SQL.Add('SELECT Test, Result, QC_Lot, Flag FROM qc_res');
                    Query.Active:=true;
                    Query.First;
                    while not Query.eof do
                          begin
                          Query2.Active:=False;                                    // query2
                          Query2.SQL.Clear;
                          Query2.SQL.Add('UPDATE qc_res SET Flag = '+quotedStr('-2SD')
                          +'WHERE '+(Query.FieldByName('Result').AsString)
                          +'< Mean FROM QC_Val'  );
                            //  +'(WHERE '
                              +'(WHERE Test LIKE '+Query.FieldByName('Test').AsString       //de query
                              //  message d'erreur de la ligne ci-dessus: Opérateur pas applcable à ce type d'opérande
                              // j'ai aussi tenté le "=" mais pas mieux :-(
                              +'AND'
                              +'Lot LIKE '+Query.FieldByName('QC_Lot').AsString
                              +')'
                          +'- 2*ETCalc FROM QC_Val '
                              +'(WHERE '
                              +'Test = '+Query.FieldByName('Test').AsString
                              +'AND'
                              +'Lot = '+Query.FieldByName('QC_Lot').AsString
                              +')'
                          +'AND  Flag FROM QC_Res = '')
                          +')');
                          Query2.ExecSQL();
                          end;
                    Query.Next;
    Avant de voir à la ponctuation, qui peux me dire si au moins la structure est correcte?
    Bien sûr le plaisir de la ponctuation est ensuite une autre paire de manches
    pour vos lumières d'experts

  2. #2
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 478
    Par défaut
    ... oui, j'ai essayé le LIKE et le = mais pas mieux

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Ce sont des chaînes de caractères, donc à mettre entre apostrophes
    Pour une recherche partielle par LIKE, il faut faire suivre le texte d'un %.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ... where Champ LIKE 'texte%'

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 649
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Décidément tu sembles fâché avec les requêtes paramétrées !! et le quotedStr tu ne l'utilises que rarement !

    ensuite , première erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     +'WHERE '+(Query.FieldByName('Result').AsString)
    il manque le nom du champ


    mais surtout voici quelques points qui me choquent :
    1-
    Tout est en VARCHAR!!!
    Comment une moyenne et un écart type (si j'ai bien compris) peuvent-ils être en varchar
    2- c'est ta sélection des enregistrements de Query qui ne va pas (voir le SQL de la procedure)
    3- Il ne te viens pas à l'esprit de récupérer ton SQL en mode debug et vérifier ce texte directement avec un GUI ?
    4- pourquoi ne pas passer par des procedures mySQL ? (note , cette remarque s'applique également à ton post précédent)


    en gros (Syntaxe Firebird à adapter)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE PROCEDURE MAPROC  
    DECLARE VARIABLE STEST VARCHAR(nn); // pour le test selectionné
    DECLARE VARIABLE SLOT   VARCHAR(nn); // pour le lot selectionné 
    begin
     FOR SELECT R.Test, R.QC_Lot FROM qc_res R JOIN QC_val v ON R.TEST=V.TEST AND R.QC_LOT=V.QCLOT
           WHERE R.Flag is NULL AND R.Result<V.MEAN-(2*V.ETCALC) 
           INTO :STEST,:SLOT
     DO  UPDATE QC_VAL SET FLAG='-2SD' WHERE TEST=:STEST AND QC_LOT=:SLOT; 
    end;
    et du coup une simple exécution de la procédure via le programme au lieu de deux query , d'une boucle et de la construction de SQL (query2)
    sans parler de l'avantage de faire exécuter ça sur le serveur en une seule transaction

  5. #5
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 478
    Par défaut
    Merci Sergiomaster!
    concernant ta remarque:

    +'WHERE '+(Query.FieldByName('Result').AsString)
    il manque le nom du champ

    C'est une valeur renvoyée par le QUERY du début:
    Query.SQL.Add('SELECT Test, Result, QC_Lot, Flag FROM qc_res');

    Concernant le varchar je m'en doutais et je vais corriger ça tout de go, mais j'avais une erreur avant ce traitement.

    En fait ma question principale est de savoir si 2 query imbriqués sont possibles?
    Ici Query et Query2
    Query first and next permettant de récupérer les valeurs: Test, Result, QC_Lot, Flag
    à chaque boucle
    Query2 récupère ces valeurs et les compare à d'autres valeurs via un calcul mean-2*SD pour faire un update conditionnel de flag
    ou faut-il utiliser un LIMIT 1 OFFSET i pour récupérer ces données?

    Merci en tout cas pour tes conseils

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

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 478
    Par défaut
    Je tente une autre approche, mais pas mieux
    le code=
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    j:=0;
            for i:=1 to Query.FieldByName('nombre').AsInteger do
            begin
                    Query.Active:=False;
                    Query.SQL.Clear;
                    Query.SQL.Add('SELECT Test, Result, QC_Lot, Flag FROM qc_res LIMIT 1 ,'+quotedStr(intToStr(j)));
                    Query.Active:=true;
                    memo1.Lines.Append(IntToStr(j)+' '+Query.FieldByName('test').AsString+' '+FloatToStr(Query.FieldByName('Result').Asfloat));
                    j:=j+1;
            end;
    me renvoie une erreur "near ''0'' at line 1"
    j'utilise déjà j:=i pour ne pas utiliser le compteur lui-même mais pas mieux non-plus



    Merci encore

Discussions similaires

  1. [SQL] Syntaxe UPDATE + manuel SQL
    Par massif dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/01/2007, 10h28
  2. Erreur syntaxe Update
    Par amel123456789 dans le forum Access
    Réponses: 5
    Dernier message: 18/09/2006, 17h47
  3. Syntaxe Update : erreur
    Par Mariboo dans le forum Access
    Réponses: 6
    Dernier message: 09/06/2006, 18h46
  4. [ORACLE] problème de syntaxe UPDATE
    Par magic charly dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2006, 12h26
  5. syntaxe "UPDATE" (lecture d'une valeur avec jointu
    Par mrblue1978 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/01/2006, 14h38

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