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 25-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
mensaje de error al hacer consulta sql sin resultados

Hola a todos,

Con delphi6 e interbase7, dialect3.

Tengo una aplicación, en la que, entre otras cosas, realizo varias consulta.

Una de ellas, es una busqueda.

Tengo un TEdit, en el que inserto lo que quiero buscar, y al pulsar un botón de "Buscar", me ejecuta una consulta sql, donde lo que he escrito, se busca en el campo correspondiente, usando un where field like 'TEdit.text%'

Todo esto me funciona OK, mientras lo que escriba en el Tedit se encuentra en ese campo realmente, No así, cuando en respuesta a esta consulta, no hay registros resultantes.

En cuyo caso, me devuelve un mensaje de error.

Sé que hay una manera de manipular los mensajes de error que resultan, y me gustaría saber como se hace esto, para poner algún mensaje algo más claro, en lugar del que se muestra.

Muchas gracias,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 25-09-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
if query1.IsEmpty then
bla....bla..


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 29-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Gracias marcoszorrilla,

pero, ¿no hay un modo de modificar o gestionar los mensajes de error resultantes? Creo recordar haber visto en algún sitio algo así, usando el try ... expect.

¿Donde pongo ese procedure? Quiero decir, si lo pongo en la tabla, en beforeopen, me abre el mensaje nada más abrir la tabla al inicio, pero no me evita que salga el error después de mostrar mi mensaje.

Gracias de nuevo,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 29-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
si lo que te da error es el Open del SQL prueba a hacer algo como

Código:
try
  Query.Open;
except
  on E: Exception do
  begin
    str := 'Error abriendo Query con el mensaje : ' + E.Message;
    Application.MessageBox(PChar(str), 'Atención', MB_OK);
  end;
end;
Te recomiendo que siempre saques el mensaje de error que da Delphi para así saber por qué "peta".

Si el error es porque la consulta está vacía y tu intentas seleccionar algún registro luego, utiliza lo que te muestra el amigo Marcos

Espero te sirva
Responder Con Cita
  #5  
Antiguo 29-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
El error que me aparece es:

Dynamic SQL Error
SQL error code=-104
Unexpected end of command

Como ya explique antes, me surge cuando ejecuto la consulta SQL y no encuetra registros que coincidan con los parámetros que le indico en un campo TEdit.

El problema es que si me sale este mensaje, se me cierra otra tabla, que está relaccionada con esta, aunque no tiene que ver nada en la consulta, por lo que necesito poder controlar el error.

Gracias por todo, a todos.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #6  
Antiguo 29-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Este error te da por una mala construcción en la sentencia SQL. Por eso te decía que siempre saques el error original de Delphi aunque lo pintes algo más bonito de la forma que te comentaba en el Post anterior. Si sólo hubieras sacado tu error personalizado, no te hubieras dado cuenta

Para verificar la sentencia SQL, te recomiendo mires lo que estás lanzando con un Query.SQL.SaveToFile('c:\lolo.txt'); (por ejemplo)
Responder Con Cita
  #7  
Antiguo 29-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,


Cita:
Este error te da por una mala construcción en la sentencia SQL

Pero, si es por una mala construcción en el SQL, ¿por que sólo me falla cuando no resultan registros de la busqueda?, esto es, cuando, por ejemplo aparece un espacio de algo que no tiene que tenerlo, o estoy buscando en un campo de text algo que comience por 'Mn' y no encuentra nada en la tabla que comience así.

En cualquier caso, este es el código que tengo para la busqueda:

//para, dependiendo del campo por el que vamos a querer que nos ordene la tabla
//así añadir el código

IF EditBuscar.Text = '' THEN BEGIN //Si no hay datos en el campo de texto para buscar
//Salimos del procedure
Exit;
ShowMessage ('No ha insertado parámetros de busqueda');
END
ELSE BEGIN //si hay parámetros de búsqueda
Try

FrmDModule.TbAlumnos.DisableControls;

FrmDModule.TbAlumnos.Close;

FrmDModule.TbAlumnos.SelectSQL.Clear;
//le asignamos el SQL que tenía al inicio la tabla
FrmDModule.TbAlumnos.SelectSQL.Add(FrmDModule.VAlumnosSQL);

// Dependiendo del campo en el que vayamos a buscar así hacemos la busqueda con un where = o un where like
IF (RCampo = 'NUMALU') THEN BEGIN //Los datos introducidos en el campo
//tienen que ser numéricos
//insertamos los parámetros de búsqueda en la sentencia selectSQL
FrmDModule.TbAlumnos.SelectSQL.Add('WHERE ' + RCampo + ' = ' + EditBuscar.Text );
//ordenamos por ...
FrmDModule.TbAlumnos.SelectSQL.Add( 'ORDER BY ' + RCampo);
//abrimos la tabla

END
ELSE BEGIN //buscamos en campos con texto
//insertamos los parámetros de búsqueda en la sentencia selectSQL
FrmDModule.TbAlumnos.SelectSQL.Add('WHERE ' + RCampo + ' LIKE ''' + EditBuscar.Text + '%'' ' );
//ordenamos por ...
FrmDModule.TbAlumnos.SelectSQL.Add( 'ORDER BY ' + RCampo);
//abrimos la tabla
END;
//una vez que se ha creado la consulta es cuando abrimos la tabla
FrmDModule.TbAlumnos.Open;


Finally

//volvemos a habilitar los controles de la tabla
FrmDModule.TbAlumnos.EnableControls;

End;
END;


Por cierto, ¿hay algún sitio donde me pueda documentar mejor sobre la manipulación de los errores?, vamos, para tener claro lo que implica el código que me has recomendado, y así poder manejarlo según mis necesidades.

Muchas gracias por la ayuda,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #8  
Antiguo 29-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Posteado originalmente por Giniromero
IF EditBuscar.Text = '' THEN BEGIN //Si no hay datos en el campo de texto para buscar
//Salimos del procedure
Exit;
ShowMessage ('No ha insertado parámetros de busqueda');
END
El mensaje núnca te aparecerá, ya que haces el Exit antes de mostrar el mensaje

Cita:
Posteado originalmente por Giniromero
FrmDModule.TbAlumnos.Open;
aquí deberías de poner el código que te he pasado. En lugar del Open, poner el

Código:
try
  Open
except
....
end;
El tema del control de errores suele salir en cualquier manual de Delphi y en la propia ayuda

Por cierto, has mirado qué sentencia SQL te está lanzando???

Espero te sirva
Responder Con Cita
  #9  
Antiguo 29-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

Cita:
Por cierto, has mirado qué sentencia SQL te está lanzando???
con esta no me da problemas,

select ALIASALU, APELALU, CCA, CCCALU, CODPALU, DOMIALU, EMAIL, FNACALU, INFORMALU, INFORMALU2, LASTUPDATE, NACIONAL, NIC, NIFALU, NOMAILALU, NOMALU, NOMCLAN, NUMALU, PAISALU, POBALU, PROFALU, PROVALU, RELAC, RUBRALU, SEXALU, TELFALU, TRATAMIE, TUTOR, VIAALU
from ALUMNOS

WHERE APELALU LIKE 'ROMERO BACHILLER%'
ORDER BY APELALU


Esta SI me da problemas:


select ALIASALU, APELALU, CCA, CCCALU, CODPALU, DOMIALU, EMAIL, FNACALU, INFORMALU, INFORMALU2, LASTUPDATE, NACIONAL, NIC, NIFALU, NOMAILALU, NOMALU, NOMCLAN, NUMALU, PAISALU, POBALU, PROFALU, PROVALU, RELAC, RUBRALU, SEXALU, TELFALU, TRATAMIE, TUTOR, VIAALU
from ALUMNOS

WHERE APELALU LIKE 'ROMERO BACHILLER %'
ORDER BY APELALU

No encuentra en el campo "Apelalu" nada que tenga ese texto, con un espacio detras... y da error


Cita:
El mensaje núnca te aparecerá, ya que haces el Exit antes de mostrar el mensaje
el exit está ahí puesto temporalmente. Se me olvidó borrarlo del código que os mandé.


Estoy echandole un vistazo al try ...except ..end; que me recomiendas, esto es lo que tengo:

try
FrmDModule.TbAlumnos.Open;
except
on E: Exception do begin
str := 'Error abriendo TbAlumnos con el mensaje : ' + E.Message;
Application.MessageBox(PChar(str), 'Atención', MB_OK);
end;
end;

Pero al checkear el código, antes de lanzarlo, me resulta el siguiente error en el delphi:

[Error] selealu.pas(169): '(' expected but ':=' found
[Error] selealu.pas(169): Incompatible types
[Error] selealu.pas(170): '(' expected but ')' found
[Error] selealu.pas(170): Incompatible types

Saludos, y gracias por la ayuda.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #10  
Antiguo 29-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
acabo de probarlo y, esto compila

Código:
var
   str : string;
begin
   try
      // lo que sea
   except
      on E: Exception do
      begin
         str := 'error abriendo Query con mensaje : ' + E.Message;
         Application.MessageBox(PChar(str), 'Atención', MB_OK);
      end;
   end;
end;
Respecto al SQL, he probado a lanzar un SQL con LIKE dentro del IB-Expert con y sin espacios y... el resultado ha sido el esperado. Prueba a lanzar estos SQLs desde fuera de Delphi a ver si te funcionan bien
Responder Con Cita
  #11  
Antiguo 30-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

Cita:
Respecto al SQL, he probado a lanzar un SQL con LIKE dentro del IB-Expert con y sin espacios y... el resultado ha sido el esperado. Prueba a lanzar estos SQLs desde fuera de Delphi a ver si te funcionan
Lo probé, y todo Ok.

También probé el código que me pasaste para el tema del mensaje de error, y efectivamente me funciona, pero tengo una duda al respecto:
¿Es necesario que el try ... expect afecte a todo el procedure? o podría aplicarlo, sólo a una parte, como hago con los try ...finally? l
Lo digo porque me funciona si incluye a todo el procedure, sino, no me funciona.
Es por saber si estoy haciendo algo mal yo.

Por cierto, que aunque pueda controlar el mensaje, tengo un problema, y es que cada vez que me aparece este mensaje, hay una tabla, que está ligada a la tabla alumnos, por el datesource, que tiene los comentarios que de estos hacemos, y que después de este mensaje de error, se me queda cerrada.

Esto me preocupa pues casi todas las tablas de mi aplicación tienen algún tipo de relacción con la de alumnos, y si se cierran cuando se escriban en la busqueda, datos de más, o nombres que no existen, va a darme muchos problemas.

Gracias por la ayuda, la agradezco sinceramente.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #12  
Antiguo 30-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Posteado originalmente por Giniromero
¿Es necesario que el try ... expect afecte a todo el procedure? o podría aplicarlo, sólo a una parte, como hago con los try ...finally? l
Lo digo porque me funciona si incluye a todo el procedure, sino, no me funciona.
En principio, sólo tendría que afectar a la linea donde haces el Open de la Query (a no ser que las otras lineas sean suceptibles de producir error)
Responder Con Cita
  #13  
Antiguo 30-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Gracias,

efectivamente estaba haciendo algo mal.

Le echaré un vistazo a la configuración de las tablas, a ver si encuentro el motivo por el que se me cierran las tablas vinculadas con la de alumnos, cuando me salta le famoso error.

Saludos,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
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


La franja horaria es GMT +2. Ahora son las 20:04:57.


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