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

  1. #1
    Candidat au 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
    Points : 4
    Points
    4
    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 sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    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 469
    Points : 24 905
    Points
    24 905
    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
    Candidat au 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
    Points : 4
    Points
    4
    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
    Candidat au 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
    Points : 4
    Points
    4
    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 061
    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 061
    Points : 41 021
    Points
    41 021
    Billets dans le blog
    62
    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)
    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

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