vieuxpere
Messages postés195Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention17 décembre 2014
-
11 mai 2009 à 10:47
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 avril 2015
-
24 juin 2009 à 23:46
Bonjour,
J'ai le code suivant qui marche très bien, le problème c'est que j'ai besoin de faire des requêtes SQL dans une boucle et dans la boucle de la boucle, j'utilise donc deux SqlQuery, mon souci c'est que chaque SqlQuery ouvre une connexion à la base de données, ce qui fait que mon application ouvre deux connexions à la base, ce que je ne souhaite pas.
Aussi, je vous le soumets pour voir s'il est possible de faire la même chose sans avoir à utiliser deux SqlQuery mais qu'un seul.
Merci par avance pour vos conseils.
Voici le code :
// Remplissage du composant
with Form2.SQLQuery1 do begin
SQL.Clear;
SQL.Add('SELECT Designation FROM groupe order by Designation');
Open;
while not(Eof) do
begin
//Regarde si le titulaire du mail (au vu de sa fonction) a le droit d'émettre sur le groupe en cours
Form9.SQLQuery1.SQL.Clear;
Form9.SQLQuery1.SQL.Add('SELECT count(EmetSur) as TotalGroupe FROM DroitEmissionMail WHERE EmetSur like''%'+FieldValues['Designation']+'%''and Fonction='''+Fonction+'''');
Form9.SQLQuery1.active:=true;
NbReponses:=Form9.SQLQuery1.FieldByName('TotalGroupe').AsInteger;
// Si c'est le cas on l'affiche dans le listbox sinon on ne l'afficher pas
if NbReponses<>0 then if Form9.listbox2.Items.IndexOf(FieldValues['Designation'])=-1 then Form10.ListBox1.Items.Add(FieldValues['Designation']);
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 11 mai 2009 à 13:52
salut
je ne suis pas pro sql mais je pense qu'une seule requete devrait faire l'affaire et donc un seul open, reste a optimiser la requete.
Aussi (presque hors sujet) :
if NbReponses<>0 then
if
Form9.listbox2.Items.IndexOf(FieldValues['Designation'])=-1 then
Form10.ListBox1.Items.Add(FieldValues['Designation']);
est égal à
if (NbReponses<>0) and (Form9.listbox2.Items.IndexOf(FieldValues['Designation'])=-1) then
Form10.ListBox1.Items.Add(FieldValues['Designation']);
Et aussi (hors sujet) : nomme tes composants ! Form9 et Form10 n'est pas parlant !
vieuxpere
Messages postés195Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention17 décembre 2014 11 mai 2009 à 16:48
Merci de cette réponse, en effet ce qui est est à retenir c'est :
// Remplissage du composant
with Form2.SQLQuery1 do begin
SQL.Clear;
SQL.Add('SELECT Designation FROM groupe order by Designation');
Open;
while not(Eof) do
begin
//Regarde si le titulaire du mail (au vu de sa fonction) a le droit d'émettre sur le groupe en cours
Form9.SQLQuery1.SQL.Clear;
Form9.SQLQuery1.SQL.Add('SELECT count(EmetSur) as TotalGroupe FROM DroitEmissionMail WHERE EmetSur like''%'+FieldValues['Designation']+'%''and Fonction= '''+Fonction+'''');
Form9.SQLQuery1 .active: =true;
NbReponses:=Form9.SQLQuery1.FieldByName('TotalGroupe').AsInteger;
End;
Est-ce que quelqu'un sait comment apréhendé les choses differemment avec un seul SQLQuery ?
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 12 mai 2009 à 09:31
mon souci c'est que chaque SqlQuery ouvre une connexion à la base de données,
Ce n'est pas vrai...
Dès l'instant où la connexion est ouverte, elle y reste jusqu'à ce qu'on la ferme.
Si effectivement, la connexion n'est pas ouverte dès le départ
(je ne sais pas comment tu gères cette ouverture) alors l'ouverture du premier query déclenche la connexion..
Mais ce n'est pas une bonne méthode..
il faut bien séparer la connexion et les ouvertures des query.
En ce qui concerne, ta première requête, elle ne sert pas à grand chose car elle peut être simplement remplacée par :
Form2.SQLQuery1.Open (avec dans la propriété SQL
('SELECT Designation FROM groupe order by Designation');
qui n'a pour but que de faire apparaître uniquement le champ designation dans le query avec un tri croissant.
Mais le souci est qu'on ne sait pas ce que tu fais exactement...
Vraisemblablement, il doit y avoir un autre composant dans lequel ce champ doit apparaître et sur lequel tu dois faire une sélection.
vieuxpere
Messages postés195Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention17 décembre 2014 15 mai 2009 à 11:28
Bonjour et désolé de cette réponse tardive.
J'ai bien compris ta méthode Cantador, elle resout certes le fait deux maintenir deux SqlQuery connectés durablement, mais moi je souhaitait faire ceci avec un seul (si c'était possible), d'où ma question !
Pour rappel, j'ai besoin de faire une premiere boucle pour identifier des valeurs via requete SQL (champ designation) ensuite j'effectue une deuxieme boucle dans la boucle sur lequel j'exploite les resultats de la premiere requete.
Mon souci c'est que si je fais ceci avec un seul SqlQuery, dès que je suis dans la boucle de ma boucle (la deuxieme requete SQL) j'éfface les resultats obtenus par la premiere requete, voila donc mon probleme...
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 avril 201510 24 juin 2009 à 23:46
Bonjour
Il faut regler ce problème avec SQL.
Tout dépend du moteur SQL (Paradox, Rave, MySql, ...).
Normalement tu peux n'utiliser qu'un seul query, sans aucune boucle, tu mettras le result de ton query dans un TDbCombobox ou tBdListbox.sans code.
SELECT Designation, count(EmetSur)
FROM groupe, DroitEmissionMail
WHERE EmetSur like ''%' + Designation + "%''
AND and
Fonction= ...
AND count(EmetSur)>0
ORDER BY Designation
Selon le moteur SQL le + de concat de string peut s'écrire + ou ¦¦ ou !! ou CONCAT ou STRCAT, ... à checker.
J'ai pas bien compris ta "+Fonction+" mais la solution est là,
Tu n'auras qu'un seul Query que tu lies à un Datasource, que tu lie a une
DbCombobox, et tu n'as pas de code à utiliser, juste un SQL, et une seule conn quand il est ouvert.
Ca règle ton problème ?
solilog