Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Codificar Números de Serie Compuestos

Estas en el tema de Codificar Números de Serie Compuestos en el foro de Mysql en Foros del Web. Buenas, tengo una aplicación que usa una base de datos, que previsiblemente será bastante grande, en la que hay una tabla de productos. Tal y ...
  #1 (permalink)  
Antiguo 28/09/2011, 17:10
 
Fecha de Ingreso: diciembre-2009
Mensajes: 4
Antigüedad: 14 años, 4 meses
Puntos: 0
Codificar Números de Serie Compuestos

Buenas, tengo una aplicación que usa una base de datos, que previsiblemente será bastante grande, en la que hay una tabla de productos. Tal y como está los productos llevan un ID como clave primaria y auto_increment. Ademas uso este ID como Número de Serie en mi aplicación. El problema es que este ID no es "amigable" para los usuarios. Es dificil recordar un numero de serie como: 547898654. Necesito algo compuesto por la marca y un número mas corto, algo como ABA123, por ejemplo.

El problema es que no se como hacer esto (bien xD) en Mysql. Creo recordar haber leido que se podían utilizar una especie de índices compuestos por dos columnas, aunque no se si era para Mysql !.

Podría hacerlo chapuceramente, un VARCHAR(3) con la Marca y luego un INT con el número. Buscar, desde php, el último int para esa marca antes de insertar... por ejemplo ABA = 123, e insertar el siguiente, ABA124 en dos campos separados o uno alfanumérico... pero no si si hay alguna manera de hacer esto BIEN xD, a poder ser con autoincrement.

Creo que es un problema que debe ser bastante común para codificar facturas o números de serie, con algo mas que números...

Mi pregunta es ¿cual es la mejor manera de hacerlo?

Gracias de antemano.

Última edición por nikkoak; 28/09/2011 a las 18:17
  #2 (permalink)  
Antiguo 29/09/2011, 07:24
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.
  #3 (permalink)  
Antiguo 29/09/2011, 12:36
 
Fecha de Ingreso: diciembre-2009
Mensajes: 4
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Codificar Números de Serie Compuestos

Muchas gracias quimfv, me pongo a ello ahora mismo ;)

Etiquetas: codificar, php, serie, sql, tabla
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 21:06.