Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Usuario
· Wiki

Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Campos unicos al introducir
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Campos unicos al introducir

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
Sizne
Magnífico usuario


Registrado: Oct 16, 2006
Mensajes: 46

Asunto: Campos unicos al introducir Responder citando

Holas!



Quisiera saber como tengo que realizar el codigo para que no me permita introducir informacion duplicada, siendo estos campos NO llaves.

Ejemlo tengo CI, NOmbres, Apellidos, MateriasProgramas, SiglaMateria, etc

1234567 Juan Perez Matematicas MAT-100

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
MensajePublicado:
Dom Abr 04, 2010 5:45 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Campos unicos al introducir Responder citando



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.
MensajePublicado:
Lun Abr 05, 2010 8:30 am
Top of PageVer perfil de usuario
Sizne
Magnífico usuario


Registrado: Oct 16, 2006
Mensajes: 46

Asunto: Responder citando

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.... icon_sad.gif

Gracias como siempre estas ahi.
MensajePublicado:
Lun Abr 05, 2010 9:42 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  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