Bonjour à tous !
La situation
ADO / Access
J'ai 2 tables :
- T_CLIENTS (CLI_ID, CLI_Nom, CLI_Prenom, ...)
- T_ACHATS (ACH_ID, ACH_Date, ACH_Id_Client, ACH_Montant, ACH_Commentaire, ...)
Le problème
Je souhaite récupérer la liste de tous les clients et de leur dernier commentaire en date. J'y arrive par le biais de deux requêtes successives : 1) récupération des noms et prénoms sur la table T_CLIENTS puis, 2) à l'affichage dans un StringGrid, pour chaque client la deuxième requête récupère ACH_Commentaire pour lequel ACH_Date est le plus grand soit :
ce qui donne :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 strSQL1 := 'SELECT CLI_ID, CLI_Nom, CLI_Prenom FROM T_CLIENTS ORDER BY CLI_Nom, CLI_Prenom'; strSQL2 := 'SELECT ACH_Commentaire FROM T_ACHATS WHERE ACH_Id_Client = :PIdClient1 AND ACH_Date >= ALL ' + '(SELECT ACH_Date FROM T_ACHATS WHERE ACH_Id_Client = :PIdClient2)';
Les questions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 with ADOQry1 do begin Close; SQL.Text := strSQL1; Active := true; if RecordCount > 0 then begin Fields.DataSet.FindFirst; while not Fields.DataSet.Eof do begin with ADOQry2 do begin Close; SQL.Text := strSQL2; ParamCheck := true; Parameters.ParamByName('PIdClient1').Value := ADOQry1.FieldByName('CLI_ID').AsString; // résultat de la requête #1 Parameters.ParamByName('PIdClient2').Value := ADOQry1.FieldByName('CLI_ID').AsString; Active := true; if RecordCount > 0 then begin Fields.DataSet.FindFirst; etc ....
Ce code fonctionne, mais je le trouve lourd !
>> Cette structure de requête vous semble-t-elle adaptée ?
>> Existe-t-il un moyen de combiner les 2 requêtes avec une jointure ? Est-ce judicieux ?
NB : pour info : le nombre de clients retourné est faible (<100) et le nombre de lignes d'achat par client à prendre en compte par le moteur SQL aussi (50 en moyenne).
Merci d'avance pour vos commentaires.
Partager