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.

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;
Ca fonctionne parfaitement.

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 :

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;
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.

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) :

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"]
  ]
 ]
]]
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
[
 ["10872 mesure ECOOL",0,
  ["10873 mesure ECOOL"]
 ],
 ["9241 TD68 - Tracés au sol"],
 ["10905 mesure ECOOL",0,
  ["10906 mesure ECOOL"]
 ]
]
Dans la vraie vie ma table Opérations possède plus de 12 000 enregistrments donc l'arbre et bien plus gros.

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 :/