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 :

Besoin d'aide pour un filtre SVP


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut Besoin d'aide pour un filtre SVP
    bonsoir, s'ils vous plait je voudrai appliquer un filtre a plusieurs critères sur plusieurs table dans Delphi avec l'ADOQuery
    Nom : Capture.PNG
Affichages : 351
Taille : 11,8 Ko

  2. #2
    Rédacteur/Modérateur

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

    Vous avez du remarquer que j'ai déplacé votre discussion. Pourquoi ? parce que d'il s'agit d'un "filtre" et même s'il s'agit d'ADO , vous brancher à une vieille discussion n'est pas une bonne idée, ouvrir un nouveau sujet sur votre problème est une meilleure idée.

    Pour ce qui est du "filtre" (personnellement j'ai horreur de ce terme), étant donné que vous utilisez une Query je pense qu'il est plus simple de bâtir une clause WHERE
    mais pour cela, plutôt qu'un image écran de sélection de critères il aurait été mieux de fournir la structure de la table à interroger.

    Avec le peu d'informations données, je propose quelque chose de ce genre (je pars du principe que les boite de choix sont en fait des DBLookupComboBox) :

    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
    procedure filtrer;
    Const SelectPart = ' SELECT * FROM LATABLE WHERE 1=1'; 
    { le 1=1 permet d'obtenir tous les enregistrements mais dans ce cas surtout de ne pas avoir à gérer l'apparition de la clause WHERE,
    Tout filtre supplémentaire commence donc par un AND  }     
    begin
    ADoQuery1.Close;
    ADoQuery1.SQL.Text:=Selectpart;
    ...
    if Sexe.Checked then 
      begin
        // deux choix, 
        // utiliser des paramètres 
        {1}   ADoQuery.SQL.Add('AND COLSEXE=:S' );
        // il faudra alors écrire ceci avant l'ouverture de la requête  
        ADOQuery.Params.ParambyName('S').asxxxxxxx:=ComboBoxSexe.KeyValue; 
        // ou utiliser une chaine (par exemple)
       {2} ADOQuery.SQ.Add(Format('AND SEXE=%s',[QuotedStr(ComboBoxSexe.KeyValue)]); // s'il s'agit d'une colonne texte
       {2'}ADOQuery.SQ.Add(Format('AND SEXE=%d',[ComboBoxSexe.KeyValue]); // s'il s'agit d'une colonne numérique (entier)   
      end;
    ....// idem pour les autres critères
     
    ADOQuery.Active:=True;
    end;
    Inconvénient de la seconde méthode, s'il s'agit de colonnes dates ou numériques flottantes cela pose des soucis : format des dates ou virgule décimale.

    Une autre technique consiste à implémenter l'évènement OnFilterRecord et du coup cela devient de la "simple" programmation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMainForm.ADOQuery1FilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    begin
    Accept:=True;
    if Sexe.Checked then Accept:=Accept AND (ADOQuery.FieldByname('SEXE').asxxxx =ComboBoxSexe.KeyValue);
    if Wilaya.Checked then Accept:=Accept AND (ADOQuery.FieldByname('WILAYA').asxxxx =ComBoxWilaya.KeyValue;
    // à noter que ADOQuery1.FieldByname('Colonne') peut se remplacer par DataSet['Colonne']
    ....
    end;
    P.S. A propos d'informations données, il est bon d'indiquer aussi : la version de Delphi et le SGBD voire l'OS ,bien que dans ce cas cela ne joue pas vraiment cela pourrait être déterminant lors d'autres questions.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour votre réponse, je dis dire que je n'en attendais pas vue la discussion est ancienne comme vous l'avais mentionné, je suis nouvelle alors j'ai pas sue comment faire, et encore merci...

    Bon pour ce qui est des version que j'utilise c'est SQL Server 2008R2 et Delphi 7, voici la structure de mes tables:
    Nom : Capture.PNG
Affichages : 402
Taille : 42,7 Ko


    Les boites de choix sont des TsComboBox, voici la méthode que j'ai utiliser:

    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
    Procedure TFrameRechercheClients.sSpeedButton1Click(Sender: TObject);
    Begin
        Dm.QueryRech.Close;
        Dm.QueryRech.SQL.Clear;
     
       If Wilaya.Text <> '' Then
       Begin
            Dm.QueryRech.SQL.Add('Select * From Clients Where IdCommun ');
            Dm.QueryRech.SQL.Add(' In (Select IdCommun From Communes Where IdWilaya ='+QuotedStr(Wilaya.Text)+')');
            If Cat.Text <> '' Then
            Begin
                 Dm.QueryRech.SQL.Add('And CatCli='+QuotedStr(Cat.Text));
            End;
            ...[/Je dois ajouter les autres critères]
       End
       Else 
       Begin
            Dm.QueryRech.SQL.Add('Select * From Clients Where ');
            If Cat.Text <> '' Then
            Begin
                Dm.QueryRech.SQL.Add('CatCli='+QuotedStr(Cat.Text));
            End;
            ...
       End;
    Je ne sais pas comment ajouter les autres critères vue que quoique je fasse ça ne marche pas...
    Et encore merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    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 638
    Billets dans le blog
    65
    Par défaut
    Re,
    Il y a un problème dans votre code, trop de begin end else ....
    je vous propose
    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
    Procedure TFrameRechercheClients.sSpeedButton1Click(Sender: TObject);
    Begin
        Dm.QueryRech.Close;
        Dm.QueryRech.SQL.Clear;
            Dm.QueryRech.SQL.Add('Select * From Clients where 1=1'); 
       If Wilaya.Text <> '' Then
       Begin
              // à revoir il faut éviter ce genre de SQL (clause IN) utiliser plutôt une jointure entre clients et communes
              Dm.QueryRech.SQL.Add('AND IDCOMMUN In (Select IdCommun From Communes Where IdWilaya ='+QuotedStr(Wilaya.Text)+')');
       End
       If Cat.Text <> '' Then
            Begin
                Dm.QueryRech.SQL.Add('AND CatCli='+QuotedStr(Cat.Text));
            End;
       ....

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    pour moi le in n'est pas une bonne solution dans une requette SQL

    il serait preferable de travailler avec le jointure directe pour ce faire nous avons besoin
    des noms de table et des noms de propriete qui les relis

    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
     
       StSelect := 'Select CLI.* '
       StFrom := ' From %S '; 
       StTable := 'Clients CLI ';
       StWhere  :='Where  %S'
       If Wilaya.Text <> '' Then
       Begin
         StTable := StTable+',Communes COM';
         StLien :=' CLI.IDCOMMUN  = COM.IdCommun '        // à revoir il faut éviter ce genre de SQL (clause IN) utiliser plutôt une jointure entre clients et communes
         StLien :=StLien +Format(' And ( COM.IdWilaya = %s )',[QuotedStr(Wilaya.Text)]);
       End
        If Cat.Text <> '' Then
          if Trim(StLien ) = '' Then 
             StLien := Format(' ( CLI.CatCli = %s )',[QuotedStr(Cat.Text)]);
          else
             StLien :=StLien +Format(' And ( CLI.CatCli = %s )',[QuotedStr(Cat.Text)]);
     
       ....
       StQuery := StSelect + Format(StFrom,[StTable ]) + Format(StWhere,[StLien]);
       Dm.QueryRech.SQL.Clear;
       Dm.QueryRech.SQL.Add(StQuery);

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut
    bonjour,
    désolé pour le retard ..
    et merci pour vos repenses
    voici comment j'ai fait et ça a marché
    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
         Dm.QueryRech.Close;
         Dm.QueryRech.SQL.Clear;
         If wilaya.Text <> '' then
         Begin
            If Dm.Wilayas.Locate('Wilaya', Wilaya.Text, [loCaseInsensitive]) Then
            Begin
               XWil := Dm.WilayasIdWilaya.AsInteger;
            End;
     
            Dm.QueryRech.SQL.Add('Select * From Clients Where IdCommun ');
            Dm.QueryRech.SQL.Add(' In (Select IdCommun From Communes Where IdWilaya =' +QuotedStr(inttostr(Xwil))+')');
            If cat.Text <> '' Then
            Begin
               Dm.QueryRech.SQL.Add(' and catcli='+quotedStr(cat.Text));
            End;
     
            If comm.Text <> '' Then
            Begin
               Dm.QueryRech.SQL.Add(' and idcommun in (select idcommun from communes where commune='+quotedstr(comm.Text)+')');
            End;
     
            ...
         End
         Else
         Begin
         Dm.QueryRech.SQL.Add('Select * From Clients Where ');
         If cat.Text <> '' Then
            Begin
               Dm.QueryRech.SQL.Add(' catcli='+quotedStr(cat.Text));
            End;
     
            If comm.Text <> '' Then
            Begin
               Dm.QueryRech.SQL.Add(' and idcommun in (select idcommun from communes where commune='+quotedstr(comm.Text)+')');
            End;
     
            ...
         End  ;
            Dm.QueryRech.Open;

    et encore merci pour votre aide

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

Discussions similaires

  1. Besoin d'aide pour une formation svp
    Par caciuslove dans le forum Etudes
    Réponses: 0
    Dernier message: 24/10/2012, 21h55
  2. besoin d'aide pour mon pti svp
    Par greg95 dans le forum Langage
    Réponses: 5
    Dernier message: 23/12/2011, 13h21
  3. connexion ado avec acces et besoin d'aide pour code vb svp
    Par essse dans le forum Visual Studio
    Réponses: 0
    Dernier message: 06/03/2009, 09h57
  4. [pgf-tikz] Besoin d'aide pour l'installer SVP
    Par pinpom dans le forum Débuter
    Réponses: 2
    Dernier message: 22/06/2008, 11h46
  5. Besoin d'aide pour une jointure svp
    Par plex dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2007, 13h27

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