Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Campos unicos al introducir (https://www.clubdelphi.com/foros/showthread.php?t=67193)

sisne 04-04-2010 20:37:18

Campos unicos al introducir
 
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

ecfisa 05-04-2010 01:21:57

Hola sisne.
No sé que componente usas para ingresar los datos, si es con un TEdit esto podría ser una opción:
Código:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  with IBQry do
  begin
    SQL.Text:= 'SELECT * FROM MISDATOS WHERE NOmbres = ' + QuotedStr(Edit1.Text);
    Open;
    if not IsEmpty then
    begin
      MessageDlg('NOMBRE EXISTENTE',mtError,[mbOk],0);
      //...
      //...
    end
  end
end;

Si lo que usas es un TDBEdit, podrías capturar el evento OnSetText del campo asociado
para verificar su existencia.
Código:

procedure TForm1.IBDSetNombreSetText(Sender: TField; const Text: String);
var
  Nombre: string;
begin
  Nombre:= Text;
  with IBQry do
  begin
    Close;
    SQL.Text:= 'SELECT * FROM MISDATOS WHERE NOmbres = '+QuotedStr(Nombre);
    Open;
    if not IsEmpty then
    begin
      MessageDlg('NOMBRE EXISTENTE',mtError,[mbOk],0);
      //...
      //...
    end
  end
end;

Esto deberías hacerlo para cada campo que quisieras comprobar.

Saludos.

sisne 05-04-2010 05:26:38

Hola ecfisa!

Gracias por el código, estoy usando DBEdit (con Base de datos SQL SERVER), voy a probar ok?

Saludos.

ecfisa 05-04-2010 09:06:41

Hola de nuevo sisne.
Sin darme cuenta dí por sentado unas líneas que si faltan te podrían complicar; amplio el código:

Código:

procedure TForm1.IBDSetNombreSetText(Sender: TField; const Text: String);
var
  Nombre: string;
begin
  Nombre:= Text;
  with IBQry do
  begin
    Close;
    SQL.Text:= 'SELECT * FROM MISDATOS WHERE NOmbres = '+QuotedStr(Nombre);
    Open;
    if not IsEmpty then
    begin
      MessageDlg('NOMBRE EXISTENTE',mtError,[mbOk],0);
      //...
      //...
      Abort; // Cancelar el ingreso
    end
    else
      TField(Sender).Value:= Nombre; // Restaurar el valor ingresado
  end
end;

Saludos.

sisne 06-04-2010 00:26:26

Hola ecfisa, gracias por tu ayuda. Olvide mencionar que estoy usando Query o ADOQuery y pues...
Mi codigo es este:
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
  else
    //TField(Sender).Value:= Nombre; // Restaurar el valor ingresado
end;

En la ultima parte:
Código:

    end
    else
      TField(Sender).Value:= Nombre; // Restaurar el valor ingresado
  end
end;

Colocas ese codigo, y en mi caso como uso Query y no envia un Tfield como es de los IBQry.
Podrias aclararme por favor? Que tendria que colocar?

El Codigo es perfecto para campos unicos, pero si quisiera que tres campos iguales no se introzcan en una Base de Datos?
Ejemplo:
Juan Perez Flores//valido
Rosa Perez Cruz//Valido
Juan Perez Flores // puede haber el caso de que de pronto este repitiendo los mismos datos con el mismo nombre y apellidos (no valido)
Jose Perez Flores// esto es valido

Gracias!

ecfisa 06-04-2010 05:12:42

Hola sisne.

No me he topado con ADO todavía, así que te pido disculpas si no puedo ayudarte todo lo que desearía.

Te explico el porqué de esas líneas, para que las adaptes y quizá ni te hagan falta

El Abort es una excepción silenciosa y no depende de la base de datos que estes usando, es sólo para cancelar el ingreso si el dato ya existe.

En cuanto a la otra línea sólo es necesaria para restaurar el valor del parámetro Text del evento OnSetText.

Pero como veo que estás usando la comprobación en el evento OnExit del DBEDit su uso, no tiene ningún sentido en tu caso.

Saludos.

Neftali [Germán.Estévez] 06-04-2010 11:14:41

Cita:

Empezado por sisne (Mensaje 359195)
Quisiera saber como tengo que realizar el codigo para que no me permita introducir informacion duplicada, siendo estos campos NO llaves.

¿Porqué no utilizas índices en la Base de Datos? Será más eficiente que cualquier código que añadas a tu programa.

sisne 10-04-2010 23:01:04

Holas! Gracias por la ayuda!
Respecto a el funcionamiento de los indices en la base de datos pues no tengo conocimiento.
Gracias!

Neftali [Germán.Estévez] 11-04-2010 19:10:48

Cita:

Empezado por sisne (Mensaje 359927)
Holas! Gracias por la ayuda!
Respecto a el funcionamiento de los indices en la base de datos pues no tengo conocimiento.
Gracias!


Pues deberías revisarlo ya que creo que te puede ser útil.
Pudes definir un índice ÚNICO por uno o varios campos y la Base de Datos se encargará de que no introduzcas información duplicada segun el índice definido.
Te evitarás tener que hacer nada más.


La franja horaria es GMT +2. Ahora son las 06:48:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi