ca marche pour certains cas mais pas pour d'autres, ta routine est tres asticieuse mais excuser moi, je n'arrive ps à l'implanter![]()
ca marche pour certains cas mais pas pour d'autres, ta routine est tres asticieuse mais excuser moi, je n'arrive ps à l'implanter![]()
j'imagine que les listbox correspondent à des index dans une table secondaire non ?
dans ce cas il faut pas utiliser le code proposé mais un dérivé pour un entier
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 sep:string; procedure AddField(const Value,FieldName:string); begin if Value='' then exit; SQL.Add(sep+FieldName+' LIKE "%'+SqlEncode(Value)+'%"'); sep:=' AND '; end; procedure AddIndex(Value:integer; const FieldName:string); begin if Value<0 then exit; SQL.Add(sep+FieldName+'='+IntToStr(Value)); sep:=' AND '; end; begin SQL.Text:='SELECT * FROM Table'; sep:=' WHERE '; AddField(Edit1.Text,'Champ1'); AddField(Edit2.Text,'Champ2'); AddField(Edit3.Text,'Champ3'); AddIndex(ComboBox1.ItemIndex,'Champ4'); end;
Voilà un cas concret ou ca ne marche pas
oui c'est exactement ce dont je parle juste un avant...le champ fonction ne serait-il pas un entier contenant un code fonction au lieu du libellé ?
si ce n'est pas le cas, c'est que la base est mal conçue![]()
les champs sont tous des VARChar, sauf pour Matricule int(11) . Ma table est tout ce qui y a de plus simple.
Dans le message d'erreur de la requête
il manque le mot clé "WHERE" à la place du "AND"...
salut
regade bien le code que paul ta fournie
le premier sep etait where et une foi passé dans la condition
la variable sep passe a and
j'avou que je ne l'aurai pas fait ainsi mais sa demarche est assez clair
@+ Phil
justement il est très claire et très logique, mais le fait de passer au AND directement des que je rempli plusieurs Edit en meme temps : nom := 'Quelque chose' et Matricule := 'Quelque chose' j'ai ce message d'erreur. J'avoue que je suis mal barré comme ça![]()
J'ai aucun problème quant je fais un seul de critère de recherche, mais dès que je mets plusieurs ca ne marche plus pour certaines combinaisons, j'ai les boules
Oui c'est vrai, le voici :
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 procedure AddField(const Value,FieldName:string); begin if Value='' then exit; dm.tbPersonne.SQL.Add(sql+sep+FieldName+' LIKE "%'+SqlEncode(Value)+'%"'); sep:=' AND '; end; procedure TfMenu.bGoClick(Sender: TObject); begin dm.tbPersonne.Close; dm.tbPersonne.SQL.Clear; sql := '';sep:=''; sql:='SELECT * FROM personne'; sep:=' WHERE '; AddField(eNom.Text,'nom'); AddField(eMatricule.Text,'matricule'); AddField(cbService.Text,'service'); AddField(cbFonction.Text,'fonction'); AddField(eCin.Text,'cin'); AddField(eEtat.Text,'etat'); AddField(eType.Text,'tenue_civile'); dm.tbPersonne.Open; lTotal.Caption := IntToStr(dm.tbPersonne.RecordCount); end;
je suis sur qu'il y a qlq chose de tres banal qui m'échappe, mais c quoi j'arrive toujours pas à le detecter![]()
ARGH !
déjà, il faut utiliser les balises CODE pour le code
ensuite tu as fait un gros mélange des genres !
soit tu utilises la variable "sql:string" soit tu utilise "SQL.Add()" mais pas le deux !
tel que tu écris ton code tu vas te retrouver avec une requête
pour détecter ce genre d'erreur, il suffit d'ajouter un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2'SELECT * FROM Personne WHERE nom LIKE "%TOTH%" AND SELECT * FORM Personne AND matricule LIKE "%1234%"'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ShowMessage(dm.tbPersonne.SQL.Text);![]()
quelle balise dois je mettre?
justement je voudrais utiliser sql comme tu m'as envoyé ds le source. Mais je n'ai ps réussi à l'integrer ds mon SQL Command pour pouvoir l'executer.
Corrigez moi le source que je vous ai envoyé, parceque moi je suis saturé à force d'y réflechir
Merci beaucoup d'avance
Pour ma part je ferais plus dans ce style
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
40
41
42
43
44
45 var lst : TStringList; i : integer; sChamp,sValue : String; begin lst := TStringList.Create; try if eNom.Text <> '' then lst.Add('nom=' + eNom.Text; if cbService.Text <> '' then lst.add('service=' + cbService.Text; if cbFonction.Text <> '' then lst.Add('function=' + cbFonction.Text); if eMatricule.Text <> '' then lst.Add('matricule=' + eMatricule.Text); // Etc ... pour les champs with dm.tbPersonne do begin Close; SQL.Clear; SQL.Add('Select * from personne'); if lst.Count > 0 then SQL.Add('where'); for i := 0 to lst.Count -1 do begin sChamps := lst.Names[i]; sValue := lst.Value[sChamp]; SQL.Add(sChamps ' LIKE ' + QuotedStr('%' + sValue + '%')); if i <> lst.count -1 then SQL.Add('And'); end; SQL.Add('order by nom'); // sauvegarde de la requete dans un fichier texte pour voir à quoi elle ressemble SQL.SaveToFile('Marequetetest.txt'); Open; end; finally lst.free; end;
Modérateur Delphi
Le guide du bon forumeur :
- Les règles du forum tu liras
- La FAQ et les tutoriels tu consulteras
- La fonction Recherche tu utiliseras
- Google tu vénèreras
__________
Rayek World : Youtube Facebook
merci beaucoup Rayek, je vais tester cette routine, et je vous tiens au courant
je vous remercie tous pour votre support, le resultat est tres satisfaisant
Merci mille fois
Partager