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 :
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)';
ce qui donne :
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 ....
Les questions
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.