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.
La table utilisée est donc Taches. Pour chaque ligne j'ai donc les champs ProjetID, TacheID, Nom. ParentID, PrecedentID et SuivantID.
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
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);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!
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;
Partager