• Publicidad

Comprobación cálculo dinámico

Discute todo acerca de JavaScript así como DHTML o la tecnología AJAX.

Comprobación cálculo dinámico

Notapor marcosss » 2007-07-26 05:07 @255

Hola estoy programando en javascript y tengo 1 duda, no sé cómo hacer esto:

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: Seleccionar todo
<html>
<head>
<title>Crear materias</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<script type="text/javascript">


num=0;
function crearMateria(obj) {
  num++;
          //Creamos los datos del modulo
 
  papa = obj.parentNode;
  hermano = obj.nextSibling;

  contenedor = document.createElement('div');
  contenedor.id = 'div'+num;
  if (hermano == undefined)
   papa.appendChild(contenedor)
      
  else
   papa.insertBefore(contenedor, hermano)

  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);
 
  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);
 
 
  txt = document.createTextNode('Nombre de la materia: ');         //Creamos el modulo   
  ele = document.createElement('input');
  ele.type = 'text';
  ele.size='40';
  ele.name = 'cNombreMateria'+num;
  contenedor.appendChild(txt);
  contenedor.appendChild(ele);

  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);
 
  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);

  txt = document.createTextNode('  Horas totales de la materia: ');         //Creamos las horas de la materia
  ele = document.createElement('input');
  ele.type = 'text';
  ele.name = 'cHorasMateria'+num;
  ele.size='5';
  contenedor.appendChild(txt);
  contenedor.appendChild(ele);
  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);
  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);
   
  txt = document.createTextNode('  Horas semanales de la materia: ');         //Creamos las horas de la materia
  ele = document.createElement('input');
  ele.type = 'text';
  ele.name = 'cHorasSemanalesMateria'+num;
  ele.size='5';
  contenedor.appendChild(txt);
  contenedor.appendChild(ele);
  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);
  txt = document.createElement('<br>');            // Meto un salto de línea
  contenedor.appendChild(txt);   
   
  ele = document.createElement('input');
  ele.type = 'button';
  ele.value = 'Borrar';
  ele.name = 'div'+num;
  ele.onclick = function () {borrar(this.name,obj)}
  contenedor.appendChild(ele);
 
 
}
function borrar(obj1,obj2) {
  papa = obj2.parentNode;
  papa.removeChild(document.getElementById(obj1));   
}


function validar(f){

   f.nMateriasCreadas.value=num;   
   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;
             }   
         [color=blue]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;          
           } [/color]
         }
          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;
             }   
           [color=blue]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;          
           }[/color]
         }
          else if (o.value==""){
             alert('Introduzca el número de horas semanales de la materia '+o.name.substring(22,23)+' por favor.');
            return(false);                   
          }                     
      }    

        else if (o.name.substring(0,14)=="cNombreMateria"){
          if (o.value!=""){
             if (validaTextoSignos(o.value, 'Nombre de la materia '+o.name.substring(14,15))==false)
              return(false);                   
         }
          else if (o.value==""){
             alert('Introduzca el nombre de la materia '+o.name.substring(14,15)+' por favor.');
            return(false);                   
          }           
      }       
   }
 
}   
</script>

<?
include("conexion.php");


if(isset($_GET["nArea"])){

$nArea=$_GET['nArea'];

echo '<form name="f" id="f1" method = "POST" action ="guardarMateria.php" onsubmit="return validar(this)">

<div style="margin-left: 3%; width=200px;"> ';


$_SESSION['editandoMateria']='NO';
$_SESSION['nArea']=$nArea;


$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)){
   [color=red]
      //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'];[/color]

   
   echo'<br><br>   
      &nbsp&nbsp Materia: <input name="cNombreMateria'.$i.'" type="text" readonly="true" size="40" value="'.$fila['nombreMateria'].'">
       &nbsp&nbsp Horas totales: <input name="cHorasMateria'.$i.'" type="text" readonly="true" size="8" value="'.$fila['horasMateria'].'">
       &nbsp&nbsp Horas semanales: <input name="cHorasMateria'.$i.'" type="text" readonly="true" size="8" value="'.$fila['horasSemanalesMateria'].'">';
      $i++;   
   }   
}else
   echo'<h3>No hay materias creados para ese área.</h3>';
   


[color=red]$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.'">';

[/color]

echo'
<h2>Nueva materia</h2>      
<input type="button" value="Añadir materia" onclick="crearMateria(this)">';
echo'
<input name="nMateriasCreadas" type="hidden" value="">            

<br><br>
<center>
<input name="botonGuardar" type="submit" value="Guardar">
</center>
</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: Seleccionar todo
<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;
      }    
    [color=blue]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;          
     }  [/color]
   }      
    
   if (f.cHorasSemanalesMateria.value!=""){
      if (isNaN(f.cHorasSemanalesMateria.value)){
        alert("El número de horas semanales no es correcto");
        return false;
      }     [color=blue]
    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;          
     } [/color]
   } 
}
</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)">';

   $_SESSION['editandoMateria']='SI';
   $_SESSION['nMateria']=$nMateria;

echo'
  <h2>Datos de la materia </h2>';
echo  '<div style="margin-left: 3%; width=200px;">

    Nombre de la materia: <input name="cNombreMateria" type="text" size="40" value="'.$fila['nombreMateria'].'">
   &nbsp&nbsp Horas totales de la materia: <input name="cHorasMateria" type="text" size="5" value="'.$fila['horasMateria'].'">
   &nbsp&nbsp 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());   

[color=green]//Aqui el usuario puede cambiar el área
   echo'
   &nbsp&nbsp Á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>';
[/color]
[color=red]
//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.'">';

[/color]
echo'
<br><br>   
<center>
<input name="botonGuardar" type="submit" value="Guardar">
</center>
</form>';
?>
</body>
</html>


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.

Os ruego me digais por donde tirar si sabeis...Muchas gracias
marcosss
Perlero nuevo
Perlero nuevo
 
Mensajes: 87
Registrado: 2007-05-14 06:23 @307

Publicidad

Volver a JavaScript

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron