Procedure LIKE

Résolu
cs_eli42 Messages postés 143 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 11 juillet 2023 - 19 juin 2012 à 14:25
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 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 :

FILTRE_TRIE.LIKE_2(4, DM.JOURNAL,
EJ1.text, EJ2.text, EJ3.text, DM.CLIENT.Fields[1].AsString, '', '', '', '', '', '', 'JOURNAL_TEL',
'DAT', 'HR', 'COMMER', 'FICHE', '', '', '', '', '', '', 'ID DESC');

3 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.)

bon courage

cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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..

cantador
3
cs_eli42 Messages postés 143 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 11 juillet 2023 1
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.
}

Beau Temps Belle Mer
0
Rejoignez-nous