Campo aggregate

Delphi

14/07/2007

Comecei a usar campo aggregate, mas obtive um erro quando fui fazer conta de subtracao e o valor do campo aggregate estava zerado, pois é uma laço entao em determinado momento ele pode estar zerado e me retornou entao o seguinte erro: could not convert variant of type (null) into type (double), tenho que ficar testando a todo momento se existe valor no campo ? Ou existe outra forma mais simples de resolver isso ?

Obrigado


Felipeiw

Felipeiw

Curtidas 0

Respostas

Marco Salles

Marco Salles

14/07/2007

engraçado , o campo agregate não deveria mudar de valor , salvo se for
agregate com Indexação...Assim basta testar uma unica vez


GOSTEI 0
Felipeiw

Felipeiw

14/07/2007

Oi Marcos,

Nao entendi quanto ao campo agregate no mudar de valor, pois estou utilizando uma expressao sum(quant*preco), entao ele me retornara o total dos produtos do pedido, mas em determinado momento nao havera produtos entao o valor do campo agregate é zero, como faço um calculo com esse campo imaginei que, quando ele fosse zero, nao daria erro, como acontece com qualquer campo de valor, mas no caso do agregate quando este campo esta zerado retorna o erro que mencionei, diante disso tenho que ficar testar o valor do campo antes de utiliza-lo em algum calculo, isso é ruim, entao imaginei que houvesse algum tipo de ´conversao´ que resolveria isso, sem ter que testa-lo toda vez.
Obrigao


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/07/2007

veja se preencher a propriedade DefaultExpression [b:6fe5ef252c]do campo agregado[/b:6fe5ef252c] com 0 (zero) resolve seu problema.


GOSTEI 0
Marco Salles

Marco Salles

14/07/2007

Nao entendi quanto ao campo agregate no mudar de valor, pois estou utilizando uma expressao sum(quant*preco),


suponha que na sua tabela voce tenha

item quant preco
1 1 10
2 2 20
3 3 30

o campo agreggate cuja expressão é Sum (quant*preco) para esta tabela retorna em String o Valor de
1*10+2*20+30*30= 140 este valor é fixo


GOSTEI 0
Felipeiw

Felipeiw

14/07/2007

Mas se todos os 3 produtos forem excluidos Marcos, entao o campo sera zero, e se eu comparar esse resultado com outro valor, por exemplo para ver qual é maior, retornara o erro reportado.

Alterei a propriedade DefaultExpression, conforme sujestao do amigo emerson, mas tb nao funcionou.

Abs


GOSTEI 0
Marco Salles

Marco Salles

14/07/2007

Mas se todos os 3 produtos forem excluidos Marcos, entao o campo sera zero, e se eu comparar esse resultado com outro valor, por exemplo para ver qual é maior, retornara o erro reportado.


veja , mesmo que o os produtos [b:18455c9370]não[/b:18455c9370] sejem excluidos , o campo agrregate so ´retorna´ valores em strings.. Logo , em qualquer caso é necessário uma conversão

Assim :

cds.FieldByName(´CampoAggregate´).[b:18455c9370]asstring[/b:18455c9370] --->> Beleza cds.FieldByName(´CampoAggregate´).[b:18455c9370]asinteger[/b:18455c9370] --->>Erro



GOSTEI 0
Vinícius Ribeiro

Vinícius Ribeiro

14/07/2007

Felipeiw tenta colocar esse comando dmVendas.cdsItemVenda.Next; depois que o campo que vai ser calculado receber o valor.
GOSTEI 0
Sady

Sady

14/07/2007

Comecei a usar campo aggregate, mas obtive um erro quando fui fazer conta de subtracao e o valor do campo aggregate estava zerado, pois é uma laço entao em determinado momento ele pode estar zerado e me retornou entao o seguinte erro: could not convert variant of type (null) into type (double), tenho que ficar testando a todo momento se existe valor no campo ? Ou existe outra forma mais simples de resolver isso ?

Obrigado




Olá Felipeiw
Não sei se o seu problema foi resolvido, mas vou deixar 2 dicas pra ajudar a resolver.
1) Para obter o valor de qualquer capo agregate você fazer uma conversão. Pois campos agregates não são numéricos, mas sim VARIANT.
SuaVariável := cdsSeuCDS.NomeCampoAgregado.AsString;
Dessa forma você vai obter '' quando valor for = 0
Para trabalhar com números é só usar as funções de conversão nativas do Delphi (StrToInt, StrToFloat, SrtToCurr, ...)
2) Outra dica IMPORTANTÍSSIMA quando se trabalha com campos agregates é:
Verifique sempre o estado do DataSource.
If cdsSeuCDS.DataSource.State = dsEdit then
cdsSeuCDS.Post;
Caso contrário você vai estar sempre pegando o valor desatualizado.

Espero ter ajudado.

Abraços!
GOSTEI 0
POSTAR