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

Delphi Discussion :

Requete SQL parametrér avec un champ Calculé


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    gestionnaire de production
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gestionnaire de production
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut Requete SQL parametrér avec un champ Calculé
    Bonjour tout le monde,

    Cela fait quelque jour que je butter sur un petit problème de filtre, en effet j'ai une requête SQL avec 4 champs simples et un Calculé, le paramétrage sur les 4 se passe très bien, mais pour le 5eme tout ce que fait ne marche pas, et je me tourne vers vous pour de l'aide, et je vous en remercie d’avance.
    Voici ma requête SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQLt := 'SELECT DISTINCT f.RfDoc Référence,d.Dat Le,f.Rem Remise,'
             + '(SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) THT, f.Statu Statut '
             + 'FROM "TabEnt" e INNER JOIN "TabFac" f ON f.Cd = e.Cd '
             + '                INNER JOIN "TabDat" d ON f.Ndt = d.Ndt '
             + '                INNER JOIN "TabMvP" m ON m.RfDoc = f.RfDoc'
             + '                INNER JOIN "TabPrx" p ON p.Cp = m.Cp  '
             + PrmSQL
             + ' GROUP BY f.RfDoc,d.Dat,f.Rem,f.Statu'
    ou :
    TabEnt : Table des clients (Cd, nom,...ect)
    TabFac : Table des factures(RfDoc,Cd,Ndt,Rem,Statu,Typ)
    TabDat : Table pour les dates(Ndt,Dat)
    TabMvP: Table des Mouvements de produit (RfDoc,Ndt,Cp,Qtn)
    TabPrx : Table des prix de Produit(Cp,PxV)
    Cd: Reference Client
    RfDoc: reference Facture
    Cp : eference Produit
    Qtn : Quantité
    Pxv : Prix de Vente
    Rem : taux de remise Facture pour client
    Ndt : N° Date
    Dat : Date

    Sur ma fiche "FORM" j'ai un TDbGrid "grFact",un TRadioGroup "rgFact", un TEdit "edFltr", un TButton "btFltr", une Tquery "grFact", une TDataSource "dsFact"

    voila comment se présente ma procédure :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     procedure TForm1.btFltrClick(Sender: TObject);
      var
       PrmSQL,SQLt: String;
      begin
       if Trim(edFltr.Text) <> '' then
        begin
         case rgFact.ItemIndex of
          -1: begin
               ShowMessage('Veuillez Choisir un critère !!!');
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt';
               Params[0].AsString  := RefClt.Text;
              end;
           0: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = ' + QuotedStr(RefClt.Text)
                         + ' and f.RfDoc = :RefDoc';
               Params[0].AsString  := edFltr.Text;
              end;
           1: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = ' + QuotedStr(RefClt.Text)
                         + ' and d.Dat = :Dt';
               Params[0].AsDate  := StrToDate(edFltr.Text);
              end;
           2: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = ' + QuotedStr(RefClt.Text)
                         + ' and f.Statu = :St';
               Params[0].AsString  := edFltr.Text;
              end;
           3: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = ' + QuotedStr(RefClt.Text)
                         + ' and f.Rem = :Rem';
               Params[0].AsFloat := StrToFloat(edFltr.Text);
              end;
           4: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = ' + QuotedStr(RefClt.Text)
                         + ' and (SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) = :Mnt'; //Mon Pb se pose ici
               Params[0].AsCurrency := StrToCurr(edFltr.Text);
              end;
         end;
        end
       else ShowMessage('Veuillez saisir du texte !!!');
       SQLt := 'SELECT DISTINCT f.RfDoc Référence,d.Dat Le,f.Rem Remise,'
             + '(SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) THT, f.Statu Statut '
             + 'FROM "TabEnt" e INNER JOIN "TabFac" f ON f.Cd = e.Cd '
             + '                INNER JOIN "TabDat" d ON f.Ndt = d.Ndt '
             + '                INNER JOIN "TabMvP" m ON m.RfDoc = f.RfDoc'
             + '                INNER JOIN "TabPrx" p ON p.Cp = m.Cp  '
             + PrmSQL
             + ' GROUP BY f.RfDoc,d.Dat,f.Rem,f.Statu';
       with qrFact do
        begin
         SQL.Clear;
         SQL.Text := SQLt;
         Open;
        end;
      end;
    j’espère que j'ai bien expliquer mon problème

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    DISTINCT et GROUP BY sont incompatibles !
    Tu devrais avoir un message d'erreur SQL

    Tu dois d'abord générer le SQL et l'affecté à SQL.Text
    Cela m'étonne aussi que Params[0] ne provoque pas un Index of bouns
    Puis tu peux fournir les paramètres
    il faut faire le code en deux parties

    Ensuite, c'est un HAVING qu'il faut utiliser dans ce cas et non un WHERE
    Et un HAVING avec un paramètre, je n'ai encore jamais essayé

    Voici à quoi devrait ressembler le code, je te laisse corriger les erreurs de syntaxe

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    procedure TForm1.btFltrClick(Sender: TObject);
      var
       PrmSQL, PrmSQL2,SQLt: String;
      begin
       if Trim(edFltr.Text) <> '' then
        begin
         case rgFact.ItemIndex of
          -1: begin
               ShowMessage('Veuillez Choisir un critère !!!');
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt';
              end;
           0: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and f.RfDoc = :RefDoc';
              end;
           1: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and d.Dat = :Dt';
               P
              end;
           2: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and f.Statu = :St';
     
              end;
           3: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and f.Rem = :Rem';
     
              end;
           4: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
               PrmSQL2 :=' HAVING (SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) = :Mnt'; //Mon Pb se pose ici
     
              end;
         end;
        end
       else ShowMessage('Veuillez saisir du texte !!!');
       SQLt := 'SELECT f.RfDoc Référence,d.Dat Le,f.Rem Remise,'
             + '(SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) THT, f.Statu Statut '
             + 'FROM "TabEnt" e INNER JOIN "TabFac" f ON f.Cd = e.Cd '
             + '                INNER JOIN "TabDat" d ON f.Ndt = d.Ndt '
             + '                INNER JOIN "TabMvP" m ON m.RfDoc = f.RfDoc'
             + '                INNER JOIN "TabPrx" p ON p.Cp = m.Cp  '
             + PrmSQL
             + ' GROUP BY f.RfDoc,d.Dat,f.Rem,f.Statu';
    		 + PrmSQL2
       with qrFact do
        begin
         SQL.Clear;
         SQL.Text := SQLt; -- C'est ici que Params[0] et Params[1] sont créés et deviennent disponible !
     
    	 case rgFact.ItemIndex of
          -1: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
     
              end;
           0: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
    	       ParamByName('RefDoc').AsString  := edFltr.Text;
              end;
           1: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
    		   ParamByName('Dt').AsDate  := StrToDate(edFltr.Text);	  
              end;
           2: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
               ParamByName('St').AsString  := edFltr.Text;
              end;
           3: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
               PParamByName('Rem').AsFloat := StrToFloat(edFltr.Text);
     
              end;
           4: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
               ParamByName('Mnt').AsCurrency := StrToCurr(edFltr.Text);
     
              end;
     
         Open;
        end;
      end;
    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

  3. #3
    Membre du Club
    Homme Profil pro
    gestionnaire de production
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gestionnaire de production
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    DISTINCT et GROUP BY sont incompatibles !
    Tu devrais avoir un message d'erreur SQL

    Tu dois d'abord générer le SQL et l'affecté à SQL.Text
    Cela m'étonne aussi que Params[0] ne provoque pas un Index of bouns
    Puis tu peux fournir les paramètres
    il faut faire le code en deux parties

    Ensuite, c'est un HAVING qu'il faut utiliser dans ce cas et non un WHERE
    Et un HAVING avec un paramètre, je n'ai encore jamais essayé

    Voici à quoi devrait ressembler le code, je te laisse corriger les erreurs de syntaxe

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    procedure TForm1.btFltrClick(Sender: TObject);
      var
       PrmSQL, PrmSQL2,SQLt: String;
      begin
       if Trim(edFltr.Text) <> '' then
        begin
         case rgFact.ItemIndex of
          -1: begin
               ShowMessage('Veuillez Choisir un critère !!!');
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt';
              end;
           0: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and f.RfDoc = :RefDoc';
              end;
           1: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and d.Dat = :Dt';
               P
              end;
           2: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and f.Statu = :St';
     
              end;
           3: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
                         + ' and f.Rem = :Rem';
     
              end;
           4: begin
               PrmSQL := 'WHERE f.Statu <> "An" and f.Cd = :RefClt ' + 
               PrmSQL2 :=' HAVING (SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) = :Mnt'; //Mon Pb se pose ici
     
              end;
         end;
        end
       else ShowMessage('Veuillez saisir du texte !!!');
       SQLt := 'SELECT f.RfDoc Référence,d.Dat Le,f.Rem Remise,'
             + '(SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) THT, f.Statu Statut '
             + 'FROM "TabEnt" e INNER JOIN "TabFac" f ON f.Cd = e.Cd '
             + '                INNER JOIN "TabDat" d ON f.Ndt = d.Ndt '
             + '                INNER JOIN "TabMvP" m ON m.RfDoc = f.RfDoc'
             + '                INNER JOIN "TabPrx" p ON p.Cp = m.Cp  '
             + PrmSQL
             + ' GROUP BY f.RfDoc,d.Dat,f.Rem,f.Statu';
    		 + PrmSQL2
       with qrFact do
        begin
         SQL.Clear;
         SQL.Text := SQLt; -- C'est ici que Params[0] et Params[1] sont créés et deviennent disponible !
     
    	 case rgFact.ItemIndex of
          -1: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
     
              end;
           0: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
    	       ParamByName('RefDoc').AsString  := edFltr.Text;
              end;
           1: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
    		   ParamByName('Dt').AsDate  := StrToDate(edFltr.Text);	  
              end;
           2: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
               ParamByName('St').AsString  := edFltr.Text;
              end;
           3: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
               PParamByName('Rem').AsFloat := StrToFloat(edFltr.Text);
     
              end;
           4: begin
               ParamByName('RefClt').AsString  := RefClt.Text;
               ParamByName('Mnt').AsCurrency := StrToCurr(edFltr.Text);
     
              end;
     
         Open;
        end;
      end;
    Merci pour la repense, mais ton code ne marche pas, je vais faire un peut de bidouillage avec et on verra

  4. #4
    Membre du Club
    Homme Profil pro
    gestionnaire de production
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gestionnaire de production
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Bon jour,

    je crois que je comprend pourquoi le "HAVING" ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING (SUM(m.Qtn * p.PxV) * (1-(f.Rem/100))) = CAST(:Mnt as Money)
    or quand je fait sa, ça marche bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING SUM(m.Qtn*p.PxV) = CAST(:Mnt as Money)
    et sa me désole, parce que je vais devoir changé tout mon code et ma vision de mon projet

    S'il y a une autre suggestion de votre part je suis preneur

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 619
    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 619
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    c'est plus un problème SQL que Delphi . Le mieux serait de formuler une nouvelle question sur le forum base de données correspondant SGBD et SQL
    comme il y a 5 tables à prendre en compte il serait bon de fournir les scripts de création de celles-ci (je ne parle pas de code Delphi mais bien de SQL)
    de plus est-ce un problème lié à la requête ou au SGBD (non indiqué d'ailleurs)

Discussions similaires

  1. DetailsView avec un champ calculé par déclencheur SQL
    Par insane_80 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/04/2010, 11h30
  2. Requete mise à jour avec un champ calculé
    Par gberthier dans le forum Requêtes et SQL.
    Réponses: 35
    Dernier message: 24/04/2008, 14h25
  3. [SQL] Problemes avec des champs uniques
    Par 000 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/06/2006, 13h28
  4. requete SQL: where avec parametre variable
    Par dracula2000 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/05/2006, 22h46
  5. Requete SQL croisée avec la clause Like
    Par Orgied dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/03/2006, 16h36

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