Et le SQL dans tout ça ?

Résolu
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 17 nov. 2006 à 12:05
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 - 20 nov. 2006 à 18:12
Bonjour à tous ! Et vive la bonne humeur en ce dernier jour de la semaine !!!


Soit une table GROUPES:

ID_GROUPE (A30), ID_CLIENT (A30)

Un client pouvant faire partie de plusieurs groupes


J'ai deux client 'Pierre' et 'Paul' et je veux savoir dans quels groupes je retrouve ces deux personnes ensembles.


D'où cette fonction :


Function Find_MultiKloz(FieldRech, TblRech, DbRech, FieldKloz : string;
LstValeurs : TStrings; KlozSup : string = '') : TStrings;

var

   i         : integer;

   ChaineFin : string;

   TmpResult : TStrings;

begin

     TmpResult := TStringList.Create;

     ChaineFin := '';

     With TQuery.Create(nil) do begin

          DatabaseName := DBRech;

          For i := 0 to LstValeurs.Count - 1 do begin

              if i > 0 then begin

                
SQL.Add('And ('+ FieldRech +' in (');

                 ChaineFin := ChaineFin + '))';

              End;

              SQL.Add('Select distinct '+ FieldRech);

              SQL.Add('from '+ TblRech);

             
SQL.Add('Where '+FieldKloz +' = '+ apf(LstValeurs.Strings[i]));

              if KlozSup <> ''

                
then SQL.Add('And ('+ KlozSup +')');

          End;

          SQL.Add(ChaineFin);

          Prepare;

          Open;

          While not eof do begin

                TmpResult.Add(Fields[0].AsString);

                next;

          end;

          Free;

     end;

     Result.AddStrings(TmpResult);

     TmpResult.Free;

end;


Quand j'appelle Find_MultiKloz('ID_CLIENT', 'GROUPES', [MonALIAS],
('Pierre', 'Paul), [clause supplémentaire]), j'ai bien ma liste... mais
n'existe-t-il pas une instruction SQL directement ?

(Avec "where ... in (...), ça marche pas car c'est un "ou", et avec
Where ID_Client "Pierre" and ID_Client "Paul" me renvoie un
ensemble vide... et c'est normal)


Simon

6 réponses

jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
17 nov. 2006 à 18:42
C'est pas l'endroit pour poster ce genre de question mais bon ....

Il y a plein de facon de faire (qui dépendent parfois de ton SGBD)
une parmi d'autre :
select distinct(id_groupe) from ta_table
where id_groupe in ( select distinct id_group from ta_table where id_client='Pierre')
and id_groupe in ( select distinct id_group from ta_table where id_client='Paul')

pas testé mais ca devrait marcher.... j'espère mais attention cependant au cout d'execution d'un 'in', ca depend du sgbd
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
17 nov. 2006 à 22:50
La requête de jayce1975 devrait fonctionner et on peut même la compacter en :
SELECT DISTINCT id_groupe FROM Groupes G
WHERE G.id_groupe IN (
  SELECT DISTINCT id_groupe
  FROM Groupes H
  WHERE H.id_client <> G.id_client)

ou, mieux encore :
SELECT DISTINCT id_groupe FROM Groupes G
INNER JOIN Groupes H ON H.id_groupe = G.id_groupe
AND H.id_client <> G.id_client

Mais le problème avec ces deux requêtes, c'est qu'elle ne tiennent pas compte de savoir si on recherche pierre+paul ou pierre+jacques.
Une formule plus appropriée :
SELECT G.id_groupe||" -> "||G.id_client||" + "||H.id_client AS result
FROM Groupes G
    JOIN Groupes H 
    ON H.id_groupe = G.id_groupe
    AND LOWER(H.id_client) = 'paul'
WHERE LOWER(G.id_client) ='pierre'

La concaténation n'est proposée ici qu'à des fins de contrôle visuel, bien entendu.
Reste à injecter les deux parties variables et qui remplaceront pierre et paul dans cetet dernière requête.

Si besoin d'explications, y a qu'à demander

Bonsoir m'sieurs dames

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net
3
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
18 nov. 2006 à 14:08
Comme tu le vois il y a plein de solution a toi de choisir.

Par expérience et si je peux te donner un petit conseil en passant, privilégie toujours le SQL ou Procédure SQL, plutot que delphi pour faire ce genre de traitement sur les données.
 
Ton code en sera plus simple et plus lisible et ca évitera les usines à gaz inmaintennables.

Tschussss....
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
20 nov. 2006 à 10:13
Merci pour vos réponses

Simon
0

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

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
20 nov. 2006 à 10:27
Mais... Pourquoi c'est pas le bon endroit pour poster ça ? C'est bien un code delphi ?

Simon
0
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
20 nov. 2006 à 18:12
Regarde à la catégorie autres langages ....
0
Rejoignez-nous