Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 28-04-2012
camiz camiz is offline
Miembro
 
Registrado: ene 2012
Posts: 61
camiz Va por buen camino
Smile Evitar guardar duplicado

hola amigos del foro, nuevamente aqui necesitando de su ayuda.
tengo un problema y espero que me ayuden a resoverlo, les explico.

lo que quiero hacer es impedir que se guarde un dato duplicado en una tabla de mi base de datos. mi base de datos es FIREBIRD.



Código SQL [-]
CREATE TABLE REPUESTO
(
  CODREPUESTO Integer NOT NULL,
  FECHA Date,
  HORA Time,
  CODIGO Varchar(15) NOT NULL,
  PROVEEDOR Varchar(50),
  DESCRIPCION Varchar(50),
  CANTIDAD Integer,
  PRECIO_COMPRA Varchar(20),
  PRECIO_VENTA Varchar(20),
  FECHA_COMPRA Date,
  PRIMARY KEY (CODREPUESTO)
);




Lo que deseo es que el campo CODIGO no se repita con los caracteres, o mas claro que no se duplique, he estado probando con este codigo pero siento que falta algo mas, el codigo funciona en el primer registro pero si ingreso el mismo dato sin cerrar el formulario se duplica pero si cierro el formulario despues de cada registro si funciona, el formulario lo boy ha usar para dar de alta registros sin cerrarlo.[/color]
aqui el codigo:


Código Delphi [-]
 //utilizamos la función "locate" para realizar la búsqueda
    frmConeccion.Repuesto_vista_02.Locate('CODIGO', txt_arcodigo_repuesto.Text, []);
  if frmConeccion.Repuesto_vista_02CODIGO.Text = txt_arcodigo_repuesto.Text then
    begin
      Application.MessageBox('Este código ya existe, debe crear otro para este registro.', 'Mensaje del sistema', MB_ICONINFORMATION or MB_OK);
     Abort;
    end
  else
  begin
frmConeccion.Repuesto_save2.Post;
frmConeccion.Repuesto_save2.Refresh;



el codigo lo ejecuto desde el boton guardar, espero que me ayuden a mejorarlo u con otro codigo o enseñarme a crear un TRIG en la base de datos.

Última edición por camiz fecha: 28-04-2012 a las 02:14:41. Razón: agregar datos
Responder Con Cita
  #2  
Antiguo 28-04-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.629
Caral Va por buen camino
Hola
O commit o CommitRetaining.

Código Delphi [-]
//utilizamos la función "locate" para realizar la búsqueda
    frmConeccion.Repuesto_vista_02.Locate('CODIGO', txt_arcodigo_repuesto.Text, []);
  if frmConeccion.Repuesto_vista_02CODIGO.Text = txt_arcodigo_repuesto.Text then
    begin
      Application.MessageBox('Este código ya existe, debe crear otro para este registro.', 'Mensaje del sistema', MB_ICONINFORMATION or MB_OK);
     Abort;
    end
  else
  begin
frmConeccion.Repuesto_save2.Post;
frmConeccion.Repuesto_save2.commit; // esto
frmConeccion.Repuesto_save2.Refresh;

o

Código Delphi [-]
//utilizamos la función "locate" para realizar la búsqueda
    frmConeccion.Repuesto_vista_02.Locate('CODIGO', txt_arcodigo_repuesto.Text, []);
  if frmConeccion.Repuesto_vista_02CODIGO.Text = txt_arcodigo_repuesto.Text then
    begin
      Application.MessageBox('Este código ya existe, debe crear otro para este registro.', 'Mensaje del sistema', MB_ICONINFORMATION or MB_OK);
     Abort;
    end
  else
  begin
frmConeccion.Repuesto_save2.Post;
frmConeccion.Repuesto_save2.CommitRetaining; // esto
frmConeccion.Repuesto_save2.Refresh;

Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 28-04-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.841
AzidRain Va por buen camino
Seré curioso, en que se diferencian CODREPUESTO y CODIGO? Ya tienes definida una clave primaria (CODREPUESTO) lo que indica que no puede haber dos registros con el mismo CODREPUESTO. Si no quieres cambiarlo, basta crear un índice con la opción UNIQUE para el campo código y atrapar la excepción al momento de tratar de guardar el dato ya que de esa forma la propia BD no permitirá duplicados en ese campo
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 28-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 7.540
ecfisa Tiene un aura espectacularecfisa Tiene un aura espectacular
Hola.

Tal vez entendí mal el problema, pero como dice AzidRain... ¿ No te serviría hacer ?
Código SQL [-]
   ALTER TABLE REPUESTO ADD CONSTRAINT UK_CODIGO UNIQUE(CODIGO)

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 28-04-2012
camiz camiz is offline
Miembro
 
Registrado: ene 2012
Posts: 61
camiz Va por buen camino
a ver

a ver si me dejo entender.

mi tabla tiene una clave primaria que es CODREPUESTO, aparte de esto quiero crearle a cada articulo que doy de alta una identificacion unica que no se repita para mas adelante poder identificarle, el dato se va a guardar en CODIGO Varchar(15) NOT NULL, en este ultimo el dato o codigo se va a ingresar mediante un DBEdit de forma manual por ejm BBB001, es como un codigo de barras o un nombre que identifica a un articulo pero con la diferencia que este sera unico. por eso quiero crearle un codigo delphi para comprobar el texto del DBEdit con los que ya estan guardados en la tabla y si se repite salte el error y no haga nada.

Última edición por camiz fecha: 28-04-2012 a las 04:27:19.
Responder Con Cita
  #6  
Antiguo 28-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 7.540
ecfisa Tiene un aura espectacularecfisa Tiene un aura espectacular
Hola camiz.
Cita:
es como un codigo de barras o un nombre que identifica a un articulo pero con la diferencia que este sera unico. por eso quiero crearle un codigo delphi para comprobar el texto del DBEdit con los que ya estan guardados en la tabla y si se repite salte el error y no haga nada.
Por eso mismo... Lo que te sugiere AzidRain (y pienso del mismo modo) es que pongas la restricción de UNIQUE al campo CODIGO, de ese modo, cuando intenten ingresar en ese campo un dato ya existente, la base de datos lanzará una excepción que podrás capturar y actuar en consecuencia.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 28-04-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.841
AzidRain Va por buen camino
Yo creo que de entrada el diseño de la tabla está equivocado pues de acuerdo a lo que mencionas se obtiene que "No puede haber más de un registro con el mismo CODREPUESTO y el mismo CODIGO". Me huele a que CODREPUESTO es una clave artificial (un vil consecutivo u otro tipo) y CODIGO es la traducción a lenguaje "humano" de CODREPUESTO. Me parece que bastaría con que la tabla tenga como clave primaria una u otra. De acuerdo a tu caso CODREPUESTO es nuestra clave primaria y puede haber N registros que compartan el mismo CODREPUESTO pero difente CODIGO".

La pega viene cuando vemos que CODIGO al parecer puede ser capturado posteriormente a la creación del registro, por lo que en todo caso solo podría haber un solo registro en donde CONREPUESTO tenga valor y CODIGO sea nulo o en blanco.

Sería mejor que nos regresaras un poco hacia atrás en el modelado de tu tabla o bien el caso de uso, ya que es más sencillo de entender que es lo que necesitas en realidad
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #8  
Antiguo 04-05-2012
camiz camiz is offline
Miembro
 
Registrado: ene 2012
Posts: 61
camiz Va por buen camino
solucionado

gracias a todos por sus comentarios, lo que yo necesitaba que la aplicacion haga era que el texto o codigo que ingresaba en un Edit (txt_arcodigo_repuesto) al momento de crear un registro no se guarde repetido.

creo que lo he solucionado con este codigo delphi despues de tantas trasnochadas tengo este simple codigo pero que en mi aplicacion si funciona como lo deseaba, lo comparto quizas a alguien novato como yo lo necesite.

Código Delphi [-]
 
procedure TfrmAltaRepuestos.btn_arguardarClick(Sender: TObject);
//buscamos y comparamos el codigo del TDBEdit
   if (frmConeccion.Repuesto_vista_02.Locate('CODIGO', txt_arcodigo_repuesto.Text, [])) and (frmConeccion.Repuesto_vista_02CODIGO.Text = txt_arcodigo_repuesto.Text) then
    begin
   Application.MessageBox('Este código ya existe, debe crear otro para este artìculo.', 'Mensaje', MB_ICONSTOP or MB_OK);
  txt_arcodigo_repuesto.SetFocus;
  Abort;
   end
      else
   begin
frmConeccion.Repuesto_save2.Post;
end

he probado con muchos codigos pero este es el que funciona
lo que hace es comparar el codigo que ya esta dado de alta o mas dicho guardado en la tabla con el de el DBEdit (txt_arcodigo_repuesto) que se esta ingresando y son iguales nos salta el error.
y cancela todo.

soy novato pero si a este codigo le falta algo es bueno su comentario.
Responder Con Cita
Respuesta


Herramientas
Desplegado

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
Servicio duplicado alapaco Varios 2 16-11-2009 19:51:18
Evitar guardar datos duplicados bigpeter80 Varios 16 29-11-2008 14:10:02
Form duplicado silviodp OOP 5 11-11-2008 18:33:57
Duplicado de tablas teclilla Tablas planas 2 20-02-2008 16:12:33
Registro Duplicado jmedina Conexión con bases de datos 0 17-11-2004 19:53:34


La franja horaria es GMT +2. Ahora son las 09:59:44.


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