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 :

[MsSql-Rad_Studio]Simplifier une commande MsSql


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [MsSql-Rad_Studio]Simplifier une commande MsSql
    Bonjour

    Un autre question simple pour vous mais difficile pour moi

    Comment simplifier cette commande, ca fonctionne bien mais .......

    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
     
                  //CALCUL   MAX DATE
                  MSQuery7.Active:=False;
                   MSQuery7.SQL.text:='SELECT MIN(D_DATE) AS MINDATE FROM  BILLET  where d_payer LIKE :T';// order by D_CODE,d_date,d_coupon1';
                   MSQuery7.ParamByName('T').AsString := '%'+ERECFACT.Text+'%';
                   MSQuery7.Active:=True;
                   mindat:=MsQuery7.fieldbyname('mindate').asSTRING;
     
                    //CALCUL   MAX DATE
                  MSQuery7.Active:=False;
                   MSQuery7.SQL.text:='SELECT MAX(D_DATE) AS MAXDATE FROM  BILLET  where d_payer LIKE :T';// order by D_CODE,d_date,d_coupon1';
                   MSQuery7.ParamByName('T').AsString := '%'+ERECFACT.Text+'%';
                   MSQuery7.Active:=True;
                   maxdat:=MsQuery7.fieldbyname('maxdate').asSTRING;
     
                   //PREPARE RAPPORT
                   MSQuery7.Active:=False;
                   MSQuery7.SQL.text:='SELECT * FROM  BILLET  where d_payer LIKE :T order by D_CODE,d_date,d_coupon1';
                   MSQuery7.ParamByName('T').AsString := '%'+ERECFACT.Text+'%';
                   MSQuery7.Active:=True;
                   CONTRACTEUR_NO:=MsQuery7.fieldbyname('D_CONTRAC').asSTRING +' --> '+'FACTURE NO  ='+ MsQuery7.fieldbyname('D_PAYER').asSTRING;
                   REQ_NO:=MsQuery7.fieldbyname('D_NOCONT').asSTRING;
                   CONTRACTEUR_COD:= MsQuery7.fieldbyname('D_CODE1').asSTRING;
    Le premier select cherche a trouver le min de la date
    le second select cherche a trouver le max de la date
    le troisieme select préparer les données mon rapport


    Il doit avoir un mpoyen de simplifier ca

    Merci

    Mario

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    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 663
    Billets dans le blog
    65
    Par défaut
    Re,
    les 2 premières requêtes peuvent fusionner
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MIN(D_DATE) AS MINDATE,MAX(D_DATE) AS MAXDATE  FROM  BILLET  where d_payer LIKE :T

    la troisième requête n'est probablement pas "fusionnable" aux autres ou alors, peut être par des fonctions de fenêtrage mais ça, c'est une question à poser sur le forum de MSSQL ou du plus général Langage SQL

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 101
    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 101
    Par défaut
    MSQuery7 ? Ne dit pas que tu as MSQuery1, MSQuery2 ... c'est moche !

    En changeant le texte SQL à chaque fois, tu perds les optimisations de SQL Server, c'est dommage.
    Si les requêtes sont fréquentes dans la durée de vie de l'application, tu devrais avoir autant de TMSQuery que nécessaire et faire un Prepare


    Le SELECT * empêche de faire un GROUP BY pour l'écrire en une seule fois
    En ORACLE, il existe MAX(...) OVER (PARTITION BY ...) et cela semble exister en Transac-SQL mais le LIKE offrira un filtre non compatible

    En terme de perf, à voir si c'est mieux, une seule requête que trois

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
      , ( SELECT MIN(D_DATE) FROM BILLET WHERE D_PAYER LIKE :T ) AS MINDATE  
      , ( SELECT MAX(D_DATE) FROM BILLET WHERE D_PAYER LIKE :T ) AS MAXDATE  
    FROM BILLET 
    WHERE D_PAYER LIKE :T 
    ORDER BY D_CODE, D_DATE,D_COUPON1'

    ou

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH
      W_BILLET AS  
      (  
         SELECT * 
         FROM BILLET 
         WHERE D_PAYER LIKE :T 
    )  
    SELECT * 
      , ( SELECT MIN(D_DATE) FROM BILLET WHERE D_PAYER LIKE :T ) AS MINDATE  
      , ( SELECT MAX(D_DATE) FROM BILLET WHERE D_PAYER LIKE :T ) AS MAXDATE  
    FROM W_BILLET
    ORDER BY D_CODE, D_DATE, D_COUPON1'
    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

  4. #4
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [MsSql-Rad_Studio]Simplifier une commande MsSql
    Merci a vous deux

    J'ai essayé vos exemples et ca fonctionne très biens.

    J'ai opté pour la deuxième solution de ShaiLeTroll.

    Pour information supplémentaire j'utilise Sdac de devart et Mssql server 2017 avec Rad Studio 10.2.3.


    Merci Je continue d'apprendre le fonctionnement des commandes en Mssql en l'intégrant a mon programme. il n'est j'amais trop tard pour apprendre.

    Bonne journée

    Mario

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

Discussions similaires

  1. [MsSql-Rad_Studio]Commande equivalente a Locate bde-MsSql
    Par mario9 dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/09/2018, 15h52
  2. [Tokyo-MsSql]Simplifier une expression
    Par mario9 dans le forum Bases de données
    Réponses: 15
    Dernier message: 21/07/2017, 14h27
  3. Réponses: 3
    Dernier message: 03/06/2014, 21h49
  4. insérer une date dans une table mssql
    Par ericmart dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/01/2004, 10h37

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