Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda sobre un Procedimiento Almacenado (https://www.clubdelphi.com/foros/showthread.php?t=6763)

Nuria 21-01-2004 11:20:56

Ayuda sobre un Procedimiento Almacenado
 
Hola a tod@s:

No sé si es aquí donde debo dejar mi mensaje, pero supongo que sí.

A ver si alguno me puede hechar un cable, por que no consigo que me funcione un Procedimiento Almacenado.

Trabajo con Delphi 7 y con Interbase 6.0. El procedimiento lo cree de la siguiente manera:

Código:

set term ^;
create procedure prvsoli2(exp integer)
returns (timp decimal(12,2))
as
begin
  select sum(imp) from expeprv
      where exp= :exp
    into :timp;
end ^
set term ;^

Bien, pues de delphi hago lo siguiente: Me he creado un objeto TIBStoredProc que lo tengo enlazado con mi base de datos y en la propiedad StoredProcName = prvsoli2. Luego cuando quiero que se ejecute este procedimiento lo hago de la siguiente manera:

Código:

// Llamo al procedimiento de Cálculo
    DM.IBP.ParamByName('EXP').AsInteger := StrToInt(idKey.Text);
    DM.IBP.ExecProc;
    showmessage(DM.IBP.FieldByName('TIMP').AsString);

Y no me devuelve ningún valor :( , cuando debería de devolver una cantidad ya que hay registros introducidos.

Prové el procedimiento en el SQL de IBConsole y tampoco me devuelve nada. Entonces lo siguiente que hice fue Instalarme Interbase Servidor que viene con Delphi, el 6.5. Prové el procedimiento en el IBConsole y me devolvía el valor, pero cuando lo pruebo en Delphi no va, sigue sin devolverme nada.

No sé que es lo que estoy haciendo mal, y no sé porque en Interbase 6.0 no funciona.

También me cree otro procedimiento parecido al anterior pero sin usar la instrucción SUM, por si fuera por eso pero nada tampoco me funcionaba.

Si alguien me puede dar una idea de por donde van los tiros...

kinobi 21-01-2004 11:25:11

Hola,

prueba a poner la siguiente línea antes de salir del procedimiento (antes del end ^)
Código:

  suspend;
Saludos

Nuria 21-01-2004 12:33:31

Gracias Kinobi!

He probado a poner el suspend y me funciona el procedimiento en el IBConsole :) con Interbase 6.0 y 6.5, pero en mi programa de Delphi no :( , no sé que es lo que puede estar mal, porque seguro que hay algo que no hago o que no es correcto, no sé si alguien me puede dar alguna pista.

Saludos!

kinobi 21-01-2004 12:40:55

Cita:

Empezado por Nuria
porque seguro que hay algo que no hago o que no es correcto,

seguro, pero también es seguro que no es algo en la parte del servidor (ya que una consulta en IBConsole da el resultado correcto). Conclusión: céntrate en el cliente, en tu aplicación.

De todas formas, ese AsString de ...

Código:

  DM.IBP.FieldByName('TIMP').AsString
puede estar haciendo mal la conversión del tipo InterBase DECIMAL(12,2) a String Delphi (yo no lo descartaría).

Saludos.

Nuria 21-01-2004 12:57:10

De nuevo gracias Kinobi por tu interes. ;)

Cita:

puede estar haciendo mal la conversión del tipo InterBase DECIMAL(12,2) a String Delphi (yo no lo descartaría).
Tenías razón que la conversión me la hacía mal, he cambiado mi código de está manera:

Código:

    if not DM.trPrv.InTransaction then
      DM.trPrv.StartTransaction;

    DM.IBP.ParamByName('EXP').AsInteger := StrToInt(idKey.Text);
    DM.IBP.ExecProc;
    DM.trPrv.Commit;
    Debe := DM.IBP.FieldByName('TIMP').AsFloat;

El valor que recoje Debe es 0, que no es el valor correcto que debe devolver el procedimiento :( . No sé por donde tirar. Seguiré investigando... Alguna sugercia más.

Saludos!

kinobi 21-01-2004 13:09:13

Cita:

Empezado por Nuria
Alguna sugercia más.

Sí, hace tiempo que estoy apartado de la programación Delphi, pero juraría que la línea ...

Código:

  Debe := DM.IBP.FieldByName('TIMP').AsFloat;
debería ser

Código:

  Debe := DM.IBP.ParamByName('TIMP').AsFloat;
Antes no me había dado cuenta.

Saludos

Nuria 21-01-2004 13:18:15

Diste en el clavo!! :D

No era FieldByName sino ParamByName, no había caído en eso,es de lógica(:timp), no es un campo sino un parámetro. Hay veces que lo tienes delante de las narices y no lo ves ...

Mil gracias. Te debo una :p

Saludos!


La franja horaria es GMT +2. Ahora son las 04:54:29.

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