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)
-   -   ABM,como validar que no se ingrese un codigo existente a mi BD (https://www.clubdelphi.com/foros/showthread.php?t=68352)

juliana_r 09-06-2010 01:33:25

ABM,como validar que no se ingrese un codigo existente a mi BD
 
Estoy haciendo un ABM sencillo donde tengo una base de datos que contiene una tabla llamada PRODUCTOS ( cuyos campos son codigo, descripcion, y stock) Cuando hago el alta lo que tengo que hacer es validar que NO quiera ingresar un producto NUEVO con un código existente.
Lo que me pasa a mi es que si ingreso un codigo (a traves de un edit que esta asociado a una variable) que ya existe en la base de datos, me lo graba igual (osea me quedan 2 productos con el mismo codigo)
No se como validar que no se ingrese un codigo existente.

Estoy usando delphi 7 y SQL server 2000, y me conecte con el adoconnectio y el adodataset.

Perdon soy nueva en esto!!!

Casimiro Notevi 09-06-2010 02:27:19

Si tienes, por ejemplo, una tabla de productos y no quieres que se repitan, deberás indicar en la base de datos que el campo "referencia" o "código" (el que necesites) sea clave de esa tabla, así no permitirá datos repetidos.
Si es un campo que no es clave, entonces la única solución que queda es buscar si existe.
Normalmente en estos procesos se usa el siguiente esquema:

El usuario escribe un código, buscamos si ya existe, si no existe entonces lo damos de alta, si ya existe entonces presentamos el mismo para que el usuario lo edite.

Como ves, de esa forma no es posible insertar repetidos.

Caral 09-06-2010 02:33:45

Hola
Código Delphi [-]
   AQTemp.SQL.Text := 'Select Codigo From PRODUCTOS '+
                      'where  Codigo = :cod ';
   AQTemp.Params[0].Value:= Edit1.Text;
   AQTemp.Open;
 If AQTemp.RecordCount > 0 then
   begin
      MessageDlg('Código ya existe.',mtError,[mbOK],0);
      Edit1.SetFocus;
   end
Saludos

roman 09-06-2010 03:52:51

Como comenta Casimiro, el campo código debe ser una llave única para que el mismo motor de datos asegure que no haya duplicados. Ahora bien, una vez salvado este paso tienes dos opciones: una, la que comenta Caral, en la que verificas de antemano que el código exista. Otra, es dejarlo en manos del motor, esperando a que éste genere un error al intentar insertar un código duplicado. En este camino, tienes que manejar el evento OnPostError del DataSet si quieres hacer un manejo especial del error (por ejemplo, mandar un mensaje personalizado o permitir que reintente la inserción cambiando el código).

// Saludos

marcoszorrilla 09-06-2010 06:54:58

Creo que la mejor opción es en el evento al salir "on Exit", del control que no va admitir claves duplicadas darle un mensaje al usuario, de lo contrario nos podemos encontrar una pantalla con 30 campos y después de cumplimentar los 30 resulta que nos dice que ese "cliente" ya existe.

Un Saludo.

ContraVeneno 09-06-2010 20:35:41

discúlpame maese Marcos, pero la mejor opción sin lugar a duda, es crear la llave primaria en la base de datos, o de perdido un índice único, tal y como mencionan casimiro y Roman.

roman 09-06-2010 20:37:20

Creo que Marcos es consciente de eso. Él se refiere simplemente al momento de hacer la validación: antes o después de rellenar los campos.

// Saludos

marcoszorrilla 09-06-2010 21:39:33

Contra, efectivamente es como dice Román, la Tabla tiene que tener siempre su clave primaria que evite repeticiones, lo que yo comento es para evitar que el usario despues de cumplimentar 20 cuadros de texto se encuentre con que el cliente.. ya existía.

Un Saludo.

AzidRain 09-06-2010 23:04:03

Lo mas simple y mas adecuado es dejar ese tipo de restricciones al motor y uno tomarlas en delphi para actuar en consecuencia, un mal diseño de una BD te va a llevar a un mal seguimiento en tu programa.

roman 10-06-2010 01:38:30

Cita:

Empezado por AzidRain (Mensaje 366782)
Lo mas simple y mas adecuado es dejar ese tipo de restricciones al motor y uno tomarlas en delphi para actuar en consecuencia, un mal diseño de una BD te va a llevar a un mal seguimiento en tu programa.

Me parece, estimado Azid, que ese punto ya está aclarado ;)

Cita:

Empezado por Casimiro Notevi (Mensaje 366657)
deberás indicar en la base de datos que el campo "referencia" o "código" (el que necesites) sea clave de esa tabla, así no permitirá datos repetidos.

Cita:

Empezado por roman (Mensaje 366662)
el campo código debe ser una llave única para que el mismo motor de datos asegure que no haya duplicados.

Cita:

Empezado por ContraVeneno (Mensaje 366760)
la mejor opción sin lugar a duda, es crear la llave primaria en la base de datos, o de perdido un índice único

Cita:

Empezado por marcoszorrilla (Mensaje 366771)
la Tabla tiene que tener siempre su clave primaria que evite repeticiones

// Saludos

ContraVeneno 10-06-2010 17:09:24

de cualquier manera, creo que lo mejor es crear una llave primaria.

Saludos.


La franja horaria es GMT +2. Ahora son las 15:22:41.

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