cs_eli42
Messages postés143Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention11 juillet 2023
-
19 juin 2012 à 14:25
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 2021
-
25 juil. 2012 à 15:05
Bonjour,
J'ai x recherche différente dans mes Form un coup un DBGrid avec une colonne recherche, un autre coup 2 etc jusqu'à 10 champs
pour m'éviter des lignes de code à gogo, je me suis fait une procédure, ma question : est elle bien légale
ou est ce qu'il y à une procédure plus logique.
Beau Temps Belle Mer
Georgio
voici le code :
procedure TFILTRE_TRIE.LIKE_2(C_: Integer {Case}; Q_: TZQuery {Base}; V1_ {Champ},
V2_, V3_, V4_, V5_, V6_, V7_, V8_, V9_, V10_, S_ {Select}, W1_ {Like}, W2_,
W3_, W4_, W5_, W6_, W7_, W8_, W9_, W10_, O_ {Order}: string);
var SELECT_, ORDER_: string;
begin
try
{----- Formule ----------------------------------------------------------------
Case, Query, Donnees, Select, Champ, Order
Exemple pour 2 champ : Code postel et ville
2, DM.CP,ER1.text,ER2.text,'','','','','CP','CP','FICHE','','','','','CP ASC');
-------------------------------------------------------------------------------}
SELECT_ := 'Select * From ' + S_ + ' where ('; // dbut SQL
ORDER_ := ' Order by ' + O_; // Fin SQL
W1_ := SELECT_ + W1_ + ' LIKE ''%' + V1_ + '%'')'; // construction SQL
W2_ := W1_ + ' And (' + W2_ + ' LIKE ''%' + V2_ + '%'')';
W3_ := W2_ + ' And (' + W3_ + ' LIKE ''%' + V3_ + '%'')';
W4_ := W3_ + ' And (' + W4_ + ' LIKE ''%' + V4_ + '%'')';
W5_ := W4_ + ' And (' + W5_ + ' LIKE ''%' + V5_ + '%'')';
W6_ := W5_ + ' And (' + W6_ + ' LIKE ''%' + V6_ + '%'')';
W7_ := W6_ + ' And (' + W7_ + ' LIKE ''%' + V7_ + '%'')';
W8_ := W7_ + ' And (' + W8_ + ' LIKE ''%' + V8_ + '%'')';
W9_ := W8_ + ' And (' + W9_ + ' LIKE ''%' + V9_ + '%'')';
W10_ := W9_ + ' And (' + W10_+ ' LIKE ''%' + V10_+ '%'')';
//------------------------------------------------------------------------------
Q_.Open;
Q_.Sql.Clear;
case C_ of
1: Q_.Sql.Add(W1_ + ORDER_);
2: Q_.Sql.Add(W2_ + ORDER_);
3: Q_.Sql.Add(W3_ + ORDER_);
4: Q_.Sql.Add(W4_ + ORDER_);
5: Q_.Sql.Add(W5_ + ORDER_);
6: Q_.Sql.Add(W6_ + ORDER_);
7: Q_.Sql.Add(W7_ + ORDER_);
8: Q_.Sql.Add(W8_ + ORDER_);
9: Q_.Sql.Add(W9_ + ORDER_);
10: Q_.Sql.Add(W10_+ ORDER_);
end;
Q_.Active := True;
//------------------------------------------------------------------------------
except
Exit;
end;
end;
Exemple appel pour une recherche de 4 likes :
Une date, un horaire, un commercial et le nom du client :
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 25 juil. 2012 à 10:46
Bonjour eli42,
Juste un point, je ne réponds pas en principe au message perso (sauf cas exceptionnel) sinon, il me faut quatre vies :
- ma vie privée
- ma vie professionnelle
- CS
- les messages perso
Ensuite, pense à placer ton code dans les balises prévues et évite les variables style W1_ car l'ensemble est difficile à lire..
Il suffit pour s'en convaincre de voir le nombre de réponses reçues depuis
le 19/06/12..
Juste quelques remarques sur le code :
On ferme les query en entrée, on vide, on cale le SQL et sur un SELECT, on utilise uniquement
.Open (ouvre et execute le SQL)
toi, tu écris deux fois la même chose (Open et active:= true)
Mis à part ça, la question que tu poses n'est pas simple car automatiser
à l'extrême toute une série de requêtes semble à priori intéressant au premier abord, mais à l'usage , cela peut se révéler un lourd handicap en
cas de :
- modifications de tables
- modifications structurelles de la base
- changement de programmeur
- etc.
L'important, est pour l'instant que ton système fonctionne et qu'il soit fluide.
Moi, je préfère écrire posément chaque requête SQL avec tous les champs et
paramètres.
Cela ne ralentit nullement mes programmes, d'autant qu'il est rare que plusieurs requêtes soit lancées simultanément et surtout cela me donne une grande souplesse en cas de modifications et donc à terme, permet un gain de temps très appréciable.
La longueur d'un code et donc dans ton cas, la répétition d'écritures très semblables n'est pas significative dans le temps d'exécution du logiciel.
Je te renvoie sur ce point aux tutoriaux à propos de l'optimisation des sources (pm :Caribensila etc.)
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 25 juil. 2012 à 15:05
DM.CLIENT.Fields[1].AsString
oui, c'est plus court, mais très dangereux car si quelqu'un bouge l'ordre des champs dans le query ce qui arrive assez souvent en programmation
(on en enlève, on en remet..etc.)
et tout à coup, gros plantage, car les conditions ne seront pas appliquées aux BONS champs
et coucou,
plus rien ne fonctionne
ou pire encore,
le logiciel marche et sort des informations erronées..
cs_eli42
Messages postés143Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention11 juillet 20231 25 juil. 2012 à 11:19
Salut Cantador,
avant te remercie de ta reponse je desesperai voila la raison de mon empietement sur ta vie privee
Ouai je viens de relire, effectivement a part moi qui peut comprendre le truc, il est vraiment illisible
heum le Open je ne vois pas ce qu'il fait la puisque ca devrait etre un close
avec tes conseils je vais revoir le truc
juste un truc j'utilise plus souvent le numero de champ que son nom
- ex : DM.CLIENT.Fields[1].AsString a la place de DM.CLIENT.FieldByName('CHAMP').AsString
ce qui va revenir au meme probleme que tu cites
{
- modifications de tables
- modifications structurelles de la base
- changement de programmeur
- etc.
}