Expression do AggregateField com campos calculados
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+!
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
Curtidas 0
Respostas
Paullsoftware
08/08/2005
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:
mais me deparei com a mesma situação e não estou conseguindo resolver sozinho!!
alguém pode me ajudar?? :roll:
GOSTEI 0
Marco Salles
08/08/2005
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 ???
GOSTEI 0
Paullsoftware
08/08/2005
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??
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
Brunolspp
08/08/2005
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.
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
Marco Salles
08/08/2005
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
GOSTEI 0
Paullsoftware
08/08/2005
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!
GOSTEI 0
Marco Salles
08/08/2005
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
GOSTEI 0
Paullsoftware
08/08/2005
blz então Marcos!!! pode ser algum vacilo meu falta de atenção (risos) vou tentar novamente quando chegar em casa a noite!!! :lol:
GOSTEI 0
Marco Salles
08/08/2005
[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 ...
GOSTEI 0
Paullsoftware
08/08/2005
Marcos, valeu kra...
é 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!
é 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!
GOSTEI 0
Marco Salles
08/08/2005
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
GOSTEI 0