Foros del Web » Programando para Internet » Javascript »

Comprobación cálculo dinámico

Estas en el tema de Comprobación cálculo dinámico en el foro de Javascript en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 26/07/2007, 04:14
 
Fecha de Ingreso: febrero-2007
Mensajes: 138
Antigüedad: 17 años, 9 meses
Puntos: 0
Comprobación cálculo dinámico

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:
<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>	
		&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++;	
	}	

	


$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:
<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'].'">
	&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());	

//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>';


//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>
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
  #2 (permalink)  
Antiguo 26/07/2007, 04:45
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Comprobación cálculo dinámico

Bien, estamos en la segunda parte de este problema. Lo único, así no hay quien se aclare.

No postees código PHP, postea sólo lo que el servidor te genera. Así podremos probarlo todos. Con ese código tendríamos que tener hasta tu base de datos!

En fin, posteanos el HTML + javascript sólo mejor, y ya podremos tirar para delante.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 26/07/2007, 05:26
 
Fecha de Ingreso: febrero-2007
Mensajes: 138
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Comprobación cálculo dinámico

Lo siento, aquí está el código:

Código:
<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">

//Validamos un campo tipo texto
function validaTextoSignos(campo,nombreCampo){
  var ubicacion
  var enter = "\n"	//Los caracteres válidos son:
  var caracteres = "abcdefghijklmnopqrstuvwxyzñ1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZÑáéíóúÁÉÍÓÚºª/¿?()%'!¡-+*,;.:" + String.fromCharCode(13) + enter

  var contador = 0
  for (var i=0; i < campo.length; i++) {
    ubicacion = campo.substring(i, i + 1)
    if (caracteres.indexOf(ubicacion) != -1) {
      contador++
    } else {
      alert("ERROR en el "+nombreCampo+": No se acepta el caracter '" + ubicacion + "'.")
      return false
    }
  }
}


function validar(f){
// Validamos lel nombre de la materia
 
  if (f.cNombreMateria.value!="")
   if (validaTextoSignos(f.cNombreMateria.value, 'Nombre de la materia')==false)
	  return(false);
	  
  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>



<form name="form1" method = "POST" action ="guardarMateria.php" OnSubmit="return validar(this)">
  <h2>Datos de la materia </h2><div style="margin-left: 3%; width=200px;"> 

    Nombre de la materia: <input name="cNombreMateria" type="text" size="40" value="Materia Lengua PGS">

	&nbsp&nbsp Horas totales de la materia: <input name="cHorasMateria" type="text" size="5" value="40">
	&nbsp&nbsp Horas semanales de la materia: <input name="cHorasSemanalesMateria" type="text" size="5" value="4">
	&nbsp&nbsp Área:
	  <select name="cNArea">
		  <option value=1>Area Sociolinguistica</option><option value=2>Area Matemáticas</option><option value=3>Sociolinguistica</option><option value=5>Area sociolinguistica</option><option value=6>Area taller</option><option value=7>Area psicomotriz</option></select><input name="diferenciaSemanales" type="hidden" value="10"><input name="diferenciaTotales" type="hidden" value="100">

<br><br>	
<center>

<input name="botonGuardar" type="submit" value="Guardar">
</center>
</form>
</body>
</html>
  #4 (permalink)  
Antiguo 26/07/2007, 05:54
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Comprobación cálculo dinámico

Bueno, si te he entendido bien el problema es al editar la materia después de crearla ¿no? Es decir, tenemos problemas con el cálculo de movimientos de horas...

Cuando la creamos no sé lo que hacemos, pero supongo que descontarás las horas totales y semanales de la asignatura a diferenciaSemanales y diferenciaTotales. Cuando la cambiemos de área tenemos que reestablecer el valor de diferenciaSemanales y diferenciaTotales tal y como estaría sin la materia, y luego actualizar las horas del nuevo área a su valor final.

Lo que no entiendo es una cosa:
Cada área tiene un determinado número de horas a rellenar con materias ¿no? ¿Dónde almacenas el número de horas a rellenar de cada área? Sólo veo diferenciaSemanales y diferenciaTotales. ¿A qué se refieren exactamente estos dos valores?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 26/07/2007, 06:26
 
Fecha de Ingreso: febrero-2007
Mensajes: 138
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Comprobación cálculo dinámico

A ver te explico:

Al crear la cosa funciona, lo que hago es comprobar si el valor de horas que introduce el usuario es mayor que las que quedan por asignar (las que quedan por asignar las calculo sumando todas las materias que están en ese área y restándoselo al número total de horas del área).

Pero al editar la materia lo que falla es que aquí el usuario puede cambiar también el área a la que pertenece esa materia, entonces el número total de horas del área también cambia, y eso no lo controlo (porque no sé como controlarlo), yo hasta ahora el número total de horas del área a repartir entre las materias lo consultada en la BD, y lo almacenaba en estos 2 valores (salen en el primer mensaje):

Código PHP:
$nHorasSemanalesTotales=$fila1['horasSemanalesArea'];        //Aqui tengo el total de las horas semanales del area
    
$nHorasTotales=$fila1['horasArea'];        //Aqui tengo el total de las horas totales del area 
Ahora voy a explicar las horas semanales (las totales sería idéntico):

Bien, en estas 2 variables tengo las horas totales del área a repartir entre las materias (horas totales del área a repartir entre horas totales de materias y horas semanales a repartir entre horas semanales de materias), y en las variable:

Código PHP:
$diferenciaSemanales=$nHorasSemanalesTotales-$sumaHorasSemanales+$fila['horasSemanalesMateria'];
    echo
'<input name="diferenciaSemanales" type="hidden" value="'.$diferenciaSemanales.'">'
$diferenciaSemanales tengo el valor que, como máximo puede alcanzar la materia que estamos editando, pues es la diferencia entre $nHorasSemanalesTotales (horas totales del área a repartir entre todas las materias) y $sumaHorasSemanales (suma de todas las materias que pertenecen a ese área) más $fila['horasSemanalesMateria'] (horas de la materia que estamos editando, que como se la hemos restado porque su valor iba incluido en $sumaHorasSemanales se lo tenemos que sumar).

Después lo que hago es asignarle el valor a un campo oculto para poder acceder a él desde javascript.

Pero el problema realmente es el de arriba, controlar que al cambiar el área se cambien las horas totales del área a repartir y la suma de las materias que pertenecen a ese área.

¿queda más claro?
  #6 (permalink)  
Antiguo 26/07/2007, 07:33
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Comprobación cálculo dinámico

Va quedando más claro, pero aún así estoy liado. Es un problema complejo que hay que tener bien entendido para llevar a cabo una programación lo más inteligente y eficiente posible.

Corrígeme si me equivoco:

Tenemos las Áreas.
En cada Área puede haber muchas materias. Cada área tiene disponible un cupo de horas semanales y un cupo de horas totales (que son independientes las unas de las otras).

Tenemos las Materias.
Cada materia pertenece a un área. Cada materia tiene un número de horas semanales, y un número de horas totales (que son independientes las unas de las otras).


Teniendo este planteamiento, lo que pretendemos es editar una Materia diciendo: Si materia4 pertenece a areaB, quiero que materia4 pertenezca a areaC. Con lo cual tengo que restarle a areaB de su cantidad de horasSemanales y de su cantidad de horasTotales las correspondientes a materia4, y esas mismas cantidades de hora sumarselas a areaC.

Y el problema de todo esto es que no tengo por ningún sitio las horas totales areaB ni del areaC; que tengo las horas que me quedan disponibles del areaB, ¿no es asi?

--------------


En ese caso lo que yo haría sería casi casi descargarme en javascript en el documento el total de las horas disponibles de cada área, las horas que ocupa una materia, y a qué área pertenece cada materia.

Luego con javascript calculamos ya los movimientos, restas de allí, sumas aquí... lo que sea. Pero veo que por un lado o por otro vamos a necesitar todos esos datos disponibles en javascript. Para ello podrías usar la estructura de "clases-objetos" que tiene javascript. Te hago un esbozo que podrías utilizar:

Código PHP:
function area(nombre,horasTotales,horasSemanales) {
    
this.nombre nombre;
    
this.horasTotales horasTotales;
    
this.horasSemanales horasSemanales;
    
this.susMaterias = new Array();
    
this.getHorasTotalesDisponibles = function() {
        
//sumamos todas las horasTotales de las materias que tiene este área, y el resultado se lo restamos a this.horasTotales
    
}
    
this.getHorasSemanalesDisponibles = function() {
        
//sumamos todas las horasSemanales de las materias que tiene este área, y el resultado se lo restamos a this.horasSemanales
    
}
    
this.cabeMateria = function( objMateria ) {
        
// devuelve true si la materia cabe según las horasTotalesDisponibes y las horasSemanalesDisponibles
    
}
    
this.anyadirMateria = function( objMateria ) {
        
this.susMateriasthis.susMaterias.length ] = objMateria;
    }
    
this.eliminarMateria = function( objMateria ) {
        
//contrar objMateria en this.susMaterias y eliminarla del array
    
}
}


function 
materia(nombre,horasTotales,horasSemanales) {
    
this.nombre nombre;
    
this.horasTotales horasTotales;
    
this.horasSemanales horasSemanales;
}


var 
area1 = new area("Área sociolingüística"10010);
var 
area2 = new area("Área Matemáticas"20020);
var 
area3 = new area("Área taller"50050);
//...
var materia1 = new materia("Materia Lengua PGS"404);
var 
materia2 = new materia("Matemáticas"5010);
//...

// añado materia1 a area1
if( area1.cabeMateria(materia1) )
    
area1.anyadirMateria(materia1);
//...
//... 
No sé si estás familiarizado con este tipo de sintaxis, yo creo que es la más legible.



Pero sí, definitivamente creo que tendrás que volcar todas las áreas, asignaturas y sus respectivas características al código javascript, para después poder operar...






O eso.. o hacer las comprobaciones mediante AJAX, pero no se me da tan bien, tendrías que preguntar en su foro.



Un saludo y corrígeme si me equivoco.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 26/07/2007, 09:10
 
Fecha de Ingreso: febrero-2007
Mensajes: 138
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Comprobación cálculo dinámico

Muchas gracias, pero la verdad, ahora mismo no veo si eso me soluciona el problema, veo que hay algo en lo que no me he expresado bien, a ver, cuando dices que:

"Teniendo este planteamiento, lo que pretendemos es editar una Materia diciendo: Si materia4 pertenece a areaB, quiero que materia4 pertenezca a areaC. Con lo cual tengo que restarle a areaB de su cantidad de horasSemanales y de su cantidad de horasTotales las correspondientes a materia4, y esas mismas cantidades de hora sumarselas a areaC."

No es eso, las horas totales son siempre las mismas y están guardadas con el área, no tenemos que restarles ni sumarles nada a un área si decidimos cambiar la materia de un área a otra, simplemente tenemos que volver a calcular cuántas horas quedan libres en el área nuevo para ver cuántas les podemos asignar a esa materia nueva, es deicr, no se guarda en ningún sitio las 'horas disponibles' de un área, sino que siempre están guardadas las 'horas totales' del área, y, a partir de ahí calculamos sumando todas las materias que están en ese momento en ese área para ver cuántas horas quedan libres. Espero haberme explicado mejor, si no es así, házmelo saber.


Aunque viendo tu código se me ha ocurrido 1 idea que no sé llevar a cabo: a ver, aqui la dificultad que hay es que el usuario puede cambiar de área, y lo hace mediante un select:

Código PHP:
echo'
    &nbsp&nbsp Área:
      <select name="cNArea">
          <option value='
.$fila['nArea'].'>'.$fila1['nombreArea'].'</option>';
          while (
$fila2mysql_fetch_assoc($result2)){
                  if (
$fila2['nArea']!=$fila['nArea'])
                  echo 
'<option value='.$fila2['nArea'].'>'.$fila2['nombreArea'].'</option>';
          }  
echo 
'</select>'
Por tanto, se me ocurre que una solución podría ser que con un evento onChange() en el select (es decir cada vez que el usuario modifique el área) tendríamos que pasarle el número de horas totales y el número de horas semanales de ese área, y eso es lo que no sé cómo se hace, ni siquiera sé si se puede hacer, porque creo que habría que hacer una consulta, y recoger los valores y pasárselos cada vez que el usuario cambie el área, ¿entiendes?

Muchas gracias, saludos
  #8 (permalink)  
Antiguo 26/07/2007, 09:25
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Comprobación cálculo dinámico

Cita:
Iniciado por marcospuig
"Teniendo este planteamiento, lo que pretendemos es editar una Materia diciendo: Si materia4 pertenece a areaB, quiero que materia4 pertenezca a areaC. Con lo cual tengo que restarle a areaB de su cantidad de horasSemanales y de su cantidad de horasTotales las correspondientes a materia4, y esas mismas cantidades de hora sumarselas a areaC."

No es eso, las horas totales son siempre las mismas y están guardadas con el área, no tenemos que restarles ni sumarles nada a un área si decidimos cambiar la materia de un área a otra, simplemente tenemos que volver a calcular cuántas horas quedan libres en el área nuevo para ver cuántas les podemos asignar a esa materia nueva, es deicr, no se guarda en ningún sitio las 'horas disponibles' de un área, sino que siempre están guardadas las 'horas totales' del área, y, a partir de ahí calculamos sumando todas las materias que están en ese momento en ese área para ver cuántas horas quedan libres. Espero haberme explicado mejor, si no es así, házmelo saber.
Sí, es verdad, lo he vuelto a releer ahora y me he hice un lío con esa frase. Pero el código que postee expresa la idea bastante bien.

Lo que debería decir mi párrafo es:
Teniendo este planteamiento, lo que pretendemos es editar una Materia diciendo: Si materia4 pertenece a areaB, quiero que materia4 pertenezca a areaC. Con lo cual tengo que sumarle (quitarle la materia=sumarle horas disponibles) a areaB de su cantidad de horasSemanalesDisponibles y de su cantidad de horasTotalesDisponibles las correspondientes a materia4, y esas mismas cantidades de hora restárselas (añadir la materia=quitarle las horas disponibles) a areaC.
Bien, lo había entendido, pero lo escribí mal. La cantidad de horas totales y semanales no se modifica, pero las disponibles (el cálculo que tú mencionas, y haces en PHP) sí se modifica. Yo te proponía hacer ese cálculo en js, y jugar con las operaciones en js.





Si te decides a implementar el sistema como te he comentado, sería una buena idea. Si no... podemos simplificar. Veamos:
Cita:
Iniciado por marcospuig
Por tanto, se me ocurre que una solución podría ser que con un evento onChange() en el select (es decir cada vez que el usuario modifique el área) tendríamos que pasarle el número de horas totales y el número de horas semanales de ese área, y eso es lo que no sé cómo se hace, ni siquiera sé si se puede hacer, porque creo que habría que hacer una consulta, y recoger los valores y pasárselos cada vez que el usuario cambie el área, ¿entiendes?
Es una buena idea. Hacer una consulta a la BD dinámicamente, sin recargar la página se llama AJAX. Podemos implementarlo así o volcar los datos a la página:
En el onchange del select lo primero que tienes que hacer es ver si la materia cabe en la área seleccionada. Para ello necesitas las horasTotales y las horasSemanales de cada área en el documento (además de las disponibles ya calculadas en PHP, o calculadas en el javascript), guardadas en variables o en cualquier sitio del documento. Pero lo necesitas primero para validar. De hecho, luego operaríamos con esas horas, así que lo primero sería resolver eso.



Valen los dos sistemas, el de los objetos, y el de sin objetos. Con objetos se ve mejor, pero es más código. Sin objetos las operaciones son más "a pelo", hay que verlas mejor a la primera y entenderlas (y dentro de un mes no te acordarás de lo que has hecho).


Tú decides, pero hagas lo que hagas necesitas los datos de las horas en la página.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 26/07/2007, 09:35
 
Fecha de Ingreso: febrero-2007
Mensajes: 138
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Comprobación cálculo dinámico

Vale , pues la opción de AJAX queda casi descartada porque no sé AJAX, no lo he usado nunca, y he leido que es 1 poco complicadillo, y con el tiempo que tengo para resolver esto la veo la opción más complicada.

Pero es que viendo tu solución con los objetos, no entiendo cómo soluciona el problema, veo que con tu solución hay que usar también el onChange() porque si no, como sabes el área que tiene seleccionada en ese momento el usuario, y cómo le envías a javascript en ese momento las horas ¿tendrás que hacer la consulta primero no? y volvemos a estar en las mismas.

Yo creo que no he entendido bien tu ejemplo, si pudieras volver a explicarlo.

Muchas gracias , 1 saludo
  #10 (permalink)  
Antiguo 26/07/2007, 15:19
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Comprobación cálculo dinámico

Bueno, creo que estamos en un concepto un poco más apartado de lo que es la programación.

Si tienes los datos de cada área (nombre de área, horasTotales y horasSemanales) en el servidor, ¿Cómo esperas calcular y operar en javascript con ellos?

Es decir, la solución definitiva, reitero, es imprimir todos los datos que necesites para operar en el documento.


Es como querer sumar dos números, y uno lo tienes en la base de datos y otro en javascript. Si no vuelcas el primer número en la página en el código javascript ¿cómo esperas hacer la suma de los dos números si no los tienes disponibles? Esa es la idea.

Cita:
Iniciado por marcospuij
Pero es que viendo tu solución con los objetos, no entiendo cómo soluciona el problema, veo que con tu solución hay que usar también el onChange() porque si no, como sabes el área que tiene seleccionada en ese momento el usuario, y cómo le envías a javascript en ese momento las horas ¿tendrás que hacer la consulta primero no? y volvemos a estar en las mismas.
Bueno, aquí el problema se soluciona porque tienes todos los datos y todo lo necesario para calcular, operar las horas, y hacer los movimientos de las materias entre las áreas que tú necesites. Es decir, todo lo que necesitas lo tienes, no hay nada en el servidor que no tengas en el código javascript. Sigues necesitando por supuesto el onchange, nadie dijo lo contrario. Pero tenerlos en objetos y propiedades es una forma de tener los datos ordenados y controlados.

De esta manera si tienes la materia Álgebra dentro del área Matemáticas, y quieres mover esa materia Álgebra al área Lingüística, lo que debemos hacer es mirar si "cabe" en el área Lingüística, es decir, necesitas los datos horasTotales y horasSemanales, y la cantidad de horas que hay ocupadas -horasTotalesDisponibles y horasSemanalesDisponibles- o en su defecto la cantidad de asignaturas que contiene Lingüística, cada una con su número de horasTotales y horasSemanales. Es decir, necesitas prácticamente TODO en el javascript.

La solución práctica sería (esbozo):
Código PHP:
/// EN EL CLIENTE

<select name="areas" onchange="cambiarMateriaDeArea(materiaAlgebra,this)">
<
option>...</option>
...
</
select>
<
input type="submit" value="guardarCambios" />

Y en la función cambiarAsignaturaDeArea(objMateria,selectAreas) {
1. Localizamos el option seleccionado en el select 
2. Ese option tiene asignado un objetoArea ya declarado 
(descargado de la BD). Localizarlo
3. Si no está la materia dentro de ese área hacemos lo siguiente
:
4. if( objetoArea.cabeMateria(objMateria) )
    
objetoArea.anyadirMateria(objMateria);
    else
    
alert("Ha habido un error, la materia no puede introducirse en el área, no cabe"); 
}

document.formulario.onsubmit = function() {
1. Asignaremos a múltiples campos hidden los cambios necesarios
No estaría mal volver a volcar aquí todo el contenido de los objetos areapara saber qué materias contiene ahora cada área
}



/// EN EL SERVIDOR
1. Traemos todos los datos desde la BD
2. Comprobamos que los cambios sean coherentes
.
   
2.1Si son coherenteslos guardamos y devolvemos Éxito.
   
2.2Si no son coherentes devolvemos Error de coherencia

No es que sea fácil, pero es la manera de hacerlo todo en el ordenador del cliente cuando tienes todos los datos necesarios en el servidor. La única forma es volcarlos al código javascript o consultarlos mediante AJAX. Para mí esta es la forma más "normal" si es que son pocos datos.


¿Te ves capaz de intentarlo?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #11 (permalink)  
Antiguo 27/07/2007, 03:39
 
Fecha de Ingreso: febrero-2007
Mensajes: 138
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Comprobación cálculo dinámico

Voy a intentarlo, a ver como va la cosa, ya te diré....Muchas gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:45.