begin process at 2010 03 20 10:31:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Base de données

 > 

Autre

 > 

Et le SQL dans tout ça ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Et le SQL dans tout ça ?

vendredi 17 novembre 2006 à 12:05:33 | Et le SQL dans tout ça ?

simonpelloquin

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
vendredi 17 novembre 2006 à 18:42:56 | Re : Et le SQL dans tout ça ?

jace1975

Réponse acceptée !
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
vendredi 17 novembre 2006 à 22:50:12 | Re : Et le SQL dans tout ça ?

Delphiprog

Administrateur CodeS-SourceS
Réponse acceptée !
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 !

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

samedi 18 novembre 2006 à 14:08:17 | Re : Et le SQL dans tout ça ?

jace1975

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....

lundi 20 novembre 2006 à 10:13:40 | Re : Et le SQL dans tout ça ?

simonpelloquin

Merci pour vos réponses

Simon
lundi 20 novembre 2006 à 10:27:08 | Re : Et le SQL dans tout ça ?

simonpelloquin

Mais... Pourquoi c'est pas le bon endroit pour poster ça ? C'est bien un code delphi ?


Simon
lundi 20 novembre 2006 à 18:12:20 | Re : Et le SQL dans tout ça ?

jace1975

Regarde à la catégorie autres langages ....


Cette discussion est classée dans : sql, client, add, id, chainefin


Répondre à ce message

Sujets en rapport avec ce message

Requete SQL appelant plusieurs tables [ par xelah ] Bonjour, je suis néophyte et je ne comprend pas tout ici!J'explique le problème. J'ai 3 tables (paradox) avec entre eux un seul champ commun "ID_Nom". Probleme avec mon Update :( [ par cmeme ] Salut merciii à l'avance pour votre aide ;) Voila j'ai un bouton modifier et j'ai une DBGRID et j'utilise interbase pour connecter mes tables: j'appu REQUETE UPDATE PROBLEME AVEC UN AND DANS UN SELECT AVEC LE BDE [ par WinLin ] bonjour a tous,voici ma requete elle realise un update d'une table si la reference d'une personne et la reference d'une entreprise sont exactement a c Requête SQL [ par slim59 ] Slt. Ben voilà, je suis bloqué dans une requête SQL qui est la suivante: "Select * from client, produit Where num like :num_client =num_produit" J'a Tquery et code [ par bilou2000 ] bonjourj'ai une requete sql pour filtrer les affichage:SELECT *FROM basepicto01WHERE categorie IN ('N ')oK ca marche.seulement lorsque que je veux l' erreur sql sous interbase je n y comprend plus rien!!! [ par creas ] Bonjour, je suis confonté à un probleme sql:Dynamic SQL ErrorSQL error code = -206Column unknownTACHE_ID_PRECStatement: select tache_id_precfrom PLANN Commande SQL [ par ChevalierLancelot ] Je travaille en Delphi 6.0 avec un TADOQuery. J'ai deux tables (Client et DossierClient) dans une base de données Access (Vente.mdb de Access 2000). L DbListbox [ par ProphetKy ] Voila mon probleme, j'une table de client, c'est client sont affcihé dans une DBlistbox, mais lorsque je tape dans une edit des lettres, la listbox di erreur de syntaxe [ par Arianesatch ] salut je cherche à trouver se qu'il ne va pas dans l'écriture de ce code, l'erreur sql me dit trop peu de pramètres 2 attendus.Form1.Query1.SQL.Clear; DBGrid avec du SQL :'( [ par TheShAmAn ] Voila ma requete SQL ki marche nikel!!!=>SELECT id_sal, nom_sal, pre_sal, nom_qualif, nom_stat, sal_sal, heur_sal From t_sal, t_qualif, t_stat WHERE t


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,390 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales