Si quitas la sentencia WHEN ANY DO SUSPEND de tu procedimiento, la parte donde tratas las excepciones te dirá cuál es la excepción que se ha generado.
Código Delphi
[-]
except
on e:exception do
begin
Showmessage(e.message);
Q1.Transaction.Rollback;
Q1.FreeHandle;
raise;
end;
end;
De todos modos, la filosofía de las excepciones es diferente a lo que parece que haces tu:
- Las excepciones hay que tratar de no utilizarlas.
- Consumen muchos recursos.
- Si salta una excepción hay que volver atrás todo lo que se ha hecho hasta entonces.
- Normalmente se puede evitar la excepción.
Por ejemplo:
Si tienes un procedimiento que divide dos valores, tienes dos opciones:
- Verificas con un if si el divisor es distinto de 0 antes de realizar la división y si es 0 muestras un mensaje de error.
- Realizas la división. Si salta la excepción la capturas y muestras un mensaje de error.
Supongo que lo mejor en tu caso (creo que estás insertando registros) es verificar si existe y sobrepasa un valor dado.
Código SQL
[-]
select sum(importe) from tabla where condiciones
into :importe;
if (importe<=VALOR_MAXIMO) then
begin
if (not exists(select importe from tabla where condiciones)) then
insert into tabla (campos) values (valores);
else
insert into tabla_errores (detalles) values ('YA EXISTE EL VALOR A INSERTAR');
end
else
insert into tabla_errores (detalles) values ('SE SUPERA EL IMPORTE');