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

Langage Delphi Discussion :

Besoin d'aide, filtrage spécial.


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut Besoin d'aide, filtrage spécial.
    Bonjour;
    J’ai un petit problème au niveau du filtrage.
    J’ai un dbgrid et un edit, et quand j'ecrit le premier caractère dans edit mon dbgrid n'affiche que les enregistrements commençant par ce caractère, alors je veux que mon dbgrid affiche tous les enregistrements qui contient au mois ce caractère, et en tapant le deuxième caractère mon dbgrid affiche tous les enregistrements qui contient au moins ces deux caractère attachés, ect.

    mon code actuel est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TFSearchArch.Edit7Change(Sender: TObject);
    begin
       IF Edit7.GetTextLen<> 0 then
       BEGIN
       TdbQuery1.Filter:='libelle_arch='''+Edit7.Text+'*''';
       TdbQuery1.Filtered:=true;
       END
       else
       TdbQuery1.Filtered:=false;
    end;

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 6 998
    Points
    6 998
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonsoir,

    peut être ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFSearchArch.Edit7Change(Sender: TObject);
    begin
       TdbQuery1.Filtered:=False;
       TdbQuery1.Filter:='libelle_arch='+quotedstr('*'+Edit7.Text+'*');
       TdbQuery1.Filtered:=True;
    end;

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    Salut;
    j'ai essayé avec ce code:
    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
     
    procedure TFSearchArch.W7ToolButton4Click(Sender: TObject);
    begin
      TdbQuery1.SQL.Clear;
      TdbQuery1.SQL.Add('SELECT');
      TdbQuery1.SQL.Add(' a.libelle_arch, S.etage_salle, S.num_salle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage,');
      TdbQuery1.SQL.Add(' D.libelle_dir, L.langue_doc, a.duree_vie, a.type_interet, T.des_type_arch, E.etat_arch');
      TdbQuery1.SQL.Add(' FROM archive');
      TdbQuery1.SQL.Add(' LEFT JOIN directions D ON a.id_dir = D.id_dir');
      TdbQuery1.SQL.Add(' LEFT JOIN etat_arch E ON a.id_etat_arch = E.id_etat_arch');
      TdbQuery1.SQL.Add(' LEFT JOIN Langue_docum L ON a.id_langue_arch = L.id_langue_arch');
      TdbQuery1.SQL.Add(' LEFT JOIN salles_archives S ON a.id_salle = S.id_salle');
      TdbQuery1.SQL.Add(' LEFT JOIN types_archives T ON a.id_type_arch = T.id_type_arch');
      TdbQuery1.SQL.Add(' ORDER BY a.libelle_arch ');
      TdbQuery1.SQL.Add(' WHERE libelle_arch like ''%+edit7.Text+%''');
      TdbQuery1.Prepare;
      TdbQuery1.Open;
    end;
    mais une erreur se déclanche:
    The SQL command has an error at row 11, coumn 2:
    "<end of statement>" expected



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TdbQuery1.Filter:='libelle_arch='+quotedstr('*'+Edit7.Text+'*');
    La méthode quotedstr ne marche que avec un enregistrement qui contient un seul mot, par contre mon enregistrement libelle_arch peut contenir plusieurs

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 519
    Points : 25 037
    Points
    25 037
    Par défaut
    n'utilise pas la concaténation de valeur, c'est toujours dangereux
    Si ton SGBD le supporte ainsi que la couche d'accès aux données
    Exemple ORACLE + ODAC, cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      TdbQuery1.SQL.Add(' WHERE libelle_arch like :pfiltreLibelle');
      TdbQuery1.SQL.Add(' ORDER BY a.libelle_arch '); // ORDER BY est toujours après le WHERE !
      TdbQuery1.Prepare;
     
      TdbQuery1.ParamByName('pfiltreLibelle').AsString :='%' + edit7.Text+ '%';
      TdbQuery1.Open;
    end;
    Attention, quand tu évoques plusieurs mots, il faut voir le contenu de edit7.Text comme un texte continu
    Si tu cherches LIKE '%salut bob%', cela va te renvoyer que ce qui contient exactement 'salut bob', par exemple 'salut bobby'
    Si tu cherches LIKE '%salut%bob%', cela va te renvoyer que ce qui contient 'salut' puis 'bob', par exemple 'salut bobby' mais aussi 'salutations bobby'
    Si tu cherches LIKE '%salut%' AND LIKE '%bob%', cela va te renvoyer que ce qui contient à la fois 'bob' et 'salut' sans importance d'ordre dans les mots par exemple 'salutations bobby' mais aussi 'bobby! mes salutations !'
    Si tu cherches LIKE '%salut%' OR LIKE '%bob%', cela va te renvoyer que ce qui contient soit 'bob' soit 'salut' ou même les deux sans importance d'ordre dans les mots
    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

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 065
    Points
    41 065
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par samidz2014 Voir le message
    mais une erreur se déclenche:
    The SQL command has an error at row 11, coumn 2:
    "<end of statement>" expected
    La clause WHERE doit se trouver avant la clause ORDER BY

    La méthode quotedstr ne marche que avec un enregistrement qui contient un seul mot
    quotedstr n'est pas une méthode, juste un fonction évitant d'avoir à se perdre dans le nombre de quotes

    la méthode SQL est de loin bien meilleure que le filtre , quoique cela dépende de la SGBD et du contexte. Il y a aussi l'utilisation de l'évènement Onfilter à envisager.
    OnFilter contenant un expression régulière peut être très très efficace. D'ailleurs certains SGBD utilise ces expressions (SIMILAR TO)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     TdbQuery1.SQL.Add(' WHERE libelle_arch like :pfiltreLibelle');
      TdbQuery1.SQL.Add(' ORDER BY a.libelle_arch '); // ORDER BY est toujours après le WHERE !
      TdbQuery1.Prepare;
     
      TdbQuery1.ParamByName('pfiltreLibelle').AsString :='%' + edit7.Text+ '%';
      TdbQuery1.Open;
    end;
    Merci Troll
    Merci SergioMaster

    Mon code final est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TdbQuery1.SQL.Clear;
      TdbQuery1.SQL.Add('SELECT * FROM archive ');
      TdbQuery1.SQL.Add(' WHERE libelle_arch like :pfiltrelibelle_arch');
      TdbQuery1.SQL.Add(' ORDER BY libelle_arch ');
      TdbQuery1.Prepare;
      TdbQuery1.ParamByName('pfiltrelibelle_arch').AsString :='%' + edit7.Text+ '%';
      TdbQuery1.Open;
    Il reste autre chose, c'est au niveau de la clause 'SELECT * FROM ARCHIVE', cette commande me selectionne tous les colonnes que contients ma table archive, est ce qu'il ya une commande SQL qui me selectionne tous les colones de ma tabla archives sauf une colone ou quelque colones.
    J’ai essayé : ‘SELECT * EXCEPT(Id_arch) FROM ARCHIVE', mais ça n’a pas marché

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 065
    Points
    41 065
    Billets dans le blog
    62
    Par défaut
    re
    Il reste autre chose, c'est au niveau de la clause 'SELECT * FROM ARCHIVE', cette commande me selectionne tous les colonnes que contient ma table archive
    C'est le comportement normal, d'ailleurs il n'est pas recommandé d'utiliser cette forme (*)
    est-ce qu'il y a une commande SQL qui me selectionne toute les colonnes de ma tabla archives sauf une colonne ou quelques colonnes.
    Non c'est à vous d'indiquer les colonnes que vous voulez obtenir ( moins que un SGBD le permette mais je ne pense pas que ce soit dans la norme SQL
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut
    RESOLU

    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
      TdbQuery1.SQL.Clear;
      TdbQuery1.SQL.Add('SELECT');
      TdbQuery1.SQL.Add(' a.libelle_arch, S.etage_salle, S.num_salle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage,');
      TdbQuery1.SQL.Add(' D.libelle_dir, L.langue_doc, a.duree_vie, a.type_interet, T.des_type_arch, E.etat_arch');
      TdbQuery1.SQL.Add(' FROM archive a');
      TdbQuery1.SQL.Add(' LEFT JOIN directions D ON a.id_dir = D.id_dir');
      TdbQuery1.SQL.Add(' LEFT JOIN etat_arch E ON a.id_etat_arch = E.id_etat_arch');
      TdbQuery1.SQL.Add(' LEFT JOIN Langue_docum L ON a.id_langue_arch = L.id_langue_arch');
      TdbQuery1.SQL.Add(' LEFT JOIN salles_archives S ON a.id_salle = S.id_salle');
      TdbQuery1.SQL.Add(' LEFT JOIN types_archives T ON a.id_type_arch = T.id_type_arch');
     
      TdbQuery1.SQL.Add(' WHERE libelle_arch like :pfiltrelibelle_arch');
      TdbQuery1.SQL.Add(' ORDER BY libelle_arch ');
      TdbQuery1.Prepare;
      TdbQuery1.ParamByName('pfiltrelibelle_arch').AsString :='%' + edit7.Text+ '%';
      TdbQuery1.Open;

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 10/07/2013, 16h07
  2. Réponses: 2
    Dernier message: 03/12/2010, 22h21
  3. Besoin d'aide pour un UPDATE un peu spécial
    Par Julien__ dans le forum Requêtes
    Réponses: 6
    Dernier message: 09/03/2009, 11h06
  4. Overflow un peu spécial, Besoins d'aide.
    Par tom.f dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/06/2007, 12h29
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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