A ver, estoy creando una materia (asignatura), y esa materia pertenece a un área. Bien varias materias pueden pertenecer a un mismo área. El área tiene un determinado número de horas repartir entre las materias que pertenezcan a él.
Eso es lo que tengo que hacer, y ahora tengo que crear y editar ese área, pues bien, el crear ya lo tengo resuelto de la siguiente manera:
Código:
<html> <head> <title>Crear materias</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <script type="text/javascript"> function crearMateria(obj) { //La he obviado porque eran demasiados caracteres } function validar(f){ var iEls=f.elements.length; for (var i=0; i<iEls; i++) { var o=f.elements[i]; if (o.name.substring(0,13)=="cHorasMateria"){ if (o.value!=""){ if (isNaN(o.value)){ alert("El número de horas de la materia "+o.name.substring(13,14)+" no es correcto."); return false; } if (parseInt(o.value) > parseInt(f.diferenciaTotales.value)){ alert("El número de horas totales de la materia es demasiado alta, no puede exceder de "+f.diferenciaTotales.value+", pues sobrepasaría los límites de las horas del área."); return false; } } else if (o.value==""){ alert('Introduzca el número de horas de la materia '+o.name.substring(13,14)+' por favor.'); return(false); } } else if (o.name.substring(0,22)=="cHorasSemanalesMateria"){ if (o.value!=""){ if (isNaN(o.value)){ alert("El número de horas semanales de la materia "+o.name.substring(22,23)+" no es correcto."); return false; } if (parseInt(o.value)>parseInt(f.diferenciaSemanales.value)){ alert("El número de horas semanales de la materia es demasiado alta, no puede exceder de "+f.diferenciaSemanales.value+", pues sobrepasaría los límites de las horas del área."); return false; } } else if (o.value==""){ alert('Introduzca el número de horas semanales de la materia '+o.name.substring(22,23)+' por favor.'); return(false); } } } } </script> <? if(isset($_GET["nArea"])){ $nArea=$_GET['nArea']; echo '<form name="f" id="f1" method = "POST" onsubmit="return validar(this)"> $sql = "select * from materiasPGS where (nArea=".$nArea.")"; $result = mysql_query($sql, $GLOBALS["miConexion"]) or die(mysql_error()); $nFilas=mysql_num_rows($result); $sql1 = "select * from areas where nArea=".$nArea; $result1 = mysql_query($sql1, $GLOBALS["miConexion"]) or die(mysql_error()); $fila1= mysql_fetch_assoc($result1); $i=0; $sumaHorasSemanales=0; if ($nFilas!=0){ echo'<strong>Materias creadas hasta momento para el área '.$fila1['nombreArea'].'</strong>'; while($fila= mysql_fetch_assoc($result)){ //Aqui calculo cuanto suman todas las horas de la materia de esa unidad (para después ver cuánto me queda para éste área) SEMANALES $sumaHorasSemanales=$sumaHorasSemanales+$fila['horasSemanalesMateria']; //Aqui calculo cuanto suman todas las horas de la materia de esa unidad (para después ver cuánto me queda para éste área) TOTALES $sumaHorasTotales=$sumaHorasTotales+$fila['horasMateria']; echo'<br><br>    Materia: <input name="cNombreMateria'.$i.'" type="text" readonly="true" size="40" value="'.$fila['nombreMateria'].'">    Horas totales: <input name="cHorasMateria'.$i.'" type="text" readonly="true" size="8" value="'.$fila['horasMateria'].'">    Horas semanales: <input name="cHorasMateria'.$i.'" type="text" readonly="true" size="8" value="'.$fila['horasSemanalesMateria'].'">'; $i++; } $nHorasSemanalesTotales=$fila1['horasSemanalesArea']; //Aqui tengo el total de las horas semanales $nHorasTotales=$fila1['horasArea']; //Aqui tengo el total de las horas totales //Aqui guardo el cálculo que he hecho antes de las horas de las áreas de esa unidad SEMANALES $diferenciaSemanales=$nHorasSemanalesTotales-$sumaHorasSemanales; echo'<input name="diferenciaSemanales" type="hidden" value="'.$diferenciaSemanales.'">'; //Aqui guardo el cálculo que he hecho antes de las horas de las áreas de esa unidad TOTALES $diferenciaTotales=$nHorasTotales-$sumaHorasTotales; echo'<input name="diferenciaTotales" type="hidden" value="'.$diferenciaTotales.'">'; echo' <h2>Nueva materia</h2> <input type="button" value="Añadir materia" onclick="crearMateria(this)">'; echo' <input name="nMateriasCreadas" type="hidden" value=""> </form>'; ?> </body> </html>
He puesto como azul el código que uso para validar y como rojo el que uso para calcular el número de horas.
Esto me funciona, pero el problema viene ahora en el editar, porque aquí el usuario puede cambiar el área de la materia, y entonces, también cambia el número de horas, habría que hacerlo ahora dinámico pero no sé cómo hacerlo o por donde tirar. Os muestro el código de editar (está hecho de la misma forma que el crear, para que funcione si no se le cambia el área):
Código:
En rojo está el código para calcular las horas, en azul el que valida las horas y en verde donde el usuario puede elegir el área.<html> <head> <title>Datos de la materia</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <script language="JavaScript"> function validar(f){ if (f.cHorasMateria.value!=""){ if (isNaN(f.cHorasMateria.value)){ alert("El número de horas no es correcto"); return false; } if (parseInt(f.cHorasMateria.value) > parseInt(f.diferenciaTotales.value)){ alert("El número de horas totales de la materia es demasiado alta, no puede exceder de "+f.diferenciaTotales.value+", pues sobrepasaría los límites de las horas del área."); return false; } } if (f.cHorasSemanalesMateria.value!=""){ if (isNaN(f.cHorasSemanalesMateria.value)){ alert("El número de horas semanales no es correcto"); return false; } if (parseInt(f.cHorasSemanalesMateria.value)>parseInt(f.diferenciaSemanales.value)){ alert("El número de horas semanales de la materia es demasiado alta, no puede exceder de "+f.diferenciaSemanales.value+", pues sobrepasaría los límites de las horas del área."); return false; } } } </script> <? include("conexion.php"); if (isset($_GET["nMateria"])){ $nMateria=$_GET['nMateria']; $sql = "select * from materiasPGS where nMateria = '".$nMateria."'"; $result = mysql_query($sql, $GLOBALS["miConexion"]) or die(mysql_error()); $fila= mysql_fetch_assoc($result); echo '<form name="form1" method = "POST" action ="guardarMateria.php" OnSubmit="return validar(this)">'; echo' Horas totales de la materia: <input name="cHorasMateria" type="text" size="5" value="'.$fila['horasMateria'].'">    Horas semanales de la materia: <input name="cHorasSemanalesMateria" type="text" size="5" value="'.$fila['horasSemanalesMateria'].'">'; $sql1 = "select * from areas where nArea = '".$fila['nArea']."'"; $result1 = mysql_query($sql1, $GLOBALS["miConexion"]) or die(mysql_error()); $fila1= mysql_fetch_assoc($result1); $sql2 = "select * from areas where nUnidad=".$fila1['nUnidad']; $result2 = mysql_query($sql2, $GLOBALS["miConexion"]) or die(mysql_error()); //Aqui el usuario puede cambiar el área echo'    Área: <select name="cNArea"> <option value='.$fila['nArea'].'>'.$fila1['nombreArea'].'</option>'; while ($fila2= mysql_fetch_assoc($result2)){ if ($fila2['nArea']!=$fila['nArea']) echo '<option value='.$fila2['nArea'].'>'.$fila2['nombreArea'].'</option>'; } echo '</select>'; //Hacemos las comprobaciones de las sumas de las horas $sumaHorasSemanales=0; $sql3 = "select * from materiasPGS where (nArea=".$fila['nArea'].")"; $result3 = mysql_query($sql3, $GLOBALS["miConexion"]) or die(mysql_error()); while($fila3= mysql_fetch_assoc($result3)){ //Aqui calculo cuanto suman todas las horas de la áreas de esa unidad (para después ver cuánto me queda para éste área) SEMANALES $sumaHorasSemanales=$sumaHorasSemanales+$fila3['horasSemanalesMateria']; //Aqui calculo cuanto suman todas las horas de la áreas de esa unidad (para después ver cuánto me queda para éste área) TOTALES $sumaHorasTotales=$sumaHorasTotales+$fila3['horasMateria']; } $nHorasSemanalesTotales=$fila1['horasSemanalesArea']; //Aqui tengo el total de las horas semanales $nHorasTotales=$fila1['horasArea']; //Aqui tengo el total de las horas totales //Aqui guardo el cálculo que he hecho antes de las horas de las áreas de esa unidad SEMANALES (le sumo las horas de esta materia para saber en realidad cuántas quedan por asignar) $diferenciaSemanales=$nHorasSemanalesTotales-$sumaHorasSemanales+$fila['horasSemanalesMateria']; echo'<input name="diferenciaSemanales" type="hidden" value="'.$diferenciaSemanales.'">'; //Aqui guardo el cálculo que he hecho antes de las horas de las áreas de esa unidad TOTALES (le sumo las horas de esta materia para saber en realidad cuántas quedan por asignar) $diferenciaTotales=$nHorasTotales-$sumaHorasTotales+$fila['horasMateria']; echo'<input name="diferenciaTotales" type="hidden" value="'.$diferenciaTotales.'">'; echo' </form>'; ?> </body> </html>
Os ruego me digais por donde tirar si sabeis...Muchas gracias