GARANTIR DESCONTO

Fórum Expression do AggregateField com campos calculados #291091

08/08/2005

0

Olá!

Criei em um ClientDataSet um campo Aggregate cuja expression é: SUM(VALDIFERENCA). O problema é que VALDIFERENCA é um campo calculado. Quando tento abrir o ClientDataSet ele avisa que não é possível utilizar campos calculados e que ao invés disso, deve-se usar campos ´fkInternalCalc´. Passei então o campo para fkInternalCalc e mantive o código que preenche o campo no OnCalcFields do CDS. Pelo Debug vi que o campo recebe o valor do correto, mas o label que mostra o campo Aggregate mostra valor 0 (quando deveria mostrar outros valores).

É possível realizar essa operação?

Obs.: O campo aggregate já está com Active=True e AggregatesActive do CDS também.

t+!


Delphi32

Delphi32

Responder

Posts

14/05/2007

Paullsoftware

Nossa tópico antigo esse!!!
mais me deparei com a mesma situação e não estou conseguindo resolver sozinho!!

alguém pode me ajudar?? :roll:


Responder

Gostei + 0

15/05/2007

Marco Salles

Nossa tópico antigo esse!!! mais me deparei com a mesma situação e não estou conseguindo resolver sozinho!! alguém pode me ajudar??


nunca tive problema com isso ...eu não sei se seu problema continua sendo o mesmo :

o label que mostra o campo Aggregate mostra valor 0 (quando deveria mostrar outros valores).


se for , [u:9dc376e696]como e quando[/u:9dc376e696] voce ´alimenta´ o caption desse label ???


Responder

Gostei + 0

15/05/2007

Paullsoftware

Marcos é o seguinte: Até hoje tenho trabalhado com campos Calculados e campos agregados sem problemas, mais, nunca os dois juntos tipo: Somar o total de campo Calculado, ex:

Codigo, Produto, Preco, Quantidade, CalcSubTotal(CampoCalculado)
no onCalcFields fiz

cdsItensCalcSubTotal.Value := cdsItensPreco.Value * cdsItensQuantidade;

Até ai, blz...

depois criei um campo Agregado para totalizar a lista


expressão: SUM(CalcSubTotal)

Ele apresenta um erro resumido, diz que não pode ser usado um campo calculado e sim um do tipo InternalCalc... entendeu qual o meu real problema??


Responder

Gostei + 0

15/05/2007

Brunolspp

Cria um campo do tipo internalcalc

e no evento oncalcfields do clientdataset vc coloca o seguinte codigo:

if DataSet.State = dsInternalCalc then
begin
CDSFieldInternalCalc.AsFloat := CDSField1.AsFloat * CDSField2.AsFloat;
end;

e depois é só colocar no aggregates

SUM(FieldInternalCalc)

Em tempo, sempre prefirma usar internalcalc ao inves de calculated pois é mais performatico e fornece muito mais recursos.


Responder

Gostei + 0

15/05/2007

Marco Salles

Ele apresenta um erro resumido, diz que não pode ser usado um campo calculado e sim um do tipo InternalCalc... entendeu qual o meu real problema??


então .. voce deve definir este campo CalcSubTotal , como fkInternalCalc

Tente trocar , na propriedade FindKind , no objeto Inspector do Tfield
de fkCalculated para fkInternalCalc... Pode ate mesmo continuar a usar o mesmo evento OnCalcFields

caso não consigab trocar tente deletar o Field e criar um Outro com o mesmo nome mas do tipo InternalCalc , acho que isso deve resolver


Responder

Gostei + 0

15/05/2007

Paullsoftware

Eu já fiz isso mais não funcionou, vou fazer novamente do zero quando chegar em ksa e postar o resultado aqui pra vc´s mais tarde, valeu!


Responder

Gostei + 0

15/05/2007

Marco Salles

Eu já fiz isso mais não funcionou, vou fazer novamente do zero quando chegar em ksa e postar o resultado aqui pra vc´s mais tarde, valeu!


engraçado .. comigo aqui funciona


Responder

Gostei + 0

15/05/2007

Paullsoftware

blz então Marcos!!! pode ser algum vacilo meu falta de atenção (risos) vou tentar novamente quando chegar em casa a noite!!! :lol:


Responder

Gostei + 0

15/05/2007

Marco Salles

[b:6eed459237]if DataSet.State = dsInternalCalc [/b:6eed459237]then begin CDSFieldInternalCalc.AsFloat := CDSField1.AsFloat * CDSField2.AsFloat; end; e depois é só colocar no aggregates SUM(FieldInternalCalc) Em tempo, sempre prefirma usar internalcalc ao inves de calculated pois é mais performatico e fornece muito mais recursos.


´O que poucos sabem é que esse evento é chamado a todo o momento, por exemplo, quando um valor de um campo muda, mesmo que esse campo não afete o valor do cálculo.´

porém , com o calculo proposto pelo paullsoftware é pouco complexo eu achei que seria indiferente perder performance em testar um If para satisfazer a condição
if DataSet.State = dsInternalCalc ou
ou processar de cara a [u:6eed459237]instrução da soma [/u:6eed459237]sempre que o evento for chamado

não posso e nen tenho condiçoes de dizer se ganho ou se perco usando o teste com o if ao inves do calculo direto.. Porém , claro que se o conjunto de condiçoes a serem realizados forem complexo é melhor evita-los usando a condição IF ...


Responder

Gostei + 0

15/05/2007

Paullsoftware

Marcos, valeu kra...

é só ter um pouco mais de atenção!!!

eu tava fazendo o teste da seguinte forma:

kra ninguém merece!!!
if cdsDevolucao.State = dsInactive then
v só...
eu mereço veio, só descrobri essa burrada voltando no ´History´ do delphi pra ver....

mais uma vez obrigado!


Responder

Gostei + 0

17/05/2007

Marco Salles

if cdsDevolucao.State = dsInactive then


pois é paullsoftware , é o que tentei passar no tópico anterior :

Sera que devido aos calculos que serão realizados por voce serem muito simplis , pelo que tudo indica ,não haveria perdar de performance em
ignorar a instrução if ???? sera que perderia algo se escrevesse o código direto ????

isto é

[u:e70a7bb845]Ao inves disso :[/u:e70a7bb845] if cdsDevolucao.State = dsInternalCalc then seus calculo simples [u:e70a7bb845] simplesmente[/u:e70a7bb845] seus calculo simples



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar