PDA

Ver la Versión Completa : ABM,como validar que no se ingrese un codigo existente a mi BD


juliana_r
09-06-2010, 01:33:25
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

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
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 ;)

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.

el campo código debe ser una llave única para que el mismo motor de datos asegure que no haya duplicados.

la mejor opción sin lugar a duda, es crear la llave primaria en la base de datos, o de perdido un índice único

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.