PDA

Ver la Versión Completa : mensaje de error al hacer consulta sql sin resultados


Giniromero
25-09-2003, 17:28:46
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

marcoszorrilla
25-09-2003, 18:33:13
if query1.IsEmpty then
bla....bla..


Un Saludo.

Giniromero
29-09-2003, 10:01:57
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

__cadetill
29-09-2003, 10:13:41
si lo que te da error es el Open del SQL prueba a hacer algo como


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

Giniromero
29-09-2003, 10:15:05
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

__cadetill
29-09-2003, 10:19:34
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) :)

Giniromero
29-09-2003, 12:01:42
Hola,


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

__cadetill
29-09-2003, 12:50:38
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

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


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

Giniromero
29-09-2003, 13:30:22
Hola,

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


El mensaje núnca te aparecerá, ya que haces el Exit antes de mostrar el mensaje

:o el exit está ahí puesto temporalmente. Se me olvidó borrarlo del código que os mandé. :o


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

__cadetill
29-09-2003, 15:00:11
acabo de probarlo y, esto compila


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 :confused:

Giniromero
30-09-2003, 12:11:57
Hola,

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

__cadetill
30-09-2003, 13:26:05
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)

Giniromero
30-09-2003, 14:09:50
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