Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-11-2009
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
Ayuda con una busqueda

Cordial saludo

Estoy trabajando en D2007 y usando Firebird 2.1, como sistema de conexión de la base de datos estamos usado IBX (IBDatabase, IBTransaction, IbDataset y un DataSource). Creamos una Tabla pequeña para hacer los estudios de práctica usando un gestor de las tantos que recomiendan en las páginas quedando la estructura asi:

Código SQL [-]
CREATE TABLE "FAMILIA" 
(
  "IDENTIFICACION"   INTEGER NOT NULL,
  "NOMBRE"   VARCHAR(20) NOT NULL,
  "APELLIDOUNO"   VARCHAR(20) NOT NULL,
  "APELLIDODOS"   VARCHAR(20) NOT NULL
);

Hemos creado un procedimiento para capturar la información a esta tabla de manera manual o por software, sin usar un DBGrid, el cual me ha funcionado muy bien usando el siguiente codigo

Código Delphi [-]
procedure TFManual.Button2Click(Sender: TObject);
begin
  Datamodule1.IBDataSet1.Append; {para insertar datos al final}
  Datamodule1.IBDataSet1.FieldByName('IDENTIFICACION').AsInteger:=StrToInt(edit1.Text); {primer edit}
  Datamodule1.IBDataSet1.FieldByName('NOMBRE').AsString:=Edit2.Text;
  Datamodule1.IBDataSet1.FieldByName('APELLIDOUNO').AsString:=Edit3.Text;
  Datamodule1.IBDataSet1.FieldByName('APELLIDODOS').AsString:=Edit4.Text;
  Datamodule1.IBDataSet1.Post;
  Datamodule1.IBTransaction1.CommitRetaining;
  Edit1.Text:='';
  Edit2.Text:='';
  Edit3.Text:='';
  Edit4.Text:='';
  Edit1.SetFocus;
end;

Hasta el momento no hay problema, pero necesitamos que al ingresar el campo IDENTIFICACION, este sea unico, o en otras palabras, que busquemos el valor de este campo y si se encuentra, lo mostremos en pantalla para que no se repita.

Hemos tratado con este codigo usando un IBQuery, pero no se si lo estamos haciendo bien, o es la forma correcta de hacerlo, por eso solicito su colaboración para resolver esta duda.

El codigo que estamos usando es el siguiente

Código Delphi [-]
procedure TFBusqueda.Button2Click(Sender: TObject);
begin
  IBQ1.Close;
  IBQ1.open;
  IBQ1.Active;
  IBQ1.SQL.Add('SELECT * FROM FAMILIA WHERE IDENTIFICACION='+Edit1.Text);
  IBQ1.ExecSQL;
  if (IBQ1.RecordCount=0) then
  begin
    Application.MessageBox('No se encuentra el registro buscado','Mensaje de Busqueda',0);
    IBQ1.Close;
  end
  else begin
    Edit2.Text:=inttostr(IBQ1.FieldByName('IDENTIFICACION').AsInteger);
    Edit3.Text:=IBQ1.FieldByName('NOMBRE').AsString;
    Edit4.Text:=IBQ1.FieldByName('APELLIDOUNO').AsString;
    Edit5.Text:=IBQ1.FieldByName('APELLIDODOS').AsString;
    Edit1.Text:='';
    Edit1.SetFocus;
    IBQ1.Close;
  end;

De antemano gracias por su colaboración
Responder Con Cita
  #2  
Antiguo 16-11-2009
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.289
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
Si queréis que ese campo sea único, posiblemente deberíais definirlo como clave primaria o asignarle un índice único. Eso aseguraría la "unicidad" y aceleraría considerablemente las búsquedas.

En cuanto al código de búsqueda, te sobran el Active y el ExecSQL; Basta con que dejes el Open para recuperar el registro.
__________________
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
  #3  
Antiguo 16-11-2009
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Complementando lo que dice Neftali, en los componentes IBX ya no funciona de manera "tradicional" el RecordCount, de hecho para estos componentes esa propiedad tiene cero como valor default, tendrias que ejecutar la funcion FetchAll para que te de el numero de registros, pero esto puede ser altamente ineficiente en terminos de tiempo, para eso te recomendaria mejor una sentencia del tipo:
Código SQL [-]
Select count(ID) as Cuantos from Tabla where ID=:ID
Otra es como dice Neftali, agrega un indice unico y deja al manejerador y al mismo delphi te arroje el error causado por el intento de duplicar una llave.
Saludos.
__________________
Ya tengo Firma!
Responder Con Cita
  #4  
Antiguo 16-11-2009
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
Amigos les cuento que si coloco una llave primaria, solo recibire la interrupción del motor de bases de datos cuando haga el Commit, lo ideal es hacer la consulta antes de continuar con la captura de los datos.

Ya tengo la consulta de mi TBIquery, pero no se si el dato esta o no debido a que el RecorCount, siempre me da el valor por defecto que es cero


Agradeciendo de antemano
Responder Con Cita
  #5  
Antiguo 17-11-2009
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Cita:
Empezado por juanelo Ver Mensaje
Complementando lo que dice Neftali, en los componentes IBX ya no funciona de manera "tradicional" el RecordCount, de hecho para estos componentes esa propiedad tiene cero como valor default, tendrias que ejecutar la funcion FetchAll para que te de el numero de registros, pero esto puede ser altamente ineficiente en terminos de tiempo, para eso te recomendaria mejor una sentencia del tipo:
Código SQL [-]Select count(ID) as Cuantos from Tabla where ID=:ID

Otra es como dice Neftali, agrega un indice unico y deja al manejerador y al mismo delphi te arroje el error causado por el intento de duplicar una llave.
Saludos.
Cita:
Empezado por servicomp Ver Mensaje
Amigos les cuento que si coloco una llave primaria, solo recibire la interrupción del motor de bases de datos cuando haga el Commit, lo ideal es hacer la consulta antes de continuar con la captura de los datos.

Ya tengo la consulta de mi TBIquery, pero no se si el dato esta o no debido a que el RecorCount, siempre me da el valor por defecto que es cero


Agradeciendo de antemano
__________________
Ya tengo Firma!
Responder Con Cita
  #6  
Antiguo 17-11-2009
Luis F. Orjuela Luis F. Orjuela is offline
Miembro
 
Registrado: may 2003
Ubicación: Bogotá - Colombia
Posts: 68
Poder: 22
Luis F. Orjuela Va por buen camino
Smile

Hazlo así y me cuentas si te funciona.....

Código Delphi [-]
procedure TFBusqueda.Button2Click(Sender: TObject);
begin
  IBQ1.Close;
  IBQ1.Active;
  IBQ1.SQL.Add('SELECT * FROM FAMILIA WHERE IDENTIFICACION=:NIT');
  IBQ1.ParambyName('NIT').AsInteger:=StrtoInt(Edit1.Text);
  IBQ1.Open;
  IBQ1.ExecSQL;
  if (IBQ1.IsEmpty) then
  begin
    Application.MessageBox('No se encuentra el registro buscado','Mensaje de Busqueda',0);
    IBQ1.Close;
  end
  else begin
    Edit2.Text:=inttostr(IBQ1.FieldByName('IDENTIFICACION').AsInteger);
    Edit3.Text:=IBQ1.FieldByName('NOMBRE').AsString;
    Edit4.Text:=IBQ1.FieldByName('APELLIDOUNO').AsString;
    Edit5.Text:=IBQ1.FieldByName('APELLIDODOS').AsString;
    Edit1.Text:='';
    Edit1.SetFocus;
    IBQ1.Close;
  end;

Descripción de las siguientes instrucciones:
IBQ1.SQL.Add('SELECT * FROM FAMILIA WHERE IDENTIFICACION=:NIT');
:NIT (Es la forma en que se pasa un parámetro a un script SQL.

IBQ1.ParambyName('NIT').AsInteger:=StrtoInt(Edit1.Text);
En este punto es donde se pasa el valor al parámetro, y como el campo 'IDENTIFICACION' está definido como INTEGER, pués así es la forma, y claro, debemos hacer un cast a tu Edit1.Tex, es decir, convertirlo en entero.

Y por último :
if (IBQ1.IsEmpty) then

Se está preguntando que si la consulta anterior es vacía, en tal caso muestras tu mensaje o de lo contrario das de alta tu nuevo registro.


Un caluroso saludo..
__________________
Ing. LUIS FERNANDO ORJUELA
BOGOTA - COLOMBIA
Responder Con Cita
  #7  
Antiguo 17-11-2009
Luis F. Orjuela Luis F. Orjuela is offline
Miembro
 
Registrado: may 2003
Ubicación: Bogotá - Colombia
Posts: 68
Poder: 22
Luis F. Orjuela Va por buen camino
Quítale la instrucción:

IBQ1.ExecSQL;

Pues sobra....
__________________
Ing. LUIS FERNANDO ORJUELA
BOGOTA - COLOMBIA
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
Ayuda en una busqueda.... manueltp Varios 1 17-01-2009 00:04:41
Ayuda en busqueda con SQL! rod203 SQL 3 28-04-2008 20:25:30
Problema con Búsqueda SQL Ayuda!!!!!!!!!:( lKinGl SQL 3 21-03-2008 21:32:16
Ayuda con la busqueda en una tabla mjjj Conexión con bases de datos 5 02-04-2007 23:48:12
¿Alguien me ayuda con la busqueda? sergiotur Tablas planas 3 06-03-2007 20:52:34


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


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