Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-04-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 05-04-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 05-04-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
Hola ecfisa!

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

Saludos.
Responder Con Cita
  #4  
Antiguo 05-04-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 06-04-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
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!

Última edición por sisne fecha: 06-04-2010 a las 00:31:14.
Responder Con Cita
  #6  
Antiguo 06-04-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 06-04-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por sisne Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 10-04-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
Holas! Gracias por la ayuda!
Respecto a el funcionamiento de los indices en la base de datos pues no tengo conocimiento.
Gracias!
Responder Con Cita
  #9  
Antiguo 11-04-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por sisne Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Valores previos únicos en controles data-aware gorsan Conexión con bases de datos 7 21-03-2008 18:54:43
Introducir Objetos en una DLL Delar Varios 0 10-10-2006 19:39:07
Como introducir los campos en en reporte de FreeReport Goyo Impresión 1 30-09-2006 00:39:59
Distincion de mayusculas en campos unicos xerkan Firebird e Interbase 4 01-09-2004 18:45:46
Valores unicos en tablas mySQL jmselesan MySQL 1 05-08-2003 16:26:48


La franja horaria es GMT +2. Ahora son las 18:58:52.


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
Copyright 1996-2007 Club Delphi