Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/01/2013, 11:26
jsoriano
 
Fecha de Ingreso: enero-2013
Mensajes: 1
Antigüedad: 11 años, 9 meses
Puntos: 0
Pregunta Funcion Recursiva

Hola a tod@s, la verdad es que me estoy volviendo loco.

Tengo una funcion recursiva para recorrer un arbol que tiene cantidades y necesito sumar los valores en sub totales por nivel.
estos serian los datos:

id - parentid - texto -valor

01 - 00 - p1 - 0
02 - 01 - p2 - 5
03 - 02 - p4 - 0
04 - 01 - p5 - 5
05 - 01 - p5 - 0
06 - 05 - p4 - 0
07 - 06 - p5 - 5
08 - 06 - p5 - 5

el resultado deseado:

01 - 00 - p1 - 0 <-- total de todo el arbol
02 - 01 - p2 - 5
03 - 02 - p4 - 0
04 - 01 - p5 - 5
05 - 01 - p5 - 10 <-- total de la rama
06 - 05 - p4 - 10 <-- total de la rama
07 - 06 - p5 - 5
08 - 06 - p5 - 5

el codigo que utilizo es este:

//--------------------------------------------------------------------------------------------
function coge_hours_worked($id) //coge el total de horas asignadas a una wo
{
$db = conecta_bd();

$txtsql="SELECT time_sheet.idwo, Sum(time_sheet.hor_1) AS tot_1, Sum(time_sheet.hor_2) AS tot_2, Sum(time_sheet.hor_3) AS tot_3, Sum(time_sheet.hor_4) AS tot_4, Sum(time_sheet.hor_5) AS tot_5, Sum(time_sheet.hor_6) AS tot_6, Sum(time_sheet.hor_7) AS tot_7 FROM time_sheet GROUP BY time_sheet.idwo HAVING (time_sheet.idwo=".$id.")";

//echo $txtsql;
$rstqry2 = mysql_query($txtsql,$db) or die(mysql_error());
if ($rstqry2) {
$row2= mysql_fetch_assoc($rstqry2);
$tot = $row2["tot_1"] + $row2["tot_2"] + $row2["tot_3"] + $row2["tot_4"] +$row2["tot_5"] + $row2["tot_6"] + $row2["tot_7"];
//mysql_free_result($rstqry2);
}
if ($tot) return $tot; else return 0;
}

//--------------------------------------------------------------------------------------------

function coge_hours_worked_wo($parent,$tot_acumulado) //coge el total de horas trabajadas en una wo y sus hijas
{
$db = conecta_bd();
// retrieve all children of $parent <br>
$txtsql = "SELECT * FROM work_order WHERE idparent=".$parent;
$rstqry = mysql_query($txtsql,$db) or die(mysql_error());
// display each child <br>
while ($row = mysql_fetch_array($rstqry)) {
// indent and display the title of this child <br>
$tot = coge_hours_worked($row["idwo"]);
$tot_acumulado = $tot_acumulado + $tot;

// echo $row["idwo"]." - ".$row["n_work_order"]." - ".$tot." - ".$tot_acumulado." - ". $tot_total ."<br>\n";

// child's children <br>
coge_hours_worked_wo($row["idwo"],$tot_acumulado);
}

$tot_acumulado = $tot_acumulado + coge_hours_worked($parent);
//$tot_total = $tot_total + $tot;
//echo $tot_total."<br>";
return $tot_acumulado;
}
//------------------------------------------------------------------------------------------

coge_hours_worked_wo(1,0)

Alguna sugerencia