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 :

Choix multiple + clause WHERE


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 186
    Points : 84
    Points
    84
    Par défaut Choix multiple + clause WHERE
    Bonjour à tous,

    J'ai 4 CheckBox que l'on va nommer chk1, chk2, chk3, chk4.
    En fonction du choix je dois créer des filtres sur mes champs
    mais les choix peuvent être combinés.

    En fait il faudrait que je puisse additionner mes filtres du style :
    if chk1.Checked then
    Filter := Filtrer + 'Status = ''Ok'''
    else
    Filter := Filtrer - 'Status = ''Ok'''

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    il te faut utiliser les ensembles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
      TOption = (Opt1, Opt2, Opt3, Opt4);
      TOptions = set of TOption;
     
    Var options : TOptions;
     
    Options := [];  // Vide
    Options := [Opt2, Opt4];  // Affectation de 2 choix
    Options := Options + [Opt3, Opt1]; // Ajout de 1 ou plusieurs choix
    Options := Options - [Opt1, Opt2];  // Suppression de 1 ou plusieurs choix
    Une autre solution tres tres proche de celle ci serait d'utiliser les bits.
    Une variable Integer est codee sur 4 octets, donc 4*8 = 32 bits.
    Soit un ensemble de 32 valeurs (0=Absent, 1=Present).

    Pour ajouter une valeur on fait un OR sur l'entier designant l'eneble et l'entient contenant uniquement le bit de la valeur a affecter.
    00000001 or 00000010 = 00000011 => Ajout du 2e element

    Pour la suppression c'est pareil mais avec un And :
    00000011 and 11111101 = 00000001

    Pour effectuer ces operations on se base sur les entiers :
    00000001 = 1
    00000010 = 2
    00000100 = 4
    00001000 = 8
    Etc ...
    Donc :

    Soit : Var Options : Integer = 0;

    Options or 4 = Ajout de la 3e option
    Options or 8 = Ajout de la 4e option.

    Pour la suppression, on il faut utiliser l'inverse de l'entier :
    00000001 => 11111110 = not 1
    Donc : Options or (not 8) = Suppression du 4e element ....

    Ca reviens au meme que les set Of mais ca fait du bien de la savoir
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Clorish je crois que tu es aller un peu trop loin par rapport a ce qu'il veut (je pense)

    Pour le cas de multiple Option tu peux utiliser une TStringList pour Cumuler tes options à mettre dans un filter

    A mettre dans la partie onClick des checkbox pour un effet en direct sur le dataset.

    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
     
    var
      lst : TStringList;
      i : integer;
    begin
      lst := TStringList.Create;
      try
        if chk1.checked then
          lst.Add('MonFiltre1');
     
        if chk2.checked then
          lst.Add('MonFiltre2');
     
       MonCompoDb.Filtered := False; 
       if lst.count > 0 then
       begin
         MonCompoDb.Filter := lst.Strings[0];
         for i := 1 to lst.count -1 do
           MonCompoDb.Filter := MonCompoDb.Filter + ' and ' + lst.Strings[i];
         MonCompoDb.Filtered := true;
       end;
     
      finally 
        lst.free;
      end;
    end;
    il y a peut être mieux mais en général je fais comme ca.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Clorish je crois que tu es aller un peu trop loin par rapport a ce qu'il veut (je pense)
    Je ne pense pas
    Les "Set of" sont fait pour ca
    Par contre, l'explication qui vient apres n'est pas utile, mais sert juste a expliquer une astuce fort utile dans cetains ca.
    D'ailleur les "Set of" se base sur une technique proche de celel la

    Citation Envoyé par Rayek Voir le message
    Pour le cas de multiple Option tu peux utiliser une TStringList pour Cumuler tes options à mettre dans un filter
    Tout a fait ... dans la mesure ou ce que l'on souhaite stocker est une chaine de caractere a manipuler en tant que tel.
    Sinon les entiers sont plus simple. Il exite tout une serie d'operateurs qui marchent directement sur les ensemble et on 'utilise qu'un entier au lieu d'une classe.
    Quitte a faire un case sur la variable ensemble pour generer la chaine textuelle d'une requette SQL (si j'ai bien compris le domaine d'application)

    Citation Envoyé par Rayek Voir le message
    il y a peut être mieux mais en général je fais comme ca.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      TOption = (Opt1, Opt2, Opt3, Opt4);
      TOptions = set of TOption;
     
    Var options : TOptions;
     
    Options := [];  // Vide
    Options := [Opt2, Opt4];  // Affectation de 2 choix
    Options := Options + [Opt3, Opt1]; // Ajout de 1 ou plusieurs choix
    Options := Options - [Opt1, Opt2];  // Suppression de 1 ou plusieurs choix


    Note : Je me suis inspiré de son exemple qui ressemble etrangement a celui qui est utilisé dans l'usage de variable "ensemble".
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 186
    Points : 84
    Points
    84
    Par défaut
    Merci pour vos idées... je les garde bien en mémoire...

    J'ai travaillé un peu autrement. J'ai créé une procédure qui est appelée à chaque fois que je clique sur un checkbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure ConstStrWhere();
    var
      strWhere : string;
    begin
      strWhere := '';
      if chk1.Checked then strWhere := strWhere + ' OR (ma recherche sur chk1)';
      if chk2.Checked then strWhere := strWhere + ' OR (ma recherche sur chk2)';
      if chk3.Checked then strWhere := strWhere + ' OR (ma recherche sur chk3)';
      if chk4.Checked then strWhere := strWhere + ' OR (ma recherche sur chk4)';
      strWhere := copy(strWhere, 5, length(strWhere)); //pour supprimer le OR du début
    ensuite je n'ai plus qu'a compléter ma requête du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT * FROM matable WHERE ' + strWhere
    et voilà...

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par yamino Voir le message
    ensuite je n'ai plus qu'a compléter ma requête du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT * FROM matable WHERE ' + strWhere
    Attention au cas ou StrWhere est vide

    Sinon, juste pour info, l'usage d'un Set Of te permet d'utiliser un case au lieu de plusieurs IF. C'est plus rapide
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Clorish Voir le message
    Attention au cas ou StrWhere est vide

    Sinon, juste pour info, l'usage d'un Set Of te permet d'utiliser un case au lieu de plusieurs IF. C'est plus rapide
    Avec ou sans le Set Of il sera obligé de faire des if, car c'est un cumul d'option qu'il veut pas l'utilisation d'une option unique.

    A la fin il sera obligé quand même de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Opt2 in Options then result := result + 'Critère2';
    if Opt3 in Options then result := result + 'Critère3';
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Avec ou sans le Set Of il sera obligé de faire des if, car c'est un cumul d'option qu'il veut pas l'utilisation d'une option unique.
    Autant pour moi .... petit passage a vide
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

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

Discussions similaires

  1. Requête avec multiple clause where
    Par pgenet dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/03/2006, 13h59
  2. [ character en simple cote ] clause Where
    Par hocinema dans le forum DB2
    Réponses: 3
    Dernier message: 20/02/2004, 10h17
  3. [TABLE][ENUM] u champs à choix multiple ?
    Par narmataru dans le forum SQL
    Réponses: 2
    Dernier message: 04/11/2003, 10h25
  4. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 15h21
  5. formulaire choix multiple
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 02/02/2003, 18h59

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