Fórum Expression do AggregateField com campos calculados #291091
08/08/2005
0
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
Curtir tópico
+ 0Posts
14/05/2007
Paullsoftware
mais me deparei com a mesma situação e não estou conseguindo resolver sozinho!!
alguém pode me ajudar?? :roll:
Gostei + 0
15/05/2007
Marco Salles
nunca tive problema com isso ...eu não sei se seu problema continua sendo o mesmo :
se for , [u:9dc376e696]como e quando[/u:9dc376e696] voce ´alimenta´ o caption desse label ???
Gostei + 0
15/05/2007
Paullsoftware
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??
Gostei + 0
15/05/2007
Brunolspp
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.
Gostei + 0
15/05/2007
Marco Salles
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
Gostei + 0
15/05/2007
Paullsoftware
Gostei + 0
15/05/2007
Marco Salles
engraçado .. comigo aqui funciona
Gostei + 0
15/05/2007
Paullsoftware
Gostei + 0
15/05/2007
Marco Salles
´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 ...
Gostei + 0
15/05/2007
Paullsoftware
é só ter um pouco mais de atenção!!!
eu tava fazendo o teste da seguinte forma:
kra ninguém merece!!!
eu mereço veio, só descrobri essa burrada voltando no ´History´ do delphi pra ver....
mais uma vez obrigado!
Gostei + 0
17/05/2007
Marco Salles
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 é
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)