Question sur les critères de recherche

Résolu
cs_marcotte Messages postés 22 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 18 janvier 2011 - 14 nov. 2010 à 19:34
cs_marcotte Messages postés 22 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 18 janvier 2011 - 18 janv. 2011 à 13:22
Bonsoir les codeurs ;)
SVP quel test logique utilise t'on pour faire en sorte qu'une recherche se fasse en fonction d'un ou plusieurs critères ?
Je m'explique je crois^^
J'ai 4 champs de saisie pour les critères, je veux pouvoir utiliser l'un des critères seul pour une recherche ou bien un ensemble de plusieurs critères parmi les 4 possibles (style le premier + le troisième par exemple)
Quel le test à utiliser ?
Par exemple pour une recherche avec l'ensemble des citères ça serait ça :
If critère1 and critère2 and critère3 and critere4 then
begin
....
end;

Mais pour une recherche avec seulement le deuxieme et le quatrieme je sais pas faire, vu que les champs vides vont interférer dans le problème.
Comment dire à mon programme de recherche que je veux seulement les critères choisis (ceux dont les champs sont pleins quoi.

marcotte
Amateur passionné de programmation jeux vidéos 2D et texte (0D ? lol)

7 réponses

dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
16 nov. 2010 à 08:21
Bonjour
voila peut être un début de solution
1) d'abord créer une fonction pour simplifier :
function IIF(condition:boolean; V:integer) : integer;
   begin
  result := 0;
   if condition then result:=V;
   end;



tu déclares une varaiable TEST
TEST : integer;

ensuite dans l'analyse des critères tu fais :
TEST := iif(critere1,1) + iif(critere2,2) + iif(critere3,4) + iif(critere4,8) .....

en suivant la suite 1,2,4,8,16,32 ...

ensuite il ne reste plus qu'a lancer un case !
case of TEST
 //  0 : rien : pas de critère satisfait
1: exe1; // critère 1
2: exe2; // critère 2
3; exe3; // critères 1 et 2    (3 = 1+2)
4: exe4; // critère 3
5: exe5; // critère 1 et 3     (5 = 1+4)
6: exe5; // critère 2 et 3     (6 = 2+4)
7: exe5; // critère 1, 2 et 3  (7 = 1+2+4)
.....  etc c'est du binaire pur

end;



Dubois77
3
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
16 nov. 2010 à 08:53
Salut,
l'exemple de Dubois est parfaitement correcte,
mais je préfére l'utiliser comme ceci, pour des raisons de lisibiliter dans le case,
l'exemple suivant affiche un message indiquant quel composant edit contient du texte (ici 4 edit, 1 bouton)à toi de l'adapter...
function ByteToBin(AValue: Byte): string;
var
    I : Integer;
begin
    I := 4;
    Result := '0000';
    repeat
        if Odd(AValue) then
            Result[I] := '1';
        Dec(I);
        AValue := AValue shr 1;
    until AValue = 0;
end;

function EmptyStrByte(AValue : string): Byte;
begin
    if AValue = EmptyStr then
        Result := 0
    else
        Result := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    CRT  : string;
    CR1  : Byte;
    CR2  : Byte;
    CR3  : Byte;
    CR4  : Byte;
begin
    CR1 := EmptyStrByte(Edit1.Text) shl 0;
    CR2 := EmptyStrByte(Edit2.Text) shl 1;
    CR3 := EmptyStrByte(Edit3.Text) shl 2;
    CR4 := EmptyStrByte(Edit4.Text) shl 3;
    CRT := ByteToBin(CR4 + CR3 + CR2 + CR1);
    case StrToInt(CRT) of
        0000 : ShowMessage('Pas de critère');
        0001 : ShowMessage('Edit1');
        0010 : ShowMessage('Edit2');
        0011 : ShowMessage('Edit1 et Edit2');
        0100 : ShowMessage('Edit3');
        0101 : ShowMessage('Edit1 et Edit3');
        0110 : ShowMessage('Edit2 et Edit3');
        0111 : ShowMessage('Edit1 et Edit2 et Edit3');
        1000 : ShowMessage('Edit4');
        1001 : ShowMessage('Edit1 et Edit4');
        1010 : ShowMessage('Edit2 et Edit4');
        1011 : ShowMessage('Edit1 et Edit2 et Edit4');
        1100 : ShowMessage('Edit3 et Edit4');
        1101 : ShowMessage('Edit1 et Edit3 et Edit4');
        1110 : ShowMessage('Edit2 et Edit3 et Edit4');
        1111 : ShowMessage('Edit1 et Edit2 et Edit3 et Edit4');
    end;
end;

@+Yanb
3
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
16 nov. 2010 à 10:05
resalut,
en relisant les posts tu veux juste utiliser correctement les opérateurs booleens,
ce dont j'ai besoin c'est la façon d'agencer les critères avec des AND et des OR, je ne sais même pas quel opération logique je dois utiliser, est-ce un AND comme j'en ai donné l'exemple dans mon premier post, est-ce un OR, je ne sais pas,

que dire ?!. c'est le béaba, on utilise les règles standard de la logique booléenne.
not (négation), ex : if not A then test => si je n'est pas A alors on fait test
and (conjonction), ex : if A and B then test => si j'ai A et B on fait test
or (disjonction), ex : if A or B then test => si j'ai A ou B ou A et B alors on fait test
xor (disjonction exclusive), ex : if A xor B then test => si j'ai A ou B on fait test
(égal), ex : if A B then test => si A égal B alors on fait test
un autre exemple if ((A+B)> C) and D then test => si A+B supérieur à C et que l'on a D alors on fait test
dans ton exemple de départ si on a critère 2 et 4 et pas 1 et 3 :
if not critère1 and critère2 and not critère3 and critère4 then
begin
...
end;

équivalent à
if not critère1 then
    if critère2 then
        if not critère3 then
            if critère4 then
            begin
            ...
            end;

là je peux pas mieux faire...
après pour plus d'infos sur la logique booléenne et les conditions dans if
regarde dans l'aide de delphi F1 est ton amie...
@+yanb
3
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
16 nov. 2010 à 13:35
Salut Yanb7
on va laisser Marcotte juger si ton code est vraiment plus lisible que le mien !
par contre ta démo sur le booléen ne peux que l'aider à régler son problème car quand j'utilise "critere1", "critére2", c'est en fait les conditions de son problème réel qu'il doit mettre (que je connais pas franchement, vu sa demande de base
et la ta démo doit lui permettre de 'créer' les "critereX"
sachant bien sur que les 'exe1' exe2' ... de man case doivent être ce qu'il veut faire suivant ses critères
à bientôt
Dubois77
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
15 nov. 2010 à 13:58
Bonjour,

Merci de fournir plus d'infos (bdd, SQL etc..)
Je suppose qu'il s'agit d'une requête SQL :
si tel est le cas, alors il te faut un moteur de construction de requêtes :

ce n'est pas très difficile à créer..
je ferai d'abord un choix des critères avec des case à cocher (pour 4 cas, c'est adapté..)
une fois ces derniers choisis, l'utilisateur remplit toutes les zones corerspondantes(tests à prévoir sur edit etc)
Ensuite tu construis la requête avec le choix des critères retenus et les valeurs saisies.
il est possible aussi d'écrire des morceaux de SQL et de les assembler..

cantador
0
cs_marcotte Messages postés 22 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 18 janvier 2011
15 nov. 2010 à 23:39
Merci de me répondre ;)
Il s'agit juste de chercher dans un fichier, vois ça comme une liste d'enregistrements.
Il ne sagit pas de base de données classique comme paradox ou mysql, mais la base de données importe peu en fait, ce dont j'ai besoin c'est la façon d'agencer les critères avec des AND et des OR, je ne sais même pas quel opération logique je dois utiliser, est-ce un AND comme j'en ai donné l'exemple dans mon premier post, est-ce un OR, je ne sais pas, ce que je recherche c'est l'algorithme pas les instructions.
Merci ;)


marcotte
Amateur passionné de programmation jeux vidéos 2D et texte (0D ? lol)
0
cs_marcotte Messages postés 22 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 18 janvier 2011
18 janv. 2011 à 13:22
Salut ;)
Je vous remercie beaucoup de votre aide, j'étais un peu coincé dans mon programme à cause de ça et vous m'avez super aidé et de plus j'ai appris grace à vous quelques trucs bien sympas ^^

J'étais très occupé ces temps-ci, donc désolé si je n'ai pas répondu de suite, en tous cas, je vous suis très reconnaissant les gars ;)

marcotte
Amateur passionné de programmation jeux vidéos 2D et texte (0D ? lol)
0
Rejoignez-nous