Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-01-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Angry 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...
Responder Con Cita
  #2  
Antiguo 21-01-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

prueba a poner la siguiente línea antes de salir del procedimiento (antes del end ^)
Código:
  suspend;
Saludos
Responder Con Cita
  #3  
Antiguo 21-01-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
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!
Responder Con Cita
  #4  
Antiguo 21-01-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 21-01-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
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!
Responder Con Cita
  #6  
Antiguo 21-01-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 21-01-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Diste en el clavo!!

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

Saludos!
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 14:37:37.


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