Ver Mensaje Individual
  #10 (permalink)  
Antiguo 12/01/2011, 02:22
Avatar de repara2
repara2
 
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 3 meses
Puntos: 331
Respuesta: ayuda sobre asignar orden de productos

Te mando una preliminar que puedes adaptar a tu proyecto. Se trata de leer la tabla origen, guardar los datos, insertar el elemento nuevo, borrar la tabla y reinsertar los elementos ordenador.
<<<<<<<<<<<<<<<<<<< TRABAJA SOBRE UNA TABLA DE PRUEBAS ANTES DE PONERLO EN PRODUCCION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Modifica a gusto, espero que te sirva:

Código PHP:
<?php

/**
 * CREAR LA TABLA DE PRUEBAS
 * CREATE TABLE `temp` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `descripcion` VARCHAR(8) DEFAULT NULL,
  `dependencia` CHAR(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;


INSERT  INTO `temp`(`id`,`descripcion`,`dependencia`) VALUES (1,'A','0'),(2,'B','1'),(3,'C','1'),(4,'D','1'),(5,'E','2'),(6,'F','1'),(7,'G','2'),(8,'H','1'),(9,'I','2');
 */

error_reporting(E_ALL);
ini_set("display_errors"1);
mysql_connect("localhost","USER","PASS");
mysql_select_db("bd217754");

/**
 * Inserta un elemento en la posición $xElement y reordena la tabla
 *
 * @param int $xElement
 * @return array
 * @author barcoavenus.blog.com
 */

function reOrder($xElement$xData){


    
$xResponse = array();

    
/**
     * Selecciono todos los elementos de la tabla ordenador por el campo orden
     */
    
$sql "SELECT * FROM temp ORDER BY id;";
    if(!
$query mysql_query($sql)) $xResponse = array("Error en la select: ".mysql_error());

    
/**
     * Agrego el elemento nuevo en la posición correcta
     */
    
foreach ($xData as $key => $value)
    
$xResponse[$xElement][$key] = $value;



    while(
$fetch mysql_fetch_assoc($query)){

        if(
$fetch['id'] == $xElement//Si estamos en el orden que nos interesa
        
{
            
//Insertamos en el elemento actual en la siguiente posición, es decir, desplazado hacia abajo
            
foreach ($fetch as $key => $value)
            
$xResponse[$fetch['id']+1][$key] = ($key=='id'?$fetch['id']+1:$value);
        }
        else { 
//de lo contrario lo dejamos como estaba
            
foreach ($fetch as $key => $value)
            
$xResponse[$fetch['id']][$key] = ($key=='id'?$fetch['id']:$value);
        }

    }
    
/**
     * Ahora $xResponse contiene todos los elementos de la tabla y además en la posición $xElement el elemento indicado
     */

    
mysql_free_result($query);
    
asort($xResponse);

    
/**
     * Borramos la tabla y la regeneramos, utilizo transacciones para evitar perdida de datos
     */
    
mysql_query("BEGIN;");
    if(!
mysql_query("TRUNCATE TABLE temp;")) {echo "Imposible limpiar tabla!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
    
$xInsert "";
    
//Generar la sentencia insert
    
foreach ($xResponse as $xInfo){
        
$xSql "INSERT INTO temp (";
        foreach (
$xInfo as $key => $value)
        
$xSql .= "".$key.",";

        
$xSql substr($xSql0, -1); //Quito la coma final
        
$xSql.= ") VALUES (";

        foreach (
$xInfo as $key => $value)
        
$xSql .= "'".$value."',";

        
$xSql substr($xSql0, -1); //Quito la coma final
        
$xSql.= ");";

        
$xInsert .= $xSql;

        if(!
$insert mysql_query($xSql)) {echo mysql_errno().": Imposible insertar filas!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
    }

    if(!
mysql_query("COMMIT;")) {echo mysql_errno().": Imposible hacer commit!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
    return 
true;
}

/**
 * tabla antes:
 *     id  descripcion  dependencia
------  -----------  -----------
     1  A            0          
     2  B            1          
     3  C            1          
     4  D            1          
     5  E            2          
     6  F            1          
     7  G            2          
     8  H            1          
     9  I            2    
 */

$xData = array(
'id' => '7',
'descripcion' => 'X',
'dependencia' => '2');

if(!
reOrder(7$xData)) die("<h1>No he podido reordenar la tabla!</h1>");
die(
"<h1>Tabla reordenada!</h1>");

/**
 * Tabla después
 *     id  descripcion  dependencia
------  -----------  -----------
     1  A            0          
     2  B            1          
     3  C            1          
     4  D            1          
     5  E            2          
     6  F            1          
     7  X            2          
     8  H            1          
     9  I            2  
     
 */



?>