Ir al contenido


Foto

Recuperar valor de Campo Aggregate en ClientDatset


  • Por favor identifícate para responder
5 respuestas en este tema

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 20 febrero 2012 - 05:31

Si quiero recuperar el valor de un campo aggregate con un .AsFloat me da un error que no me permite accesar el campo como un Float, esto debe ser realizado por .Value, el problema esta que si el campo en cuestion no tienen valores me da una Exception, lo resolvi de la siguiente manera,

   

delphi
  1. if not Modulo.cdsPropinasTotal.IsNull then
  2.         nPropina := Modulo.cdsPropinasTotal.Value
  3.     else
  4.           nPropina := 0;



El asunto esta que cuando hay mas de dos registros IsNull me lo devuelve verdadero, por los momentos lo solucione asi:



delphi
  1. try
  2.         nPropina := Modulo.cdsPropinasTotal.Value
  3.     except
  4.           nPropina := 0;
  5.     end;



Quisiera saber si hay alguna otra manera o estoy obviando algo...
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 20 febrero 2012 - 05:48

Saludos.

No he tenido ese problema con los aggregate, prueba utilizando VarIsNull.
  • 0

#3 luisgutierrezb

luisgutierrezb

    Advanced Member

  • Miembros
  • PipPipPip
  • 92 mensajes
  • LocationMéxico

Escrito 20 febrero 2012 - 06:42

Porque no intentas ponerle el formato al campo de 0.00, y usas la propiedad DisplayValue en lugar de value solamente
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 febrero 2012 - 08:08

Se me ocurre que agregues al TClientDataset un campo calculado, que tome el valor del campo o la expresión  en cuestión, asignándole  cero cuando el valor del campo o expresión sea nulo, entonces luego le pasas al campo agregate la sumatoria del campo calculado.



delphi
  1. procedure TDatos.TUClientDatasetCalcFields(DataSet: TDataSet);
  2. begin
  3.   if CapoEnCuestion.IsNull  then
  4.     CampoCalculado.AsFloat := 0 else
  5.   CampoCalculado.AsFloat := CampoEnCuestion.AsFloat;
  6. end;



Luego la propiedad expression del campo agregate sería: SUM(CampoCalculado);

Saludos
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 21 febrero 2012 - 05:01

Si quiero recuperar el valor de un campo aggregate con un .AsFloat me da un error que no me permite accesar el campo como un Float, esto debe ser realizado por .Value, el problema esta que si el campo en cuestion no tienen valores me da una Exception, lo resolvi de la siguiente manera,

   

delphi
  1. if not Modulo.cdsPropinasTotal.IsNull then
  2.         nPropina := Modulo.cdsPropinasTotal.Value
  3.     else
  4.           nPropina := 0;



El asunto esta que cuando hay mas de dos registros IsNull me lo devuelve verdadero, por los momentos lo solucione asi:



delphi
  1. try
  2.         nPropina := Modulo.cdsPropinasTotal.Value
  3.     except
  4.           nPropina := 0;
  5.     end;



Quisiera saber si hay alguna otra manera o estoy obviando algo...


Es un bug de Delphi que lleva muchísimos años (yo creo que es por culpa de las famosas interfaces, debe tener declarada una interface de tipo TFloatField, o similar, pero no debe estar totalmente implementada).

Personalmente me declaro una función genérica Num_NoNulo, y en lugar de recuperar el campo con MiCampo.AsFloat, lo hago con Num_NoNulo(MiCampo.Value).

La definición de esa función, es lo que ya has hecho :



delphi
  1. function Num_NoNulo(Numero: Variant): Double;
  2. begin
  3.   try
  4.     Result := Numero;
  5.   except
  6.     Result := 0;
  7.   end;
  8. end;



Así que tu código pasa a ser :



delphi
  1.   nPropina := Rutinas.Num_NoNulo(Modulo.cdsPropinasTotal.Value);



Saludos.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 21 febrero 2012 - 06:03

Gracias a todos por responder, al final con VarIsNull y DisplayValue me seguia dando el mismo problema, y con respecto al campocalculado igual, ya que de los registros cuando sucede el problema ninguno es Null

Por los momentos entonces la solucion es esperar la excepcion para capturarla.
  • 0




IP.Board spam blocked by CleanTalk.