PDA

Ver la Versión Completa : Capturar excepción Firebird en app cliente


lucasarts_18
11-12-2010, 21:47:03
Estimados.

Me encuentro desarrollando unas validaciones mediante unos SP desde Firebird, ya que me permite controlar de manera más fácil las reglas de negocio.

Pongo acá un ejemplo.


begin
select saldo_clie,
monto_autorizado
from cliente
where id_cliente = :p_id_cliente
into :v_saldo, :v_monto_aut;
if (not v_monto_aut > 0) then
exception monto_no_aut;
if (not v_saldo >= p_monto) then
exception sobrepasa_saldo;
end


y desde delphi lo capturo de la siguiente forma.



begin
try
begin
if Edt_CCorriente.Text <> '' then
begin
ZSP_ValSaldoClie.ParamByName('p_id_cliente').AsInteger := f_IdCliente;
ZSP_ValSaldoClie.ParamByName('p_monto').AsInteger := StrToInt(Edt_CCorriente.Text);
ZSP_ValSaldoClie.ExecProc;
end;
if f_MontoPago <> 0 then
MessageDlg('Monto no cuadra con total documento', mtError, [mbOk], 0)
else
ModalResult := MrOk;
end
except on E: Exception do
MessageDlg(E.Message , mtError, [mbOk], 0);
end
end;




El problema que cuando lo muestro desde delphi me aparece la siguiente leyenda.


SQL Error: exception 14 SOBREPASA_SALDO !Sobrepasa saldo permitido de la Cta Corriente! At procedure 'SP_VAL_MONTOAUT'. Error Code: -836. exception The SQL: EXECUTE PROCEDURE SP_VAL_MONTOAUT(?,?);




Siendo que lo unico que quiero mostrar es "!Sobrepasa saldo permitido de la Cta Corriente!"

Existe la manera de manipular ese String que devuelve Firebird.?

Gracias...

Casimiro Notevi
11-12-2010, 22:08:00
Se me ocurre con una funtion más o menos así:



function FormateaTextoExcepcion (cCadena : string) : string;
var
i, l : integer;
begin
i := Pos('exception 1', cCadena);
l := length ('exception 1');
if i > 0 then
Result := Copy (cCadena, i+l+1, length(cCadena)-(i+l+1)+1)
else
Result := cCadena;
end;

lucasarts_18
17-12-2010, 14:41:01
Estimado Casimiro.

No había tenido tiempo de probar tu solución, maldita pega que me amarran a VB6, pero en fin, este proyecto es en delphi y y es otra cosa, veré como anda lo que me propones.

Gracias...

lucasarts_18
06-01-2011, 02:24:32
Estimado Casimiro:

He resuelto el tema modificando tu función.


function FormateaTextoExcepcion (cCadena : string) : string;
var
i, l, k : integer;
temp : String;
begin
i := Pos('exception 1', cCadena);
l := length ('exception 1');
if i > 0 then
begin
temp := Copy(cCadena, i+l+1, length(cCadena));
k := Pos ('At', temp);
Result := Copy(temp, 0, k - 1);
end
else
Result := cCadena;
end;



Ahora el mensaje lo muestra de la siguiente manera.

SOBREPASA_SALDO !Sobrepasa saldo permitido de la Cta Corriente!

Lo unico que me faltaría sería como sacar el nombre de la excepción SOBREPASA_SALDO, estoy intentando buscar un lógica de como sacar ese nombre, la idea es que me sirva para cualquier excepción que maneje desde Firebird.

Gracias casimiro :)