Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Evitar guardar duplicado (https://www.clubdelphi.com/foros/showthread.php?t=78546)

camiz 28-04-2012 03:05:44

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.

Caral 28-04-2012 03:52:46

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

AzidRain 28-04-2012 04:10:02

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

ecfisa 28-04-2012 05:05:52

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.

camiz 28-04-2012 05:15:04

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.

ecfisa 28-04-2012 06:20:04

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. :)

AzidRain 28-04-2012 21:16:40

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

camiz 04-05-2012 20:22:33

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.


La franja horaria es GMT +2. Ahora son las 19:34:28.

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