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 :

fonction sur la somme des valeurs issues d'une requete


Sujet :

Bases de données Delphi

  1. #1
    iam
    iam est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 197
    Points : 72
    Points
    72
    Par défaut fonction sur la somme des valeurs issues d'une requete
    salut
    j'ai une requete paramétré que j'ajoute des critère à chaque fois l'utilisateur saisie des valeur dans des champs edits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.MRQCOD, max(R.REFFOU) As REFFOU, M.MRQLIB,A.ARTCOD,A.ARTDES,A.ARTQTE,A.ARTPRX,
    A.ARTQTE*A.ARTPRX as MONTANT, MgsInt,MgsIt1,MgsIt2,
    A.ARTTPV,A.ARTORG
    FROM ARTICLE A,MARQUE M,magasin, REFERENCE R
    WHERE A.MRQCOD=M.MRQCOD
    AND R.ARTCOD=A.ARTCOD
    GROUP BY A.MRQCOD,M.MRQLIB, A.ARTCOD, A.ARTDES,A.ARTQTE,A.ARTPRX, MgsInt,MgsIt1,MgsIt2,
    A.ARTTPV,A.ARTORG
    cette requete est chargé depuis un memo

    après j'ajoute les critère à ma condition selon des critères :

    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
     
      QNomenclature.Close;
      QNomenclature.Connection:=nil;
      QNomenclature.SQL.Clear;
      for i:=0 to memo1.Lines.Count-1 do QNomenclature.SQL.Add(memo1.Lines[i]);
      if RZTabControl1.Tabs.Items[RZTabControl1.TabIndex].Caption<> '?' then
        begin
          QNomenclature.SQL.Add('AND A.ARTDES LIKE ' +
           '''' + RZTabControl1.Tabs.Items[RZTabControl1.TabIndex].Caption + '%' + '''');
          if typevehi.Text<>'' then
            QNomenclature.SQL.Add('AND A.ARTTPV LIKE ' + ''''+typevehi.Text+ '%' +'''');
          if organe.Text<>'' then
            QNomenclature.SQL.Add('AND A.ARTORG LIKE ' + ''''+organe.Text + '%' + '''');
          if marque.Text<>'' then
            QNomenclature.SQL.Add('AND A.MRQCOD = ' + ''''+marque.Text+ '''');
        end
      else
        begin
          if designation.Text<>'' then
            begin
              if position.ItemIndex=0 then
                begin
                  QNomenclature.SQL.Add('AND A.ARTDES LIKE ' + '''' + designation.Text + '%' + '''');
                  if typevehi.Text<>'' then
                    QNomenclature.SQL.Add('AND A.ARTTPV LIKE ' + ''''+typevehi.Text+ '%' +'''');
                  if organe.Text<>'' then
                    QNomenclature.SQL.Add('AND A.ARTORG LIKE ' + ''''+organe.Text + '%' + '''');
                  if marque.Text<>'' then
                    QNomenclature.SQL.Add('AND A.MRQCOD = ' + ''''+marque.Text+ '''');
                end;
              if position.ItemIndex=1 then
                begin
                  QNomenclature.SQL.Add('AND A.ARTDES LIKE ' + '''' + '%' +
         designation.Text + '%' + '''');
                  if typevehi.Text<>'' then
                    QNomenclature.SQL.Add('AND A.ARTTPV LIKE ' + ''''+typevehi.Text+ '%' +'''');
                  if organe.Text<>'' then
                    QNomenclature.SQL.Add('AND A.ARTORG LIKE ' + ''''+organe.Text + '%' + '''');
                  if marque.Text<>'' then
                    QNomenclature.SQL.Add('AND A.MRQCOD = ' + ''''+marque.Text+ '''');
                end
            end
          else
            begin
              if typevehi.Text<>'' then
                QNomenclature.SQL.Add('AND A.ARTTPV LIKE ' + ''''+typevehi.Text+ '%' +'''');
              if organe.Text<>'' then
                QNomenclature.SQL.Add('AND A.ARTORG LIKE ' + ''''+organe.Text + '%' + '''');
              if marque.Text<>'' then
                QNomenclature.SQL.Add('AND A.MRQCOD = ' + ''''+marque.Text+ '''');
            end;
        end;
      QNomenclature.SQL.Add('GROUP BY A.MRQCOD,M.MRQLIB, A.ARTCOD, A.ARTDES,A.ARTQTE,
       A.ARTPRX, MgsInt,MgsIt1,MgsIt2, A.ARTTPV,A.ARTORG');
      QNomenclature.Connection:=DM.ADOConnection1;
      QNomenclature.Open;
    je sais est mon code est un peu illisible mais la finalité à la fin est qu'après ma requete affiche ses résultats sur un dbgrid

    je veux faire la somme sur les différents montants affichés, est ce qu'il existe une fonction somme qui me facilite la tache sans avoir besoin de faire une boucle qui parcours l'ensemble des enrengistrements
    merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    Citation Envoyé par iam
    je sais est mon code est un peu illisible
    Utilises les balises de code... (le bouton # dans la barre d'édition)
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Une petite chose concernant la lisibilité.
    Je te conseille d'utiliser la fonction QuotedStr qui permet d'ajouter les quotes et qui facilite grandement l'écriture de ton code dans ces cas là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QNomenclature.SQL.Add('AND A.ARTORG LIKE ' + ''''+organe.Text + '%' + '''');
    peut se remplacer par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QNomenclature.SQL.Add('AND A.ARTORG LIKE ' + quotedStr(organe.Text + '%'));
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Autre petite remarque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=0 to memo1.Lines.Count-1 do QNomenclature.SQL.Add(memo1.Lines);
    peur être remplacée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QNomenclature.SQL.Text := memo1.Text;
    En ce qui concerne la somme, sache que la fonction SQL, "SUM" permet de faire cela sans utiliser de boucle.

    Dans ton cas je verrai bien une petite procédure comme celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function ADOQuerySum(fieldName,defQuery: string):variant;
    begin
    with TADOQuery.Create(nil) do
    try
      ConnectionString := //ta chaîne de connection;
      SQL.Text := 'Select sum('+fieldName+')' + defQuery;
      Open;
      Result := Fields[0].value;
    finally
      Free;
    end;
    end;
    En créant un TADOQuery à la volée et en lui passant le nom du champ pour le quel tu désires calculer la somme ainsi que le reste de la requête définissant la partie FROM et sutout Where qui va te permettre de filtrer (defQuery dans la procédure).
    Attention à bien définir la chaîne de connexion. Pour cela je te renvoie vers la FAQ afin de te permettre de construire la chaîne de connexion au run-time.

    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Je reviens à nouveau vers toi avec un dernier conseil. Etant donné que tu construis tes requêtes au run-time, pourquoi ne pas créer une classe qui te permette de manipuler plus simplement la construction de tes requêtes. Cela éviterai la lourdeur dans la manipulation des chaînes et surtout une construction immédiate de ta requête ou d'une partie de celle-ci.
    Si tu utilises la fonction que je t'ai précédemment décrite tu y verras un avantage certain lorsqu'il faudra lui passer la paramètre DefQuery.

    Un autre avantage que tu découvriras à terme avec la manipulation des composants orientés base de données est qu'il est intéressant de les construire à la volée permettant ainsi une économie des ressources. Et donc la manipulation du texte de tes requêtes trouve alors un intérêt certain.

    Voici une ébauche de class qui est bien entendu très perfectible :

    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
     
    TQueryDef = class
      private
        Fselect: string;
        Ffrom: string;
        Fwhere: string;
        FgroupBy: string;
        procedure Setselect(const Value: string);
        procedure Setfrom(const Value: string);
        procedure Setwhere(const Value: string);
        procedure SetgroupBy(const Value: string);
        function GetText: string;
        function getTextFomWhere: string;
        function getTextSelectFromWhere: string;
      public
        property select:string read Fselect write Setselect;
        property from:string read Ffrom write Setfrom;
        property where:string read Fwhere write Setwhere;
        property groupBy:string read FgroupBy write SetgroupBy;
        property Text:string read GetText;
        property TextSelectFromWhere: string read getTextSelectFromWhere;
        property TextFomWhere:string read getTextFomWhere;
        procedure Clear;
      end;
    Implémentation:
    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
     
     
    { TQueryDef }
     
    procedure TQueryDef.Clear;
    begin
      FSelect := '';
      FFrom := '';
      FWhere := '';
      FgroupBy := '';
    end;
     
    function TQueryDef.GetText: string;
    begin
      Result := 'Select ' + Fselect +
                ' From ' + Ffrom +
                ' Where ' + Fwhere +
                ' Group By ' + FgroupBy;
    end;
     
    function TQueryDef.getTextFomWhere: string;
    begin
      Result := ' From ' + Ffrom +
                ' Where ' + Fwhere;
    end;
     
    function TQueryDef.getTextSelectFromWhere: string;
    begin
      Result := 'Select ' + Fselect +
                ' From ' + Ffrom +
                ' Where ' + Fwhere;
    end;
     
    procedure TQueryDef.Setfrom(const Value: string);
    begin
      if Ffrom = ''
        then Ffrom := Value
        else Ffrom := Ffrom + ',' + Value;
    end;
     
    procedure TQueryDef.SetgroupBy(const Value: string);
    begin
      if FgroupBy = ''
        then FgroupBy := Value
        else FgroupBy := FgroupBy + ',' + Value;
    end;
     
    procedure TQueryDef.Setselect(const Value: string);
    begin
      if Fselect = ''
        then Fselect := Value
        else Fselect := Fselect + ',' + Value;
    end;
     
    procedure TQueryDef.Setwhere(const Value: string);
    begin
      if Fwhere = ''
        then Fwhere := Value
        else Fwhere := Fwhere + ' AND ' + Value;
    end;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    je te conseil de jeter un coup d'euil sur ma source .
    c'est une source de gestion des addmissions dans un chu , g utiliser la construction de la requette sql dans la forme de recherche d'un malade ainssi l'utilisateure peut utiliser plusieurs critaires de recherches combiner avec un AND voici le lien et je pence que c l'approche la plus simple a la quelle je suis arriver voici le lien :
    http://1tik.free.fr/CHU.zip

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

Discussions similaires

  1. [MySQL] Somme de valeurs issues d'une boucle.
    Par ripout dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/11/2010, 18h04
  2. Réponses: 15
    Dernier message: 21/05/2010, 00h36
  3. Réponses: 8
    Dernier message: 13/04/2010, 13h15
  4. Réponses: 12
    Dernier message: 19/06/2008, 11h10

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