1001234 Juan Perez...../Que no me permita ya que nombres y apellidos se repiten.
1234567 Juan Perez Matematicas MAT-100//Que no me permita por que se repiten las Materias con la sigla
1234567 Maria Cruz....// No permita por que se repite el mismo CI almacenado antes en la Base de Datos.
Por si caso estoy usando como gestor de BD SQL Server, y programo en Delphi.
///(quizas..) algun componente que pueda facilitarme?
Gracias
Publicado:
Dom Abr 04, 2010 5:45 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Campos unicos al introducir
Anuncios
Para lo que nos comentas tienes dos opciones:
1. Crear un índice único en Microsoft SQL Server utilizando Microsoft SQL Server Management Studio (o cualquier otra aplicación que te permita ejecutar sentencias SQL en la base de datos SQL Server).
2. Realizar la comprobación de duplicidad "manualmente" mediante SQL antes de validar el registro.
La opción recomendable, más sencilla y más fiable es la primera. Creando un índice único para los campos que no quieras que se repitan, será suficiente. Porque si creas un índice único en SQL Server, al intentar guardar un registro en tu programa, si incumple el índice, dará error y no dejará guardar los cambios. En este caso será suficiente con capturar el error y mostrar uno personalizado del tipo "Existe otro registro con el mismo ...".
Te explico cómo crear un índice único en SQL Server, por si no sabes, es bastante sencillo. Te pongo un ejemplo:
Si tienes la tabla "factura", con el campo "numero" y este campo no es clave primaria, pero quieres que "numero" sea único y no se repita, será suficiente con ejecutar esta consulta SQL para hacer que el campo "numero" de la tabla "factura" sea índice único:
Código:
CREATE UNIQUE INDEX in_facturas_numero
ON [facturas] (numero)
Por supuesto también puedes hacerlo en modo gráfico con alguna herramienta que te permita acceder a Microsoft SQL Server, como la que incluye el propio SQL Server llamada "Microsoft SQL Server Management Studio".
Una vez que tengas creados los índices oportunos en la base de datos, desde tu aplicación ya no podrás insertar registros que incumplan estos índices. Dicho error es capturable en el evento "OnPostError" del TADOTable, puedes añadir un código como el siguiente, para personalizar el error que le aparecerá al usuario:
Código:
procedure tTableFacturaPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if e is EZDatabaseError then
begin
case EZDatabaseError(E).ErrorCode of
1062 : begin
MessageDlg ('Ya existe una factura con este número.',
mtWarning,[mbok],0);
end;
else
MessageDlg ('Se ha producido un error al intentar guardar el registro:' +
chr(13) + chr(13) + inttostr(EZDatabaseError(E).ErrorCode) +
' -> ' + E.Message, mtInformation,[mbok],0);
end;
Action := daAbort;
end;
end;
Sin duda, te volvemos a recomendar este método, pues es el más seguro.
El segundo método consiste en que tengas un TADOQuery para estas comprobaciones y, antes de hacer un "Post" (validación) en la tabla, compruebes mediante consultas SQL si existe un registro con el mismo " CI, NOmbres, Apellidos, MateriasProgramas, SiglaMateria" o lo que quieras. Pero este caso, como te decimos, se puede complicar pues, en el caso de una inserción (nuevo registro) no hay problema, pero en el caso de una modificación sí que tendrás que agregar nuevas comprobaciones. Este caso se puede hacer pero resulta más engorroso que el primero.
Publicado:
Lun Abr 05, 2010 8:30 am
Sizne Magnífico usuario
Registrado: Oct 16, 2006 Mensajes: 46
Asunto:
Hola Alonsojpd, tienes mucha razon!!!!!!! Analice la situacion y con ayuda coloque este codigo:
Código:
procedure TFmateria.NombreMExit(Sender: TObject);
var nombre: string;
begin
nombre := Fmateria.NombreM.Text;
Query1.Close;
Query1.SQL.Text := 'Select * From BDmateria where NombreM = '+QuotedStr(nombre);
Query1.Open;
if not Query1.IsEmpty then
begin
MessageDlg('Nombre materia existente',mtError,[mbOk],0);
Fmateria.NombreM.SetFocus;
Abort; // cancelar el ingreso
end;
end;
Solo que para que no exista error por el ELSE no se que podria colocar...o dejarlo asi..
Este caso es para campos unicos pero de pronto si no quisiera que no se repitan tres datos?
Ejemplo:
Juan Perez Pinto
Juan Lopez Pinto
Juan Perez Pinto// son tres datos y no tiene q ser valido
Me trabé ahi....
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A