Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
codigo de producto como primary key

Buenas de nuevo,

Se que es una pregunta muy basica, pero estaba intentando hacer una base de datos de productos de un super y tengo la duda de si el codigo del producto (el del codigo de barras) se pueda usar o no como clave primaria.
Estuve buscando en san google y, en principio, no recomiendan ese metodo sobretodo si va a usar en otras consultas, mejor usar un autoincremental.

La pregunta es si esto es correcto, como se puede usar la clave codigo de producto (numero del codigo de barras) para que las consultas sean agiles como con la primary key, (imagino que como index pero no seria tan rapido) porque firebird no tiene alternative key.

gracias
Responder Con Cita
  #2  
Antiguo 24-05-2014
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Hola foristas, un cordial saludo.

Pues les voy a contar una experiencia reciente respecto a un sistema para cobro de catastro en Colombia (Impuesto Predial) donde el identificador de la tabla principal del sistema era el la cédula catastral de los inmuebles, todo estaba perfecto pero el gobierno cambio la estructura y contenido de esa cédula catastral. La decisión que tomé fue conservar como identificador la cédula catastral y hacer una conversión de datos, levantar llaves foráneas y actualizar todas las tablas donde se hacia referencia a la cédula catastral, y crear un campo para guardar la cédula catastral anterior.

Pero el problema se va a presentar en el futuro porque dentro de la cédula catastral hay 4 digitos que por el momento está en ceros (0000) pero que van a contener el codigo de Barrio / Vereda. Que sucede, esa concepción rompe el diseño de bases de datos pues eso 4 digitos no deberián forma parte de la llave primaria, la llave primaria depende de otras cosas para existir y puede variar en el tiempo y eso debe evitarse a toda costa.

Que me toca hacer ? Pues crear un identificador consecutivo oculto al usuario, crear una llave única (uk = unique key) para la cedula catastral porque eso si es seguro que no puede haber dos cedulas catastrales con igual valor.

Las consultas se pueden volver más complejas y más lentas y el trabajo de optimización se torna más importante.

Mi recomendación utiliza un consecutivo como identificador, utiliza el codigo del producto como llave alterna única UK (esto lo permite firbird) si y solamente si se garantiza que no habrá dos registros con igual código de producto.

Si el cliente por ejemplo quiere diferenciar por colores y tallas y los quiere manejar como productos diferentes los códigos también son distintos ?
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #3  
Antiguo 24-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por anubis Ver Mensaje
...
Puedes crear un índice para ese campo, si no lo usas como clave primaria. Por la velocidad no te preocupes, es igual, o más rápido.
Responder Con Cita
  #4  
Antiguo 25-05-2014
Avatar de newtron
[newtron] newtron is online now
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.469
Poder: 21
newtron Va camino a la fama
Hola.

Un apunte sobre el tema de los códigos de barra. Aunque parezca extraño los códigos de pueden barra cambiar para un mismo artículo con lo que será fácil que te encuentres en existencias dos artículos idénticos pero con distintos códigos de barras lo que te generará un problema grave.

La solución para esto sería tener una tabla adicional de códigos en la que se guarde el código interno del artículo junto con su código de barras asociado y a la hora de buscar el artículo hacer una búsqueda del código de barras en esa tabla y luego buscar en la tabla de artículos el código interno que te devuelve esa búsqueda.

Esto es bastante útil puesto que puedes tener códigos de barras ilimitados para un mismo artículo y al mismo tiempo puedes asignarle a ciertos artículos de venta muy habitual códigos rápidos como el 1, 2, etc.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 26-05-2014
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Sólo como apostilla, según algunas lecturas (Scott W. Ambler, por ejemplo), no es buena idea usar como clave primaria cualquier dato que tenga que ver con las reglas de negocio. Pero sobre gustos...

Saludos
Responder Con Cita
  #6  
Antiguo 26-05-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Algún apunte más, aunque creo que ya te lo han comentado.

Los numéricos siempre son mejores como claves que los alfanuméricos.
Siempre puedes crearle un índice único por ese código, sin que sea clave primaria.
Asegúrate de que cumple condiciones de Pk o índice único.

No todos los códigos de barras lo cumplen. diferentes productos pueden tener el mismo cód. de barras (al menos en algunos campos) y el mismo artículo puede tener más de un código de barras.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 26-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Se debe utilizar un código que tu mismo generes basado en las necesidades del cliente. Este código es lo que se conoce como SKU (Stock Keeping Unit) y debe ser único para cada artículo y por supuesto puede tener ligados n número de códigos de barras siempre que sea exactamente el mismo artículo ya que los fabricantes a veces cambian sus códigos cuando cambian la presentación, el empaque o la fórmula de sus productos. Para el caso de los supermercados por lo regular los SKUs se dividen en departamentos y el código puede contener el número del mismo.

Por ejemplo tenemos los siguientes departamentos con sus códigos:

Abarrotes 92
Químicos del Hogar 13
Salud y Belleza 02..

Entonces los SKus de abarrates podrían empezar con 92 seguido del número de cifras que requieras según tu estimación de stock (92000 al 92999 por ejemplo).

Asi en todo momento puedes identificar a que departamento pertenece un artículo solo sabiendo su SKU, además te puede servir para poder dar de alta y vender artículos que de origen no traen código de barras, dicho código lo puedes generar tu mismo.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #8  
Antiguo 26-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias a todos por responder,

Si, ya lo aplique como decis

Código SQL [-]
CREATE TABLE PRODUCTOS
(
  ID_PRODUCTO Integer NOT NULL,
  CODIGOPRODUCTO Varchar(20) CHARACTER SET UNICODE_FSS,
  NOMBREPRODUCTO Varchar(50) CHARACTER SET UNICODE_FSS,
  ID_FAMILIA Integer,
  ID_SUBFAMILIA Integer,
  PRIMARY KEY (ID_PRODUCTO)
);

Código SQL [-]
ALTER TABLE PRODUCTOS ADD
  FOREIGN KEY (ID_FAMILIA) REFERENCES FAMILIAS (ID_FAMILIA);
ALTER TABLE PRODUCTOS ADD
  FOREIGN KEY (ID_SUBFAMILIA) REFERENCES SUBFAMILIA (ID_SUBFAMILIA);
CREATE UNIQUE INDEX IDX_PRODUCTOS1 ON PRODUCTOS (CODIGOPRODUCTO);

Bueno eso lo he sacado del flamerobin de lo que ya hice.

La tabla de ventas y detalleventas quedaria asi, no se si esta bien.

Código SQL [-]
CREATE TABLE ventas
(
id_venta integer not null,
fecha date,
primary key (id_venta)
);

Código SQL [-]
CREATE TABLE detalleventa
(
id_ventadetalle integer not null,
id_venta integer,
id_producto integer,
cantidad smallint,
primary key (id_ventadetalle),
foreign key (id_venta) references ventas (id_venta),
foreign key (id_producto) references PRODUCTOS (id_producto)
);

Aprovechando la pregunta .

Gracias.
Responder Con Cita
  #9  
Antiguo 26-05-2014
Avatar de newtron
[newtron] newtron is online now
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.469
Poder: 21
newtron Va camino a la fama
Hola.

O yo no me he enterado o no has pillado bien la idea.

Lo que te comentamos es que tengas dos tablas independientemente de las tablas de ventas, una para la tabla de artículos y otra tabla para almacenar los distintos códigos de barras que pueda tener cada uno de ellos.

por ejemplo:

ARTICULOS
========
CODIGO DESCRIPCION
010001 LIMPIADOR TAL
010002 LIMPIADOR CUAL
010003 LIMPIADOR PASCUAL

ARTIBARRAS
=========
CODIGO ARTICULO
010001 010001
0841243564879 010001
010002 010002
0842564564124 010002
010003 010003
0846456564564 010003
0844565458454 010003

Este es un ejemplo de una tabla de artículos con tres artículos creados. Deberías de tener una ventana en la tabla de artículos en la que se puedan introducir los códigos de barras asociados al mismo con lo cual al grabar el artículo en la tabla ARTICULOS estarías grabando al mismo tiempo en la tabla ARTIBARRAS un registro con el código interno del artículo repetido en los campos CODIGO y ARTICULO y otro más por cada uno de los posibles códigos de barras apuntando igualmente al código interno del artículo.

En el proceso de venta, cuando leas un código de barras deberás ir a la tabla ARTIBARRAS y buscar ese código de barras en el que te encontrarás el código interno del mismo en el campo ARTICULO para después buscar en la tabla de ARTICULOS por ese campo para poder leer los datos que te interesen de ese registro.

El insertar un registro con el código de barras y el código interno repetidos es para poder comprar y vender ese artículo bien por el código de barras o por su código interno puesto que estarán los dos en la tabla y podrás localizarlo por uno u otro.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #10  
Antiguo 26-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias por responder y tenedme paciencia porque me lio solo .


Entonces, si entiendo bien, a las tablas que ya he creado, tan solo tengo que crear una mas
Código SQL [-]
CREATE TABLE Codigobarras
(
id_barras integer not null
codigoproducto varchar(20),
id_producto integer,
primary key (id_barras),
foreign key (id_producto) references productos (id_producto)
);

Y usar esta para localizar mas rapido?, porque lo que no veo que codigobarras lo uses como primarykey en artbarras.
Responder Con Cita
  #11  
Antiguo 28-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
No se si entendi bien entonces, en la tabla artibarras si puedo usar el codigo de barras como primary key?.

Gracias y perdon por no entenderlo
Responder Con Cita
  #12  
Antiguo 28-05-2014
Avatar de newtron
[newtron] newtron is online now
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.469
Poder: 21
newtron Va camino a la fama
Hola de nuevo.

La idea de usar una nueva tabla para los códigos es para que pueda guardar distintos códigos de barras por un único artículo, ya de paso, y si quieres, puedes poner el campo de código de barras como primary key.

Si te haces la idea, de esta manera podrás guardar en esa nueva tabla un número ilimitado de distintos códigos de barras para un único artículo lo cual te solucionará el problema de tener solo un código de barras asignado por cada artículo.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #13  
Antiguo 28-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Además de todo lo comentado, es una mala idea poner como primary key un código de barras porque muchas empresas, para ahorrar costes, usan el mismo código para distintos artículos.
Responder Con Cita
  #14  
Antiguo 28-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias a todos.

Lo de tener un mismo codigo de barras para diferentes productos, estaba pensando que, en un supermercado, los productos llevan el codigo de barras ya directamente de fabrica, al pasarlos por el escaner sale ese producto y la cajera no tiene que hacer mas.

Lo que me comentais, ya independientemente de que me quedo claro que no voy a usar el codigobarras como clave primaria (Gracias), en esos casos que sea el mismo codigo de barras, imagino que salga una lista en pantalla con los productos asociados para que elijas el que te interesa si es correcto?.

Perdonad que sea un poco obtuso .
Responder Con Cita
  #15  
Antiguo 28-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tienes la tabla de artículos con los campos:
Código SQL [-]
id integer not null primary key autoincrement
descripcion varchar.....
etc.
Y ahora tienes una tabla de códigos de artículos:
Código SQL [-]
id integer not null primary key autoincrement
id_articulo   /* este es el id en la tabla de artículos */
codigo varchar(...     /* este sería el código, así puedes tener varios códigos para un mismo artículo */
...
Puedes tener un índice único compuesto id_articulo + codigo (así no habría repeticiones para un mismo artículo y sí podrían haber otros artículos con un mismo código )

En las búsquedas, cuando el usuario teclea un código o lo lee mediante un lector de códigos de barras, tú buscas el código en esta segunda tabla y entonces coges el id_articulo que te indicará a qué artículo de la tabla artículos pertenece.
Responder Con Cita
  #16  
Antiguo 28-05-2014
Avatar de newtron
[newtron] newtron is online now
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.469
Poder: 21
newtron Va camino a la fama
A ver.....

Creo que nos estamos perdiendo un poco.

Un código de barras JAMÁS debe de estar duplicado con el de otro artículo, en ese caso perdería toda su utilidad. El código de barras debe de identificar a un único artículo para que al leerlo se posicione de forma automática en el artículo determinado sin necesidad de intervención alguna por parte del operario.

Lo que si es posible, como ya he intentado explicar varias veces, es que un artículo pueda tener distintos códigos de barras y que al leer uno u otro busquen el mismo artículo.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #17  
Antiguo 28-05-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por newtron Ver Mensaje
Un código de barras JAMÁS debe de estar duplicado con el de otro artículo, en ese caso perdería toda su utilidad.
Money is money, así que si una lata de sopa cuesta lo mismo que un crema para afeitar, pues podemos usar el mismo código, ¿que no?

// Saludos
Responder Con Cita
  #18  
Antiguo 28-05-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por newtron Ver Mensaje
Un código de barras JAMÁS debe de estar duplicado con el de otro artículo, en ese caso perdería toda su utilidad. El código de barras debe de identificar a un único artículo para que al leerlo se posicione de forma automática en el artículo determinado sin necesidad de intervención alguna por parte del operario.
Aunque en teoría esa afirmación es correcta, en la práctica no siempre se cumple.
Para obtener un código de barras se debe "pagar" un dinero (cómo no), así que hay empresas que asignan sus propios códigos de barras de forma no-estandard.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #19  
Antiguo 28-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias por las aportaciones, me estan sirviendo de mucho.

Si bien decis que no se puede duplicar un codigo de barras y aun que asi fuera por lo que comenta Neftali, puede que si haya duplicados, cuando escaneas el codigo de barras de una lata de sopa, por ejemplo, si ese codigo esta asignado a mas de un producto, solo tendria que salir en pantalla para elegir cual es.

De la otra forma, varios codigos de barras para un solo producto, ahi como decis, es transparente para el usuario porque ya estan registrados.

en ultima instancia, si queremos evitarnos todo esto, generariamos nosotros mismos nuestro propios codigos de barras, pero no es la cuestion.

Gracias de nuevo.
Responder Con Cita
  #20  
Antiguo 28-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Realmente sí que hay artículos con códigos de barras iguales, los mismos códigos, porque la empresa no se ha querido hacer el gasto en otro o porque reutilizan un código de un artículo que ya está obsoleto y no lo venden. Lo he visto muchas veces y con empresas "famosas". Pero eso solamente suele ocurrir en productos de una misma empresa.
Si 2 artículos tienen el mismo código, pues tendrás que mostrarlos para que el usuario seleccione el que sea. O mejor todavía, al darlo de alta deberías de haber comprobado que no existía. Si ya existe entonces deberías crear un código propio para ese artículo y sacar las etiquetas para pegarlas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Cómo "sacar" la existencia de un producto? Yare SQL 11 22-02-2013 23:28:24
Consultar el campo precio mediante el codigo de un producto GABOCABALLERO Conexión con bases de datos 6 17-10-2010 17:30:55
¿Cómo definir un "primary key" en tiempo de ejecución? SMTZ .NET 1 21-12-2005 19:43:00
primary key AMO SQL 7 14-02-2004 20:50:05
Primary Key y Unique Key DrMatasanos Conexión con bases de datos 1 21-05-2003 11:01:20


La franja horaria es GMT +2. Ahora son las 12:52:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi