Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/09/2011, 07:24
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Codificar Números de Serie Compuestos

Eso de la mejor forma ya no se ... pero se me ocurre lo siguiente...

Supongamos que tenemos

Marcas
idMarca
Marca
Acronimo

(en acronimo tenemos las siglas que vamos a usar)

Productos
idProducto
Producto
idMarca
numCodigo

(en numCodigo guardamos la parte numerica del codigo "amigable")

idMarcaX=SELECT idMarca FROM marcas WHERE marca="MarcaX"

SELECT max(numCodigo)+1 FROM productos WHERE idMarca=idMarcaX

lo ideal seria poder ejecutar la segunda query dentro de un INSERT INTO en que se insertara el producto...

Código MySQL:
Ver original
  1. INSERT INTO productos (Producto,
  2.                                        idMarca,
  3.                                        numCodigo)
  4. VALUES "Nombre del Producto",
  5.                id_MarcaX,
  6.               (SELECT max(numCodigo)+1 FROM productos WHERE idMarca=idMarcaX);

PERO no puedes escribir y leer al mismo tiempo en la misma tabla....creo

Lo que si es fácil es ejecutar en programación externa las dos primeras querys y construir el INSERT INTO con los valores obtenidos


$idMarcaX <--- SELECT idMarca FROM marcas WHERE marca="MarcaX"

$nuevoNumCodigo <--- SELECT IFNULL(max(numCodigo),0)+1 FROM productos WHERE idMarca=$idMarcaX

(no uses COUNT solo con MAX+1 te aseguras que nunca vas a repetir números, hay un caso si se borra el ultimo producto entrado de una marca despues de haber mostrado su codigo el siguiente producto tendrá el mismo codigo... y podrian correr listas con los dos producto y el mismo codigo)


Código MySQL:
Ver original
  1. INSERT INTO productos (Producto,
  2.                                        idMarca,
  3.                                        numCodigo)
  4. VALUES "Nombre del Producto",
  5.                $id_MarcaX,
  6.                $nuevoNumCodigo;

Y finalmente con esto obtienes tu lista amigable de productos

Código MySQL:
Ver original
  1. SELECT m.acronimo,p.numCodigo,p.producto
  2. FROM productos p INNER JOIN marcas m
  3. ON p.idMarca=m.idMarca

Si se pueden hacer indices compuestos de varios campos pero no tiene nada que ver con esto, es otra guerra....

No se puede tener mas de un autoincrement en una tabla y este siempre será eso auto increment no hay manera de hacer que se reinicie en funcion de otro campo.

Para superar el caso del producto borrado podria guardar en la tabla Marcas el ultimo codigo he incrementarlo cada vez que se agregue un producto y nunca decrementarlo aún que borres productos...

Marcas
idMarca
Marca
Acronimo
UltimoCodigo

Despues de hacer un inser deberias hacer

UPDATE marcas SET ultimoCodigo=ultimoCodigo+1 WHERE idMarca=$idMarcaX

Tambien recuerda que deberias encapsular las distintas querys en una transaccion para asegurarte que si no se ejecutan todas se borren los resultados de las que si se hayan ejecutado.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.