Bonjour à tous,

Je dois créer des rapports pour un logiciel de gestion de projets. Il y a deux tables importantes: Projets et Taches. Connaissant le projet, j'aimerais afficher toutes les tâches dans le même ordre qu'elle ont été créées (même principe qu'un arbre). Chacune des tâches peut avoir des sous-tâches, de là provient ma complexité car celles-ci doivent être ordonnées.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Projet
 Tâche 1
   Tâche 1.1
   Tâche 1.2
    Tâche 1.2.1
 Tâche 2
  Tâche 2.1
  Tâche 2.2
  Tâche 2.3
La table utilisée est donc Taches. Pour chaque ligne j'ai donc les champs ProjetID, TacheID, Nom. ParentID, PrecedentID et SuivantID.

En regardant les données, je vois bien que lorsqu'une tâche a comme ParentID la valeur -1, c'est qu'elle est à la racine directement du projet.

Lorsqu'une tâche a comme PrecedentID la valeur -1, c'est que c'est la première sous-tâche (du projet ou d'une tâche) et quand le SuivantID a la valeur -1 c'est la dernière sous-tâche (du projet ou de la sous-tâche).

J'essaie tant bien que mal de faire une représentation récursive de tout cela, mais ça ne fonctionne pas à merveille. Pour me balader de façon ordonnée
dans l'arbre, j'ai décidé d'utiliser le ParentID et le PrecedentID sachant que -1 et -1 me donnait immédiatement la tête de mon arbre.

Je veux afficher le tout dans un TTreeView pour le moment, je démarre donc ma fonction comme suit:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
tvwArbre.Items.Clear();
afficher(iProjetID, -1, -1, -1, 0, nil, nil);
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function TForm1.afficher(iProjetID, iPrevParentID, iParentID, iPrecedentID, iSuivantID: Int64; tndPrevParent, tndParent: TTreeNode): TTreeNode;
 
var
   orclqryRequete: TOracleQuery;
   Tache: TTache;
   tndNouveau: TTreenode;
 
begin
 
   orclqryRequete := TOracleQuery.Create(Self);
   with orclqryRequete do
      begin
 
         Session:= orclssnSession;
 
         Close();
         SQL.Clear();
         SQL.Add('SELECT * ');
         SQL.Add('FROM Taches ');
         SQL.Add(' WHERE ProjetID = ' + IntToStr(iProjetID));
 
         if (iParentID <> 0) then
            SQL.Add('   AND ParentID = ' + IntToStr(iParentID));
 
         if (iPrecedentID <> 0) then
            SQL.Add('   AND PrecedentID = ' + IntToStr(iPrecedentID));
 
         Execute();
 
         if (not(Eof)) then
            begin
               while (Not(Eof)) do
                  begin
 
                     with Tache do
                        begin
 
                           iProjetID := StrToInt64(FieldAsString('PROJETID'));
                           iTacheID := StrToInt64(FieldAsString('TACHEID'));
                           iParentID := StrToInt64(FieldAsString('PARENTID'));
                           iPrecedentID := StrToInt64(FieldAsString('PRECEDENTID'));
                           iSuivantID := StrToInt64(FieldAsString('SUIVANTID'));
                           strNom := FieldAsString('NOM');
 
                           tndNouveau := tvwArbre.Items.AddChild(tndParent, strNom);
 
                           tvwArbre.FullExpand();
 
                           tndParent := afficher(iProjetID, iParentID, iTacheID, -1, iSuivantID, tndParent, tndNouveau);
 
                           Next();
 
                        end;
 
                  end;
            end
         else
 
            if (iNextOid <> -1) then             
                  tndNouveau := afficher(iProjetID, iParentID, iPrevParentID, iParentID, 0, nil, tndPrevParent);
 
 
      end;
 
   FreeAndNil(orclqryRequete);
 
   Result := tndParent;
 
end;
Voilà, ça ne fonctionne pas à merveille, mon traitement bloque quand j'atteinds la fin d'une feuille... Je suis débutant en récursivité, merci de votre aide!