Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/01/2010, 14:23
lennhix
 
Fecha de Ingreso: octubre-2009
Mensajes: 74
Antigüedad: 15 años, 1 mes
Puntos: 0
Amigos necesito de toda su ayuda porfavor, con mantener 100% Algoritmo PHP

Ya ahora sí amigos.

Posteo el código con todos los /* Comentarios */.

Si leen los Comentarios me podrán entender.
En resumido, quiero que los valores:
34, 22,40,4 (Estos están guardados en campo llamado, valor_porcentual en MySQL)
Siempre me sumen 100. Aunque yo modifique el 34 por el 80.
Pero como requisito no me deben dar valores negativos.

Mejor dejo el código para que me entiendan que quiero hacer:
Código PHP:
Ver original
  1. <?php
  2. require_once '../../../config/mysql.php';
  3. $dbCon = Conectarse();
  4.  
  5.  
  6.  
  7. /*
  8.  * Por ejemplo los valores sin modificación seran:
  9.  * 34 + 22 + 40 + 4 = 100.
  10.  * Y el valor que modificare será 34 por 80, entonces me quedarian:
  11.  * 80 + 22 + 40 + 4 = 146. (Se paso del 100%)
  12. */
  13.  
  14. // Capturamos los valores con $_GET[]
  15. // No se preocupen de estos valores.
  16. $productor              = $_GET['productor'];           //Ej. : Agricola Saenz
  17. $especie                = $_GET['especie'];             //Ej. : Ciruela
  18. $variedad               = $_GET['variedad'];            //Ej. : Angeleno
  19. $etapa                  = $_GET['etapa'];               //Ej. : 1
  20. $calibre                = $_GET['calibre'];             //Ej. : 32
  21.  
  22. //Aquí si, empiecen a leer :)
  23. $porcentualReal         = $_GET['porcentualReal'];      //esta variable guarda : 34
  24. $porcentual             = $_GET['campoPorcentual'];     //Aquí es donde se guardara el cambio. Está variable guarda : 80.
  25. $cero                   = 0;
  26.  
  27. // Actualizamos el valor porcentual con el valor que el usuario a ingresado. ($porcentual = 80).
  28. mysql_query("UPDATE criterio_calibres SET valor_porcentual = $porcentual WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa AND `criterio_calibres`.`id_calibre` = $calibre LIMIT 1", $dbCon)or die(mysql_error());
  29.  
  30. // Recuperamos la cantidad total de columnas, menos la columna que ha hecho el cambio del valor porcentual y las que tienen valor cero.
  31. // Entonces: $quantyColumnas guardara : 3 - (Sin contar la columna con el valor modificado, osea el 80).
  32. $resultado              = mysql_query("SELECT COUNT(valor_porcentual) AS Cantidad FROM criterio_calibres WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa AND `criterio_calibres`.`id_calibre` != $calibre AND `criterio_calibres`.`valor_porcentual` != $porcentual AND `criterio_calibres`.`valor_porcentual` != $cero", $dbCon)or die(mysql_error());
  33. $columnas               = mysql_fetch_array($resultado);
  34. $quantyColumnas         = $columnas['Cantidad'];
  35.  
  36.  
  37. // Recuperamos la Suma total de los valores porcentuales.
  38.  
  39. $queryCriterioCalibre = mysql_query("SELECT SUM(valor_porcentual) as suma FROM criterio_calibres WHERE id_productor = '$productor' AND id_especie = '$especie' AND id_variedad = '$variedad' AND etapa = $etapa", $dbCon);
  40. $resultadoPorcentual = mysql_fetch_array($queryCriterioCalibre);
  41. // Entonces si aplique el 80, la suma total seria : 146 (80 + 22 + 40 + 4 = 146).
  42. // $Suma = 146.
  43. $Suma = round($resultadoPorcentual['suma'],0);
  44.  
  45.  
  46. /* Aqui es donde tengo el problema, lo que necesito es que se mantenga el 100, aunque modifique los valores porcentuales
  47.  * Por ejemplo si antes era esto: 34 + 22 + 40 + 4 = 100.
  48.  * Y ahora es esto 80 + 22 + 40 + 4 = 146).
  49.  * Este algoritmo en PHP debe dejarlo en 100.
  50.  * Pero resulta que no puedo encontrar una lógica correcta.
  51.  * Un gran requisito es que no quede ningún valor porcentual en negativo.
  52.  */
  53.  
  54. if($Suma > 100){
  55.     $Numerador = ($Suma - 100);
  56.  
  57.     $Consultamos = mysql_query("SELECT id_calibre, valor_porcentual FROM `criterio_calibres` WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa", $dbCon)or die(mysql_error());
  58.     while($columnasValores = mysql_fetch_array($Consultamos)){ 
  59.         $valor_porcentual = $columnasValores['valor_porcentual'];
  60.                
  61.         if($valor_porcentual >= $Numerador){
  62.             $Denominador = $Denominador + 1;
  63.         }
  64.     }
  65.    
  66.     $Consultamos = mysql_query("SELECT id_calibre, valor_porcentual FROM `criterio_calibres` WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa AND `criterio_calibres`.`id_calibre` != $calibre AND `criterio_calibres`.`valor_porcentual` != $porcentual", $dbCon)or die(mysql_error());
  67.     while($columnasValores = mysql_fetch_array($Consultamos)){ 
  68.         $id_calibre       = $columnasValores['id_calibre'];
  69.         $valor_porcentual = $columnasValores['valor_porcentual'];
  70.  
  71.         if($valor_porcentual >= $Numerador){
  72.                 $Resultado = $valor_porcentual-($Numerador/$Denominador);  
  73.                 mysql_query("UPDATE criterio_calibres SET valor_porcentual = $Resultado WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa AND CONCAT(`criterio_calibres`.`valor_porcentual`) = $valor_porcentual LIMIT 1", $dbCon)or die(mysql_error());
  74.         }
  75.     }  
  76.    
  77. }
  78. /* En este algoritmo no tengo ningun problema, este esta correcto */
  79. elseif($Suma <= 100){
  80.     $resultadoSumar             =   ($porcentualReal-$porcentual);
  81.     $resultadoDivisionSumar     =   ($resultadoSumar/$quantyColumnas); 
  82.  
  83.     $Consultamos = mysql_query("SELECT id_calibre, valor_porcentual FROM `criterio_calibres` WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa AND `criterio_calibres`.`id_calibre` != $calibre AND `criterio_calibres`.`valor_porcentual` != $porcentual", $dbCon)or die(mysql_error());
  84.     while($columnasValores = mysql_fetch_array($Consultamos)){
  85.         $id_calibre       = $columnasValores['id_calibre'];
  86.         $valor_porcentual = $columnasValores['valor_porcentual'];
  87.        
  88.         $resultadoSuma = $resultadoDivisionSumar + $valor_porcentual;
  89.         mysql_query("UPDATE criterio_calibres SET valor_porcentual = $resultadoSuma WHERE CONVERT(`criterio_calibres`.`id_especie` USING utf8) = '$especie' AND CONVERT(`criterio_calibres`.`id_productor` USING utf8) = '$productor' AND CONVERT(`criterio_calibres`.`id_variedad` USING utf8) = '$variedad' AND `criterio_calibres`.`etapa` = $etapa AND CONCAT(`criterio_calibres`.`valor_porcentual`) = $valor_porcentual LIMIT 1", $dbCon)or die(mysql_error());
  90.        
  91.        
  92.     }
  93. }
  94. /* ++++++++++++++++++++ Fin +++++++++++++++++++++++*/
  95. ?>

Última edición por lennhix; 22/01/2010 a las 14:29