Bonjour,
voilà ça fait un petit moment que j'ai écrit une fonction PL/SQL qui génère un tableau (requête hiérarchique), qui est ensuite lu par du javascript (simplement transféré dans une variable) afin de générer un arbre HTML.
Ca fonctionne parfaitement.
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 DECLARE CURSOR cur IS select op_id, op_descript, op_id||' '||op_descript as description, op_responsible, op_veda_name, op_begin, op_end, level, CONNECT_BY_ISLEAF as leaf from operations connect by prior op_id = op_parent_op_id start with op_id = 9226; levelPrec integer := 1; wasLeaf boolean := false; descr varchar2(500); BEGIN HTP.prn('['); for c in cur loop -- numbers of parents to close if level decrease while ((levelPrec - c.level) > 0) loop HTP.prn('],'); levelPrec := levelPrec - 1; wasLeaf := false; end loop; -- if last item was a leaf, print a comma before the next one if (wasLeaf) then HTP.prn(','); end if; descr := translate(c.description,'''"',' '); if (c.leaf = 0) then HTP.prn('["'||descr||'",0,'); wasLeaf := false; else HTP.prn('["'||descr||'"]'); wasLeaf := true; end if; levelPrec := c.level; end loop; -- parents left to close while (levelPrec > 1) loop HTP.prn(']'); levelPrec := levelPrec - 1; end loop; HTP.p(']'); END;
Mais j'aimerais maintenant pouvoir filtrer l'arbre en fonction de la valeur de certain champs. J'ai naturellement essayé avec un WHERE dans la requête, mais celle-ci peut alors retourner des items de n'importe quel level (fils sans père etc...) et évidemment ça foire à la génération.
J'ai donc essayé d'ajouter un if comme ceci :
afin de génèrer le tableau complet mais en ajoutant à la fin de chaque item ' f' ou ' t' pour savoir si l'item doit être afficher ou non, ensuite je comptais enlever les items finissant par ' f' via javascript, mais ca fait 2 jours que je suis sur la fonction javascript et ça ne fonctionne pas. De plus il serait plus performant de générer directement le bon arbre avec le programme PL/SQL.
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 DECLARE CURSOR cur IS select op_id, op_descript, op_id||' '||op_descript as description, op_responsible, op_veda_name, op_begin, op_end, level, CONNECT_BY_ISLEAF as leaf from operations connect by prior op_id = op_parent_op_id start with op_id = 9226; levelPrec integer := 1; wasLeaf boolean := false; descr varchar2(500); BEGIN HTP.prn('['); for c in cur loop -- numbers of parents to close if level decrease while ((levelPrec - c.level) > 0) loop HTP.prn('],'); levelPrec := levelPrec - 1; wasLeaf := false; end loop; -- if last item was a leaf, print a comma before the next one if (wasLeaf) then HTP.prn(','); end if; descr := translate(c.description,'''"',' '); --if item have to be displayed if (c.op_id like '%'||:P2_FILTRE_ID||'%' and upper(c.op_descript) like '%'||upper(:P2_FILTRE_DESCRIPTION)||'%' and upper(c.op_responsible) like '%'||upper(:P2_FILTRE_RESPONSABLE)||'%' and upper(c.op_veda_name) like upper(:P2_FILTRE_VEDA_NAME) and (c.op_begin > nvl(:P2_FILTRE_DATE_DEBUT,SYSDATE- numtoyminterval(60,'YEAR')) or c.op_begin is null) and (c.op_end < nvl(:P2_FILTRE_DATE_FIN,SYSDATE+1) or c.op_end is null)) then if (c.leaf = 0) then HTP.prn('["'||descr||' t",0,'); wasLeaf := false; else HTP.prn('["'||descr||' t"]'); wasLeaf := true; end if; else if (c.leaf = 0) then HTP.prn('["'||descr||' f",0,'); wasLeaf := false; else HTP.prn('["'||descr||' f"]'); wasLeaf := true; end if; end if; levelPrec := c.level; end loop; -- parents left to close while (levelPrec > 1) loop HTP.prn(']'); levelPrec := levelPrec - 1; end loop; HTP.p(']'); END;
Pour l'instant ça génère un tableau de la sorte (si je décide d'afficher que les élément dont l'id contient un 1) :
Et il faudrait que ça génère directement ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 [["9226 mesure ECOOL f",0, ["9227 mesure ECOOL f",0, ["9240 TD62 - Tracés au sol f"], ["10872 mesure ECOOL t",0, ["10873 mesure ECOOL t"] ], ], ["9228 TD68 f",0, ["9241 TD68 - Tracés au sol t"], ["10905 mesure ECOOL t",0, ["10906 mesure ECOOL t"] ] ] ]]
Dans la vraie vie ma table Opérations possède plus de 12 000 enregistrments donc l'arbre et bien plus gros.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 [ ["10872 mesure ECOOL",0, ["10873 mesure ECOOL"] ], ["9241 TD68 - Tracés au sol"], ["10905 mesure ECOOL",0, ["10906 mesure ECOOL"] ] ]
J'espère avoir été clair
Merci pour votre aide, je suis dessus depuis la semaine dernière, et j'ai le cerveau qui s'enmèle, je ne sais plus quoi tenter :/
Partager