Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error en OnCalcFields con valor retornado de un SELECT SUM() (https://www.clubdelphi.com/foros/showthread.php?t=36573)

Cabanyaler 17-10-2006 11:42:18

Error en OnCalcFields con valor retornado de un SELECT SUM()
 
Hola compañeros.
Antes de nada disculparme si este no es el lugar, pero creo que sí, ya que aunque el valor se elabore en un servidor SQL es retornado mediante conexion ADO al lado cliente. Si no es así, pues ná, me lo "empujais" a lugar. :o

Veamos:
Llebo todo el día de ayer con este error, y ya ando un tanto nervioso.

Que tengo
Tengo una consulta "ADOQ_Control_Comercial" que se ejecuta en el servidor sql y que retorna una serie de campos que muestro en el lado cliente en un componente DBGrid.
A esta consulta le he creado un campo calculado "ADOQ_Control_ComercialAcuValExt_Cal".
Si en el evento "OnCalcFields" al campo calculado le asigno valor, p.e.
Código Delphi [-]
DMInstalGas_2.ADOQ_Control_ComercialAcuValExt_Cal.Value :=  99,00;

se le asigna sin ningún tipo de problema y se muestra en el grid. (Es el modo en el que he venido haciéndo la asignación de valores en los campos calculados siempre), aunque evidentemente con operaciones de calculo más complejas.

La asignación que deseo realizar esta vez a este campo calculado es el valor devuelto por un Store procedure desde el servidor SQL que dice así:
Código Delphi [-]
/* Retorna el sumatori de totes les obres del contracte passat com a parametre a @CodCon_sp */
CREATE PROCEDURE AcumulaObrasPeriodofacturacionComercial 
@CodCon_sp  integer

AS
             SELECT SUM(Obras.TotImp_Obr)
  FROM Obras
  WHERE Obras.CodCon_Obr = @CodCon_sp
GO

Es decir, un valor, que si lo muestro con un "Showmessage", es el correcto, mostrándolo del siguiente modo:
Código Delphi [-]
IntToStr(DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.Fields[0].Value)

Que deseo
En el evento "OnCalcFields" asignar al campo calculado el valor retornado por ese "StoreProcedure", menos otro valor de un campo de la misma tabla.
Código Delphi [-]
procedure TDMInstalgas_2.ADOQ_Control_ComercialCalcFields(
  DataSet: TDataSet);
begin
   DMInstalGas_2.ADOQ_Control_ComercialAcuValExt_Cal.Value :=  DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.Fields[0].Value - DMInstalGas_2.ADOQ_Control_ComercialTotImp_Obr.Value;
end;

ERROR
Pero me dá el siguiente error en este último proceso :

Access violation at adress 004C436B in module "nombreprograma.exe". Read of address 00000000.

Y ya no se a donde encomendarme. Si me podeis ayudar.
Gracias. :o

Cabanyaler 17-10-2006 12:44:22

El error (como siempre) era mio.
 
Es así, como lo debo hacer:

Código Delphi [-]
procedure TDMInstalgas_2.ADOQ_Control_ComercialCalcFields(
  DataSet: TDataSet);
begin
     // Acumule al camp calculat el valor del sumatori de totes les obres deixe contracte
     DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.Close;
     DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.Parameters[1].Value := DMInstalGas_2.ADOQ_Control_ComercialCodCon_Obr.Value;
     DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.Open;
     DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.ExecProc;
     // Operació de la resta
     DMInstalGas_2.ADOQ_Control_ComercialAcuValExt_Cal.Value :=  DMInstalGas_2.ADOSP_AcumulaObrasPeriodoFacturacionComercial.Fields[0].Value - DMInstalGas_2.ADOQ_Control_ComercialTotImp_Obr.Value;
end;

Gracias a tod@s.
:D


La franja horaria es GMT +2. Ahora son las 00:58:51.

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