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

C++Builder Discussion :

Base de données TQuery filtre


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Base de données TQuery filtre
    Bonjour à tous!

    Ma question a probablement et malheureusement déjà été traitée, mais je ne trouve pas ce que je veux, même après de nombreuses minutes de recherche (disons 40 min). Alors voilà ma question :

    Je veux faire un filtre dans une base de donnée avec un TQuery. Chose simple et fonctionnel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query->Filtre = "ID = '" + Id_Filtre->Text + "*' ";
    Ensuite je l'active.

    Je mets ce code dans l'action OnKeyUp de sorte qu'il rafraichit le filtre à chaque lettre.

    Ma deuxième étape non-fonctionnelle vient lorsque je veux garder ce filtre et ajouter le filtre dans une autre colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query->Filtre = "No = '" + No_Filtre->Text + "*' ";
    J'aimerais qu'il garde en mémoire le premier filtre, alors :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query->Filtre = "ID = '" + ID_Filtre->Text + "*' && " + Query->Filtre ;

    Donc, j'imagine que de la sorte, il gardera le filtre précédent. Malheureusement pas...

    Vous voyez bien que je suis un codeur de base gamme... mais j'apprécierais un peu d'aide

    Merci,

    Bonne journée!

    antoine

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    alors, déjà une petit remarque sur ton filtre SQL :
    Tu met une étoile derrière le texte de ton filtre, je suppose que c'est pour dire que tu veut tout ce qui commence par ce texte. En SQL il faut alors utiliser l'attribut LIKE pour faire cela, ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query->Filtre = "ID = '" + Id_Filtre->Text + "*' ";
    devient donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query->Filtre = "ID LIKE %" + Id_Filtre->Text + "*% ";
    Ensuite il faut a mon avis que tu fasse pointer le même événement OnKeyUp pour tes deux TEdit et que tu y met ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    AnsiString filter;
    if(Id_Filtre->Text != "")
    {
      filter = "ID LIKE %" + Id_Filtre->Text + "*%";
    }
    if(No_Filtre->Text != "")
    {
      if(filter != "")
        filter += " && ";
      filter += "No LIKE %" + No_Filtre->Text + "*%";
    }

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Tout d'abord, merci!

    Ensuite, le premier code que j'utilisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query->Filtre = "ID = '" + Id_Filtre->Text + "*' ";
    Fonctionnait, et provenait de :

    http://lberne.developpez.com/bcb/paradox/

    Mais, ce n'est peut-être pas la meilleure méthode.

    Alors, j'ai tenter de mettre en oeuvre le code que vous m'avez donner de la façon suivante :

    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
    void __fastcall TForm2::ID_FiltreKeyUp(TObject *Sender, WORD &Key,
    	  TShiftState Shift)
    {
    	AnsiString filter;
     
     
    	if(Id_Filtre->Text != "")
    	{
    		filter = "ID LIKE %" + Id_Filtre->Text + "*%";
    		Query1->Filter = filter;
    		Query1->Filtered = true;
    	}
    	if(No_Filtre->Text != "")
    	{
    		if(filter != "")
    			filter += " && ";
    		filter += "No LIKE %" + No_Filtre->Text + "*%";
    		Query1->Filter = filter;
    		Query1->Filtered = true;
    	}
    	if(No_Filtre->Text == "" && Id_Filtre->Text == "")
    	{
    		Query1->Filtered = false;
    	}
     
    }
    Comme vous me l'avez suggérez (ce qui est une très bonne idée d'ailleurs) j'ai faite pointer les deux évènement de "OnKeyUp" vers la même fonction.

    Cependant, il y a un problème :

    Lorsque j'entre du text dans ma boîte Id_Filtre (dans la boîte No_Filtre tout va bien, ça filtre) l'erreur suivante survient :

    "Invalid filter expression character : '%'."

    Je vais continuer d'essayer de trouver le problème en vous attendant.

    merci,

    antoine

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Bonjour,
    je vient de vérifier et mes souvenir en SQL été quelque peut erroné, voici la bonne 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
    void __fastcall TForm2::ID_FiltreKeyUp(TObject *Sender, WORD &Key,
    	  TShiftState Shift)
    {
    	AnsiString filter;
     
     
    	if(Id_Filtre->Text != "")
    	{
    		filter = "ID LIKE '" + Id_Filtre->Text + "%'";
    		Query1->Filter = filter;
    		Query1->Filtered = true;
    	}
    	if(No_Filtre->Text != "")
    	{
    		if(filter != "")
    			filter += " && ";
    		filter += "No LIKE '" + No_Filtre->Text + "%'";
    		Query1->Filter = filter;
    		Query1->Filtered = true;
    	}
    	if(No_Filtre->Text == "" && Id_Filtre->Text == "")
    	{
    		Query1->Filtered = false;
    	}
     
    }
    En fait, en SQL on utilise le % à la place du * avec le LIKE pour signaler que c'est un contenu partielle

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Bonjour,

    J'ai essayé avec modifications, et j'ai toujours une erreur :

    "Operation not applicable."

    (J'ai reviser mon code pour me rendre compte que le No_filtre OnKeyUp pointait vers la mauvaise fonction ce qui explique qu'un des deux fonctionnait, désormais, les deux sont non-fonctionnel)

    La même erreur survient dans les deux cas :

    "Operation not applicable."

    Peut-être que ce n'est pas dans la propriété "Filter"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query1->Filter = filtre;
    Mais plutôt dans la propriété SQL qu'il faudrait attribuer le code?

    Si c'est le cas, j'ai un petit problème puisque j'utilise déjà cette propriété pour me faire une Grid à partir de différente table (requête SQl en bref).

    Je vais essayer avec le SQL tout en gardant mes anciennes requêtes.

    merci,

    antoine

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    dans la propriété SQL, tu doit mettre une requête complète, or la tu n'as qu'une clause WHERE d'une requête, ce qui correspond au filtre, par contre il est possible que la propriété Filter ne gère pas le LIKE, mais cela m'étonnerai, à voir.

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Après quelques lecture de l'aide Borland voici la réponse tant cherchée :

    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
    void __fastcall TForm2::Id_FiltreKeyUp(TObject *Sender, WORD &Key,
    	  TShiftState Shift)
    {
    	AnsiString filter;
     
    	if(Id_Filtre->Text != "")
    	{
    		filter = "ID = '" + Id_Filtre->Text + "*'";
    		Query1->Filter = filter;
    		Query1->Filtered = true;
     
    	}
    	if(No_Filtre->Text != "")
    	{
    		if(filter != "")
    			filter += " and "; // Voici la ligne qui fait toute la différence 8-)
    		filter += "No = '" + No_Filtre->Text + "*'";
    		Query1->Filter = filter;
    		Query1->Filtered = true;
     
    	}
    	if(No_Filtre->Text == "" && Id_Filtre->Text == "")
    	{
     
    		Query1->Filtered = false;
    	}
    }
    La syntaxe est " and " plutôt que " && ".

    Merci de votre intérêt!

    Antoine

  8. #8
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Citation Envoyé par antoinelac Voir le message
    La syntaxe est " and " plutôt que " && ".

    Merci de votre intérêt!

    Antoine
    Houla, je suis vraiment désolé, j'aurai pas du mettre cette connerie, je suis trop habitué au C++, j'ai mélangé, vraiment désolé de cette grossière erreur.

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Pas de problème! Votre aide m'a permis de me rendre à la solution!

    Antoine

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

Discussions similaires

  1. Recherche base de données tquery, filtre
    Par sousou88 dans le forum Bases de données
    Réponses: 8
    Dernier message: 04/05/2010, 02h27
  2. base de données avec filtre automatique
    Par DIAD1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/05/2008, 13h58
  3. Filtre de valeurs dans la base de données à partir d'excel
    Par xtian_Québec dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/12/2007, 03h31
  4. Débutant : Filtre dans un base de donnée access.
    Par Brain3D dans le forum Bases de données
    Réponses: 23
    Dernier message: 05/06/2006, 03h17
  5. [VB.NET] filtre dans base de donnée
    Par speedtug dans le forum Windows Forms
    Réponses: 7
    Dernier message: 21/09/2005, 17h12

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