Procedure Test_142 is type PosRect is record ( x integer, y integer ); Type TPosRect is table of PosRect index by binary_integer; wPosRect TPosRect; nbf integer := 0; r integer; w varchar2(4000); k integer := -1; procedure Draw_Emp (n in integer, Xpos in integer, Ypos in integer) is Cursor C (x in integer) is select ename, empno, mgr from emp where empno = x; Cursor CMgr (x in integer) is select empno, ename from emp where mgr = x order by empno; Pere integer := 0; MoiTrouve boolean := false; frere integer := 0; begin for m in C (n) loop RPDF.Tfont ('Helvetica'); RPDF.Tsize (8); RPDF.Tcolor ('black'); RPDF.SetDrawFillColor ('pale blue'); RPDF.SetLineW (1.0); RPDF.SetDrawBorderColor ('red'); RPDF.title (t=> m.ename, x=>Xpos, y=>Ypos); RPDF.Write (t=> m.empno, x=>Xpos-20, y=>Ypos-10, tSize=>6, color=> 'red'); wPosRect (n).x := Xpos; wPosRect (n).y := Ypos; -- ligne vers le père if m.mgr > 0 then RPDF.SetLineW (0.5); RPDF.SetDrawBorderColor ('blue'); RPDF.Line (xpos, ypos+8, wPosRect (m.mgr).x, wPosRect (m.mgr).y - 3); end if; exit; end loop; -- y a-t-il des fils ? -- premier fils (éventuel) for m in CMgr(n) loop Draw_Emp (n=> m.empno, xPos=> XPos , yPos=> YPos - 80); --RPDF.Line (xpos, ypos, XPos + k * 60, YPos - 100); exit; end loop; -- y a-t-il des freres ? Pere := 0; for m in C (n) loop Pere := nvl(m.mgr,0); exit; end loop; if Pere = 0 then return; end if; -- parcours de la liste des frères Frere := 0; MoiTrouve := false; for m in CMgr(Pere) loop if MoiTrouve then Frere := m.empno; exit; end if; if m.empno = n then MoiTrouve := true; end if; end loop; if Frere = 0 then return; end if; -- trouve un frere nbf := nbf + 1; Draw_Emp (n=> Frere, xPos=> 30 + (nbf)*45 , yPos=> YPos); end; begin RPDF.New; RPDF.wD.CurrentPageDim := 'a4'; RPDF.wD.CurrentPageLandscape := true; RPDF.wD.CurrentPiedH := 0; RPDF.TSize(10); Draw_Emp (7839, 30, 570); RPDF.Show; -- Termine la page PDF en cours, et le document PDF end; -- Test_1