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 :

rendre code Delphi en requête SQL


Sujet :

Delphi

  1. #1
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut rendre code Delphi en requête SQL
    bonjours à tous
    j'utilise delphi 7
    dsl je suis débutant
    je voudrais bien transformer ce code en requette sql avec un 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
     
    Total := 0;
      With mdd.matable Do
      Begin
        First;
        While Not Eof Do
        Begin
          if mdd.matable.FieldByName('num_cp').AsString=edit2.Text 
        then
          total:=total+FieldByName('mt_recharge').AsFloat;
          Next;
        End;
      End;
      monetat.QRLabel32.Caption:=floattostr(total);
    merci pour votre aide

  2. #2
    Rédacteur/Modérateur

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

    certainement quelque chose comme
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(mt_recharge) AS TOTAL FROM MATABLE WHERE num_cp=:CP

    comme vous n'indiquez ni connecteurs (composant d'accès aux données) pas facile de vous donner un code plus explicite pour créer une query au runtime, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QueryTotal.active:=False;
    QueryTotal.ParamByName('CP').asString:=Edit2.Text;
    QueryTotal.Active:=True;
    monetat.QRLabel32.Caption:=QueryTotal.FieldByname('Total').asString;
    c'est le moins pire que je puisse proposer

  3. #3
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    et si je veux ajouter une autre condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if mdd.matable.FieldByName('num_cp').AsString=edit2.Text and  //  je veux ajouter une condition de recherche dans un interval de deux DateTimePicker 
    //c.a.d avoir le total a une période défini comment faire

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 628
    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 628
    Billets dans le blog
    65
    Par défaut
    Bonjour
    et si je veux ajouter une autre condition
    Alors il serait bon que vous appreniez les bases du SQL (ce qui n'a rien à voir avec Delphi !)
    Avec le peu d'informations données (pas de nom de champ, pas d'indication de SGBD, pas d'indication des composants de connexion)

    je vais l'écrire au plus sécuritaire

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT SUM(mt_recharge) AS TOTAL FROM MATABLE WHERE num_cp=:CP
     AND colonne_date BETWEEN CAST( :dd AS DATE) AND CAST ( :df AS DATE)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QueryTotal.active:=False;
    QueryTotal.ParamByName('CP').asString:=Edit2.Text;
    QueryTotal.ParamByName('dd').asDate:=DateTimePicker1.Date;
    QueryTotal.ParamByName('df').asDate:=DateTimePicker2.Date;
    QueryTotal.Active:=True;

  5. #5
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    message erreur " QueryTotal champ total non trouvé "
    comment dois je afficher le total
    débutant dsl

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    Débuter ne dispense pas de bien présenter son problème, en fournissant à ceux susceptibles de vous aider les indications demandées, surtout si vous souhaitez une aide efficace :
    Avec le peu d'informations données (pas de nom de champ, pas d'indication de SGBD, pas d'indication des composants de connexion)
    Indiquer le code produisant l'erreur que vous citez serait bien évidemment un plus évitant de sortir une seconde boule de cristal du coffre :
    QueryTotal champ total non trouvé
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Débuter ne dispense pas de bien présenter son problème, en fournissant à ceux susceptibles de vous aider les indications demandées, surtout si vous souhaitez une aide efficace :

    Indiquer le code produisant l'erreur que vous citez serait bien évidemment un plus évitant de sortir une seconde boule de cristal du coffre :
    je travail avec Delphi 7 et SQL 2000 server

    j'ai une table qui comporte les champs suivants:
    IDRecharge,Num_cp, Mt_recharge (IDRecharge,Num_cp comme clé de la table TRecharge)

    un edit pour saisir le num_cp
    j'utilise 2 DateTimePicker pour la selection de l'interval

    en faisant entrer le num_cp sur le Edit et en faisant entrer les dates Du Au (l'interval) en en cliquant sur un bouton
    j'aurais comme résultat la somme du champ MT_recharge


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Querytotal.Sql.Clear;
    Querytotal.Sql.Add('SELECT *,SUM(mt_recharge) AS TOTAL FROM TRecharge_cp WHERE num_cp=:CP AND date_recharge BETWEEN CAST( :dd AS DATE) AND CAST ( :df AS DATE) ')
    Querytotal.active:=False;
    QueryTotal.ParamByName('CP').asString:=Edit2.Text;
    QueryTotal.ParamByName('dd').asDateTime:=DateTimePicker1.Date;
    QueryTotal.ParamByName('df').asDateTime:=DateTimePicker2.Date;
    QueryTotal.Active:=True;
    monetat.QRLabel32.Caption:=Querytotal.FieldValues['Total'].asString;
    en exécutant j'obtiens le message d'erreur " QueryTotal champ TOTAL non trouvé "

    comment dois je afficher le total

  8. #8
    Invité
    Invité(e)
    Par défaut
    ce n'est pas plutôt : monetat.QRLabel32.Caption:=Querytotal.FieldByName['Total'].asString;

  9. #9
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    Citation Envoyé par benoit1024 Voir le message
    ce n'est pas plutôt : monetat.QRLabel32.Caption:=Querytotal.FieldByName['Total'].asString;
    non toujours le même message d'erreur "QueryTotal champ TOTAL non trouvé "

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    Je ne sais pas si la casse peut jouer (TOTAL versus Total) ; sinon, que vaut Querytotal.Fields[0].AsInteger ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  11. #11
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Je ne sais pas si la casse peut jouer (TOTAL versus Total) ; sinon, que vaut Querytotal.Fields[0].AsInteger ?
    meme message

    autrement

    comment on en language delphi

    si date_recharge est entre dateTimePicker1 et dateTimePicker2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if matable.FieldByName('date_recharge').AsDateTime ...???? //est entre  D1 et D2  alors

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    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
    Total := 0;
      With mdd.matable Do
      Begin
        First;
        While Not Eof Do
        Begin
          if (mdd.matable.FieldByName('num_cp').AsString = edit2.Text)
          and (matable.FieldByName('date_recharge').AsDateTime >= DateTimePicker1.Date) 
          and (matable.FieldByName('date_recharge').AsDateTime <= DateTimePicker2.Date)
        then
          total:=total+FieldByName('mt_recharge').AsFloat;
          Next;
        End;
      End;
      monetat.QRLabel32.Caption:=floattostr(total);
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  13. #13
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    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
    Total := 0;
      With mdd.matable Do
      Begin
        First;
        While Not Eof Do
        Begin
          if (mdd.matable.FieldByName('num_cp').AsString = edit2.Text)
          and (matable.FieldByName('date_recharge').AsDateTime >= DateTimePicker1.Date) 
          and (matable.FieldByName('date_recharge').AsDateTime <= DateTimePicker2.Date)
        then
          total:=total+FieldByName('mt_recharge').AsFloat;
          Next;
        End;
      End;
      monetat.QRLabel32.Caption:=floattostr(total);
    merci pour votre aide

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 628
    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 628
    Billets dans le blog
    65
    Par défaut
    C'est du n'importe quoi ! Et le but était de sortir de cette solution à base de boucle et ce grâce au SQL
    SQL mal recopié qui plus est
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *,SUM(mt_recharge) AS TOTAL FROM TRecharge_cp WHERE num_cp=:CP AND date_recharge BETWEEN CAST( :dd AS DATE) AND CAST ( :df AS DATE)
    est-ce que je vous ai indiqué de mettre une * ?
    Votre SQL est faux il serait temps d'en apprendre les bases. A partir du moment ou vous utilisez une fonction d'agrégat en SQL , ici SUM si vous avez d'autre colonnes celles-ci devront faire partie de la clause GROUP BY , le fait de n'utiliser que la fonction d'agrégat permettait de ne pas avoir besoin de la clause GROUP BY

    En plus l'ordre de vos lignes de code n'est pas bon !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Querytotal.active:=False;
    Querytotal.Sql.Clear;
    Querytotal.Sql.Add('SELECT *,SUM(mt_recharge) AS TOTAL FROM TRecharge_cp WHERE num_cp=:CP AND date_recharge BETWEEN CAST( :dd AS DATE) AND CAST ( :df AS DATE) ')
    vous n'avez toujours pas répondu à une question essentielle : le type de composant utilisé (ADO ne fonctionne pas tout à fait de la même manière que Firedac par exemple)
    si QueryTotal se trouve sur votre fiche quel est le SQL inscrit dedans et quel sont les paramètres définis ? Si QueryTotal sera toujours le même SQL il n'est pas besoin d'effacer (clear) et ré-écrire (sql.add) vous pourriez d'ailleurs remplacer les deux par un simple QueryTotal.SQL.text:=enfin si le SQL est toujours le même vous avez tout intérêt à utiliser l'instruction QueryTotal.Prepare qui permettra de préparer la requête (à faire qu'une seule fois dés que la base est connectée)

    @Tourlourou je suis étonné que tu proposes une solution à base de boucle
    @Toulourou et benoit1024 non ce n'est pas un problème de casse, Total est un alias de colonne, la colonne ainsi créée dans "le dataset" est insensible à la casse

    [Edit] du coup ce n'est plus que la boule de cristal qui est cassée, c'est aussi ma zenitude

  15. #15
    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
    Citation Envoyé par wiski08000 Voir le message
    et si je veux ajouter une autre condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if mdd.matable.FieldByName('num_cp').AsString=edit2.Text and  //  je veux ajouter une condition de recherche dans un interval de deux DateTimePicker 
    //c.a.d avoir le total a une période défini comment faire


    Peut-être qu'avant de poursuivre, je pense que lire Guide Pascal et Delphi serait adéquat pour la zénitude de tous.

    Citation Envoyé par SergioMaster Voir le message
    En plus l'ordre de vos lignes de code n'est pas bon !
    Une remarque pertinente tout comme QueryTotal.SQL.text:= 'SELECT ...';
    J'ai souvenir que certaines Library DB ignore purement et simplement la modification du SQL lorsque le Query est Active à True.
    Cela ressemble à la situation observée dans le cas présent car au lieu de " QueryTotal champ TOTAL non trouvé "
    il y aurait eu une exception avec un message "la fonction SUM ne porte pas sur un groupe" ou pour SQL Server une phrase comme "the select list is invalid because it is not contained in either an aggregate function or the GROUP BY clause".

    Et certaines Library DB analyse le SQL à chaque Add() pour une requête longue cela ralenti le code par rapport à une seule modification via Text




    Ensuite, différencier la partie SQL qui devrait se tester sur logiciel de SQL intégré a votre client de SGBD ou en add-on
    Par exemple en ORACLE c'est SQL Developper, TOAD ...
    Vous utilisez "SQL 2000 server", je ne connais pas le client en dehors d'un Visual Studio mais vous devriez chercher cet accès à la DB sans DELPHI

    et pour cela il y a aussi des tutoriaux

    Comprendre le SQL en dehors de Delphi est impératif, un excellent tutoriel : LE SQL de A à Z




    La question sur le type du SGBD et sur la couche Query utilisée est importante, je prends par exemple CAST( :dd AS DATE) qui sera souvent pas utile de faire si compliqué mais pour cela faut savoir SGBD et Library
    SQL 2000 server étant un peu vieux, Delphi 7 aussi, il va falloir s'accrocher dans la compréhension du SQL spécifique à cette version surement nettement moins confortable que les versions récentes
    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

  16. #16
    Membre actif
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Par défaut
    merci à vous tous c résolu grâce à vous
    SergioMaster dsl de t'avoir énerver
    et encore merci
    hé oui nous les débutants

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

Discussions similaires

  1. Simplification de code sur double requette sql pour trier les colonnes.
    Par vandman dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/03/2015, 13h43
  2. Réponses: 7
    Dernier message: 11/11/2014, 19h52
  3. comment passer du code html dans une requette sql?
    Par vinceH31 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/11/2006, 18h10
  4. [SQL] erreur dans la requette SQL ou dans le code PHP
    Par jack_1981 dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 11/07/2006, 21h21
  5. requette sql compliqué sous delphi
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/03/2004, 16h33

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