Foros del Web » Programando para Internet » PHP »

ordenar por pesos en registros.

Estas en el tema de ordenar por pesos en registros. en el foro de PHP en Foros del Web. Buenas noches estimados y estimadas foristas. tengo unos registros en una db que necesito ordenar para mostrarlo de una forma especifica. imaginate que tienes un ...
  #1 (permalink)  
Antiguo 28/11/2008, 16:33
 
Fecha de Ingreso: septiembre-2007
Mensajes: 139
Antigüedad: 16 años, 7 meses
Puntos: 1
Información ordenar por pesos en registros.

Buenas noches estimados y estimadas foristas.
tengo unos registros en una db que necesito ordenar para mostrarlo de una forma especifica.
imaginate que tienes un admisntrador de noticias y deseas ordenar las noticias en un orden especifico.
claro que puedes colocarle a la db una columna que la puedes llamar peso y ordenas por peso, pero yo desde hacer un sistema que me muetros todas las noticias y que tengan una flechita que yo le valla dando a la flechita y si es para arriba entonces que le quite peso y lo colque un nivel mas arriba.
o si le das a la flecha hacia bajo entonces que baje de nivel?

es un ordenamiento por peso.. yo no quiero que el administrador este colocando peso en numero para ordenar las noticias.. lo que quiero es que tenga flechas que la flecha sea la que actualisen los registros para que se coloco encima o abajo, depende de la accion que se requiera.
  #2 (permalink)  
Antiguo 29/11/2008, 21:19
 
Fecha de Ingreso: septiembre-2007
Mensajes: 139
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: ordenar por pesos en registros.

alguna ayuda?
  #3 (permalink)  
Antiguo 29/11/2008, 21:28
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ordenar por pesos en registros.

Hola diazhh. Tienes armado ya el sistema de noticias que vas a usar?

La lógica es sencilla para lo que deseas hacer. Agregas a la tabla que almacena tus noticias una columna peso. Si gustas puedes creale un índice UNIQUE, pero si programas correctamente no sería necesario. Y las flechas, sencillo. Si decides subir, averiguas cuál es el peso mayor inmediato al actual, y realizas un intercambio de pesos con la noticia que lo tenga. Lo mismo si deseas bajar. Lo más sencillo sería que 1 represente la mayor importancia.

Así, tienes 5 noticias con pesos 1, 2, 3, 4 y 5. Si quiero subir de peso la noticia que actualmente pesa 3, entonces averiguo cual es aquella con el peso mayor inmediato a la actual, que en este caso es 2. Luego realizo un intercambio entre ambas noticias.

Siguiendo este procedimiento verás que no es nada difícil hacer lo que pides (en el sentido de que no hay funciones extrañas ni se requiere de complejos algoritmos).

Saludos,
  #4 (permalink)  
Antiguo 29/11/2008, 21:39
 
Fecha de Ingreso: septiembre-2007
Mensajes: 139
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: ordenar por pesos en registros.

bien okram, gracias por tu ayuda.
la verdad se cual es el funcionamiento.
pero queria saber si ya habia un codigo ya listo ya que son muchas cosas que estoy haciendo a la vez y no queria dedicarle tiempo a eso que se lo podia dedicar a otras cpsas mas dioficiles.
te explico, no es un sistema de noticia. es un sistema de soporte tecnico.
se supone que el adminsitrador del sistema va agregando los posibles problemas que puede presentar el monitir, el cou, el teclado, el mouse, el telefono, la camara fotografica, el scaner, etc, etc, etc; de una empresa.
el agregar el problema y luego a cada problema el le va a agregar posibles soluciones para que el usuario antes de llamar a soporte pueda interactuar con el sistema e intentar solucionar. en caso que no lologre entonces solicita la ayuda correspondiente.
entonces necesitmas que el administrador escoja el orden de las soluciones y que en el momento que lo requiera ya que asi lo considera diga que en vez de la solucion que el usuario iba a ver de 5 lugr ahora la quiera ver en el lugar n° 2.
bueno espero que me entiendas, ah y que todo eso lo haga con flechitas.
bueno si alguien me puede ayudar con un pedazo de script se lo agradeceria.
gracias
  #5 (permalink)  
Antiguo 29/11/2008, 22:01
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ordenar por pesos en registros.

Desconozco si existe algún script prefabricado para eso, y lo más seguro para mí es que no. Y tampoco creo que alguien aquí pueda elaborarte un script así por así nada más. Tú mismo lo has dicho, para qué dedidarle tiempo a eso si podría dedicarlo a hacer otras cosas?. Hay un subforo de Ofertas de Empleo, donde mucha gente gustosamente podrá hacerte ese trabajo por una módica suma.

Ya te di la idea principal, y es lo más que puedo hacer. Si te animas a elaborar el script, publica aquí mismo las dudas y problemas que se te presenten, y podremos seguir ayudándote

Saludos,
  #6 (permalink)  
Antiguo 30/11/2008, 23:11
 
Fecha de Ingreso: septiembre-2007
Mensajes: 139
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: ordenar por pesos en registros.

Hola estimados Foreros, preferi dedicarle un poco mas de tiempo para lograr hacer mi propio script y ya lo tengo funcionando.
asi que lo muestro con una explicacion para que ais puedan entenderlo, si es de mejorarlo que lo mejoren y como por lo visto nohay ningun script que haga lo mismo entonces seria bueno colocarlo en la seccion de contribuciones en las faq.

bien aca le explico paso a paso.

primero la base de datos donde van los datos.
en este caso mi aplicacion sera una en la que muestres soluciones y como explique en el mensaje anterior el administrador puede escojer el peso de las soluciones, asi que mi tabla se llama 'soluciones'.
Código PHP:
CREATE TABLE IF NOT EXISTS `soluciones` (
  `
idint(100NOT NULL auto_increment,
  `
id_problemaint(10NOT NULL,
  `
soluciontext NOT NULL,
  `
nivelint(3NOT NULL default '0',
  
PRIMARY KEY  (`id`),
  
UNIQUE KEY `id` (`id`)
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=
luego hago mi formulario para agregar registros en la base de datos pero primero averiguo cual es el peso del proximo registro a insertar.
para esto averiguo primero cuantos registros hay en mi base de datos.
dado que en esta oportunidad uso dreamweaver coloco el codigo tal cual como lo coloca dreamweaver

Código PHP:
$maxRows_soluciones 100;
$pageNum_soluciones 0;
if (isset(
$_GET['pageNum_soluciones'])) {
  
$pageNum_soluciones $_GET['pageNum_soluciones'];
}
$startRow_soluciones $pageNum_soluciones $maxRows_soluciones;

$colname_soluciones "-1";
if (isset(
$_GET['problema'])) {
  
$colname_soluciones $_GET['problema'];
}
mysql_select_db($database_conexion$conexion);
$query_soluciones sprintf("SELECT * FROM soluciones WHERE id_problema = %s ORDER BY nivel ASC"GetSQLValueString($colname_soluciones"int"));
$query_limit_soluciones sprintf("%s LIMIT %d, %d"$query_soluciones$startRow_soluciones$maxRows_soluciones);
$soluciones mysql_query($query_limit_soluciones$conexion) or die(mysql_error());
$row_soluciones mysql_fetch_assoc($soluciones);

if (isset(
$_GET['totalRows_soluciones'])) {
  
$totalRows_soluciones $_GET['totalRows_soluciones'];
} else {
  
$all_soluciones mysql_query($query_soluciones);
  
$totalRows_soluciones mysql_num_rows($all_soluciones);
}
$totalPages_soluciones ceil($totalRows_soluciones/$maxRows_soluciones)-1
de todo el codigo por los moemntos lo que me interesa es
Código PHP:
$totalPages_soluciones ceil($totalRows_soluciones/$maxRows_soluciones)-1
ya que es el que me dira cuantos registros hay en la db.
luego hago lo sguiente:
Código PHP:
    if ($totalRows_soluciones == 0){
    
$prox 1;
    }else{
    
$prox $totalRows_soluciones 1;
    } 
si en la base de datos no hay registros entonces inicializo una variable que se llama $prox con el dato '1', en caso que exista la inicializo con el numero de registros mas uno.
esto lo hago con la finalidade de:
si no existe registros en esa tabla entonces el primer registro tendra como peso '1', pero en tal caso que ya existan registros, imaginemos que halla un registros entonces la proxima entrada sera 1 + 1, osea que el peso sera '2' y asi en cada registro nuevo.

luego hagomi formulario:
Código HTML:
<h4 align="center">Administrador de soluciones</h4>
      <p align="left">Parte: <?php echo $_GET['partes']; ?></p>
      <p align="left">Problema: <?php echo $row_problema['problema']; ?></p>
      <p align="center">Soluciones:</p>
      <form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1">
        <table align="center">
          <tr valign="baseline">
            <td nowrap="nowrap" align="right" valign="top">Solucion:</td>
            <td><textarea name="solucion" cols="50" rows="5"></textarea>
            </td>
          </tr>
          <tr valign="baseline">
            <td nowrap="nowrap" align="right">&nbsp;</td>
            <td><input type="submit" value="Agregar" /></td>
          </tr>
        </table>
        <input type="hidden" name="id_problema" value="<?php echo $row_problema['id']; ?>" />
        <input type="hidden" name="nivel" value="<?php echo $prox; ?>" />
        <input type="hidden" name="MM_insert" value="form1" />
      </form> 
noten que uno de los campos ocultos con el nombre 'nivel' esta cargado con la variable $prox
Código HTML:
<input type="hidden" name="nivel" value="<?php echo $prox; ?>" /> 
luego ese formulario se envia a ese mismo archivo y lo agrega a la db mediante el siguiente script:
Código PHP:
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  
$insertSQL sprintf("INSERT INTO soluciones (id_problema, solucion, nivel) VALUES (%s, %s, %s)",
                       
GetSQLValueString($_POST['id_problema'], "int"),
                       
GetSQLValueString($_POST['solucion'], "text"),
                       
GetSQLValueString($_POST['nivel'], "text"));

  
mysql_select_db($database_conexion$conexion);
  
$Result1 mysql_query($insertSQL$conexion) or die(mysql_error());

  
$insertGoTo "modulos.php?nombre=soluciones&partes=$_GET[partes]&problema=$_GET[problema]";
  
header(sprintf("Location: %s"$insertGoTo));

de esta forma esta agregando las posibles soluciones con pesos en orden.


luego voy a hacer la tabla que va a mostrar mis datos con el menu para administrar los pesos:
Código PHP:
      <table width="80%" border="0" align="center">
        <tr>
          <td>solucion</td>
          <td>nivel</td>
          <td><div align="center">Peso</div></td>
          <td><div align="center">Editar</div></td>
          <td><div align="center">Borrar</div></td>
        </tr>
        <?php 
        
do { 
        if (
$row_soluciones['nivel'] == 1){
        
$p 1;
        }elseif (
$totalRows_soluciones == $row_soluciones['nivel']){
        
$p 2;
        }else{
        
$p 3;
        }
        
$b_bajar $row_soluciones['nivel'] + 1;
        
$s_bajar $row_soluciones['nivel'] - 1;
        
$s_id_a $row_soluciones['id'];
        
?>
          <tr>
            <td><?php echo $row_soluciones['solucion']; ?></td>
            <td><?php echo $row_soluciones['nivel']; ?></td>
            <td><div align="center"><?php 
            
if ($p == 1){
            
?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&b_bajar=<?php echo $b_bajar?>&b_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/down.gif" /></a>
            <?php 
            
}
            if (
$p == 2){
            
?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&s_bajar=<?php echo $s_bajar?>&s_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/up.gif" /></a>
            <?php 
            
}
            if (
$p == 3){
            
?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&s_bajar=<?php echo $s_bajar?>&s_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/up.gif" /></a>
            <?php
            ?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&b_bajar=<?php echo $b_bajar?>&b_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/down.gif" /></a>
            <?php 
            
}
            
?></div></td>
            <td><div align="center"><a href="modulos.php?nombre=editar_soluciones&amp;id=<?php echo $row_soluciones['id']; ?>&amp;partes=<?php echo $_GET[partes]; ?>&amp;problema=<?php echo $_GET[problema]; ?>"><img src="img/b_edit.png" alt="" width="16" height="16" border="0" /></a></div></td>
            <td><div align="center"><img src="img/b_drop.png" width="16" height="16" border="0" /></div></td>
          </tr>
          <?php 

          
          
} while ($row_soluciones mysql_fetch_assoc($soluciones)); ?>
      </table>
  #7 (permalink)  
Antiguo 30/11/2008, 23:12
 
Fecha de Ingreso: septiembre-2007
Mensajes: 139
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: ordenar por pesos en registros.

con un bucle recorri la consulta a la db que hice arriba, e hice una seccion que selecciona la imagen a mostrar. en este caso muestra si requiere imprimir una flecha hacia arriba, una hacia abajo o ambas. esto lo hago con el siguiente script:
Código PHP:
if ($row_soluciones['nivel'] == 1){
        
$p 1;
        }elseif (
$totalRows_soluciones == $row_soluciones['nivel']){
        
$p 2;
        }else{
        
$p 3;
        } 
asi que si lo que va a imprimir es el peso '1' entonces la variable $p la inicializo con 1, esto mas adelanta hara que se muestra la flecha hacia abajo con un vinculo que luego usare para darle ms peso a este registro.
Código HTML:
if ($p == 1){
			?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&b_bajar=<?php echo $b_bajar; ?>&b_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/down.gif" /></a>
            <?php 
			}
ahora bien si lo que va a imprimir en pantalla es el registro de mayor peso entonces inicializa $p con el dato '2' mostrando una flecha hacia arriba con un vinculo que luego usaremos
Código HTML:
if ($p == 2){
			?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&s_bajar=<?php echo $s_bajar; ?>&s_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/up.gif" /></a>
            <?php 
			}
ahora si la situacion no concuerda con ninguna de estas cosas entonces se supone que es un valor intermedio a lo que muestras las 2 flechas para que puedas o darle mayor peso o quitarle peso:
Código HTML:
if ($p == 3){
			?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&s_bajar=<?php echo $s_bajar; ?>&s_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/up.gif" /></a>
            <?php
			?>
            <a href="modulos.php?nombre=soluciones&partes=<?php echo $_GET['partes']; ?>&problema=<?php echo $_GET['problema']; ?>&b_bajar=<?php echo $b_bajar; ?>&b_subir=<?php echo $row_soluciones['nivel']; ?>&id2=<?php echo $row_soluciones['id']; ?>"><img border="0" src="img/down.gif" /></a>
            <?php 
			}
y por ultimo al darle click a a a flecha de bajar peso entonces se ejecuta este script
Código PHP:
if (isset($_GET['b_bajar'])) {
$a $_GET['b_subir'];
$b $_GET['b_bajar'];
  
$updateSQL sprintf("UPDATE soluciones SET nivel = $a WHERE (nivel=%s AND id_problema = $_GET[problema]) LIMIT 1",
                       
GetSQLValueString($b"int"));

  
mysql_select_db($database_conexion$conexion);
  
$Result1 mysql_query($updateSQL$conexion) or die(mysql_error());

  
$updateSQL sprintf("UPDATE soluciones SET nivel = $b WHERE (id=%s AND id_problema = $_GET[problema]) LIMIT 1",
                       
GetSQLValueString($_GET['id2'], "int"));

mysql_select_db($database_conexion$conexion);
$Result1 mysql_query($updateSQL$conexion) or die(mysql_error());


$updateGoTo "modulos.php?nombre=soluciones&partes=$_GET[partes]&problema=$_GET[problema]";
header(sprintf("Location: %s"$updateGoTo));

y si es al de subir peso se ejecuta este script:
Código PHP:
if (isset($_GET['s_bajar'])) {
$a $_GET['s_subir'];
$b $_GET['s_bajar'];
  
$updateSQL sprintf("UPDATE soluciones SET nivel = $a WHERE (nivel=%s AND id_problema = $_GET[problema])",
                       
GetSQLValueString($b"int"));

  
mysql_select_db($database_conexion$conexion);
  
$Result1 mysql_query($updateSQL$conexion) or die(mysql_error());

  
$updateSQL sprintf("UPDATE soluciones SET nivel = $b WHERE (id=%s AND id_problema = $_GET[problema]) LIMIT 1",
                       
GetSQLValueString($_GET['id2'], "int"));

  
mysql_select_db($database_conexion$conexion);
  
$Result1 mysql_query($updateSQL$conexion) or die(mysql_error());


  
$updateGoTo "modulos.php?nombre=soluciones&partes=$_GET[partes]&problema=$_GET[problema]";
header(sprintf("Location: %s"$updateGoTo));

si lo analizan sabran el que hace cada script.
les comento que en la tabla donde estan las flechas tambien hay un par de imagenes que se encargan de editar y/o borrar en este caso las soluciones, lo digo para que no cause confusion.
bueno en cuanto tenga el archivo completo y diseñado monto los archivos en un servidor para que lo puedan descargar.
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:10.