Como fazer cálculo com campo AGGREGATE ?

26/02/2009

Caro Consultor,            Tenho uma aplicação que utiliza campo aggregate para sumarizar (sum) uma coluna de um dbgrid. Até ai estou conseguindo perfeitamente, mas quando preciso somar esse campo aggregate com outro campo que se encontra em um clientdataset diferente ou no mesmo clientdataset ele da erro dizendo que nao consegue pegar o conteudo do campo com aquele valor e outras coisas desse tipo. Procurei em artigos, internet, foruns e não achei solução nenhuma. Como posso resolver isso e ainda em relacao ao aggregate como colocar mascara nele e tb campos lookup?.  Estarei trato pela solução.   att,   Leonardo Anselmo      
Leonardo Anselmo

Leonardo Anselmo

Curtidas 0

Respostas

Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Leonardo, para que nos possamos ajudá-lo precisamos saber alguns detalhes, o principal é: Qual a versão do Delphi utiliza ??

De qualquer forma já estamos trabalhando na Solução do seu problema !!


Abs !!!


GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Delphi 2007. Isso teria alguma coisa haver?. att,
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Sim tem,

Exitiam algum problemas com campos agregados no delphi 7  que foram corrigidos a partir do 2006, e a partir do delphi 2007 novos metodos foram adicionados.

Abs !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Leonardo problema resolvido !!!


Para pegar o valor de um campo agregado você pode utilizar um dos 4 métodos abaixo. No exemplo suponha que seu ClientDataSet chame-se CdsVendas e que o campo agregado chama-se Total Geral:

CdsVendas.AggFields.FieldByName('TotalGeral').Value;
CdsVendas.AggFields[0].Value;
CdsVendas.AggFields.AggFields.FindField('TotalGeral').Value;
CdsVendas.AggFields.AggFields.FieldByNumber(0).Value;

Repare no uso do .Value, ele é um variant e deve ser usado com campos agregados uma fez que este TField não tem um tipo definido.

Quanto a formatação se for em formato Moeda você poderá selecionar o campo agregado no CDS e alterar a propriedade currency para True. Qualquer outro formato diferente poderá ser feito através da propriedade DisplayFormat, por exemplo para formatar uma valor como porcentagem você poderia fazer #0.00 % ou mesmo valores arredondados com três casas decimais:   ###,##0.000

Em ralação a criar lookup com campos agregados o Delphi não suporte, mesmo pq campos agregados são apenas totalizadores.

Estamos a disposição !!!

Abs!!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Amigo !!!

Há mais alguma dúvida ???  Podemos encerrar o chamado ???

abs !!!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Olha nao conclui nao pois ainda nao deu certo. Pois o dbedit que estou associando o campo aggregate ele so aparece o valor quando passo com o cursor + de 1 vez. ou seja, eu volto o campo pra ele calcular, eh assim mesmo?. att,
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá amigo !!!

Eu precisaria dar uma olhada no seu código para ver vomo está fazendo !!

Use o Disco Virtual para me enviar os fontes !!

att,

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

GOSTEI 0
Devmedia

Devmedia

26/02/2009

Leonardo,
a opção "meu disco virtual" está na home da consultoria. Caso tenha dúvidas sobre como utlizá-lo, acesse ao video explicativo, onde o seu link encontra-se ao lado da opção referida acima.
Lembrando que vc só poderá upar aquivos do tipo .rar ou .zip

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Prezado Cliente,

Este chamado foi concluído por falta de retono.

Continuamos a disposição para qualquer esclarecimento.

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Rodrigo, Olha eu estava tentando melhorar o codigo e fazer de uma outra forma para poder te explicar melhor. Mas, veja o que estou tentando fazer: Tenho um campo em um clientdataset chamado de SobrevivenciaCalc que é calculado e tipo variant, como vc tinha me dito pelo post anterior e nesse campo tento receber um agregatte divididos por outros dados como segue abaixo, mas mesmo assim não tenho sucesso, como devo proceder ? O Campo aggregate antes de começar o calculo ele se encontra null, ai coloquei como valor padrao na propriedade DefaultExpression := 0;, pois antes ele dizia que nao podia converter nada null. Quando coloco essa expressao abaixo, ele nao calcula nada , mas vejo a mensagem: E2171 Variable ´Self´ inaccessible here due to optimization pelo debug. CDSItens_LancamentosSobrevivenciaCalc.AsVariant := 100- ((CDSItens_Lancamentos.AggFields.FieldByName('TotalMortalidade').Value*(100))/3300); e tb tentei assim: CDSItens_LancamentosSobrevivenciaCalc.Value := 100-((CDSItens_Lancamentos.AggFields.FieldByName('TotalMortalidade').Value*(100))/3300); Agradeço a Atenção e seria grato pela ajuda. att, Leonardo Anselmo
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Leonardo !!!


O problema pode estar no campo calculado. Campos calculados são muito restritos no Delphi. Geralmente eles só podem ser manipulados dentro do evento OnCalcField do ClientDataSet.  Um campo não precisa ser do tipo calculado para receber uma valor como este que você esta fazendo !!!

Experimente criar um campo comum mesmo do tipo Float e depois tentar passar o valor do agregado/3 para este campo.

Outro detalhe é que se possivel post os fontes para que eu possa depurar e analisar assim posso ser mais acertivo e lhe auxiliar mais rapidamente.

Fico no aguardo !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Rodrigo, Vc quer que eu envie todo o sistema?. Ou só os arquivos do form que estou fazendo?. E quando tentei criar um campo no clientdataset como tipo DATA e FLOAT ele diz que nao pode achar (found) o campo que tinha criado, como faço entao pra criar esse campo?. // att, // Leonardo Anselmo 
 
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Mande só este form !!!  Já será suficiente !!!

Bem quanto a esse erro deve ser por que o cliente data set esta conectado !!

Mandado o form eu posso analisar melhor !!


Abs !!!


GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Mande só este form !!!  Já será suficiente !!!

Bem quanto a esse erro deve ser por que o cliente data set esta conectado !!

Mandado o form eu posso analisar melhor !!


Abs !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Nao estou conseguindo enviar o arquivo. Vc poderia me dizer um email?. Pois o servidor diz que o arquivo de imagem é invalido e esta gravando o ip e login. att,
GOSTEI 0
Devmedia

Devmedia

26/02/2009

Leonardo,
o consultor não pode fornecer email para essa troca de arquivos. Para isso a Consultoria dispõe do "Meu disco virtual". Essa opção vc encontra na home da consultoria. Lá vc pode upar arquivos no formato .zip ou .rar.
Depois, vc passa o caminho pro consultor e ele baixará os arquivos.
Se tiver dúvidas, vc pode assistir ao video explicativo que se encontra ao lado da opção "meu disco virtual".
GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Segue Video com demonstração sobre campos agregados !! Abs !! Atenciosamente, Rodrigo Carreiro Mourão Borland Instructor Certified Coordenador da Consultoria em Delphi

[#VIDEO-82#]
GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Rodrigo, o link para o downloads do meu sistema e: https://www.devmedia.com.br/imagens/discovirtual/27661/PSICULTURA.zip olha realmente com a sua video-aula, conseguir entender melhor e fiz do jeito que vc esplanou, sendo que eu irei colocar dados no grid para ele ir somando o aggregate e o exemplo que vc utilizou foi abrindo uma tabela, quando eu fiz abrindo uma tabela com dados e preenchendo o grid deu certo, mas preciso colocar o ultimo valor em um dbgrid chamado sobrevivencia que se encontra em outro clientdataset, quando vc abrir o projeto vc vera o que estou falando. Mas, estamos chegando lá. Valeu. att, Leonardo Anselmo
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Amigo !!

Estamos trabalhando no seu chamado, peço apenas que aguardo mais um pouco pois estamos analisando seu código uma vez que as soluções apresentadas abaixo funcionam mas não no seu contexto !!!

Agradeço a compreensão  !!!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi



GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Ok, Rodrigo.    Espero que consigam ajudar, pois estou pra entregar esse projeto a um cliente semana que vem. E estou dependendo desse procedimento. Aguardo vc.   att,   Leonardo Anselmo.
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Amigo !!

Não estou conseguindo compilar o projeto, parece que você está usando um componente próprio, uma espécie de DBEdit Especial !!  Poderia me enviar ???

Preciso compilar o projeto para depurar. Pode me informar também o local exato onde está o código com problema ???

No aguardo !!!

Abs !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Rodrigo,      O link e esse do componente: https://www.devmedia.com.br/imagens/discovirtual/27661/Edits.zip dentro tem um pacote ou entao vc cria um pacote colocando as .pas dentro e instalando, vai criar uma aba chamanda disney. O codigo fica no oncalcfields no clientdataset do cdsitens_lancamentos. Acho que é isso que vc quer saber, senão, manda a pergunta novamente.   att,   Leonardo Anselmo
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Leonardo !!   Eu consegui compilar o projeto e rodar. Olhei sua rotina, não há nada de errado com ela. Bem rodei o programa, fui até o cadastro de lançamentos, cliquei em novo e inseri mais uma linha na GRID. O campo calculado recebeu o valor conforme os de cima. Pode ser que eu não soube "forçar o erro". Se você tiver condições grave uma vídeo demonstrando o passo-a-passo para que o erro aconteça. Se não puder descreva em texto mesmo. Ex.:   Abra o projeto, rode, clique em lançamento, clique em novo, selecione o lote x, digite 10 no edit tal, 25 no edit tal, e assim por diante. Eu irei reproduzir aqui para ver se o erro acontece, mas a principio aqui funcionou!!   No Aguardo !!!   Abs !!!
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Leonardo !!!

Estamos no aguardo !!!

Abs !!!!!


Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/02/2009

Olá Leodardo !!

Alguma novidade ???  Podemos encerrar o chamado ??

Estamos a Disposição !!!

Abs !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0
Leonardo Anselmo

Leonardo Anselmo

26/02/2009

Rodrigo,   Espere ate a noite, pois estou cheio de coisa pra fazer e ainda nao testei o que vc disse. A noite te darei um retorno.   att,   Leonardo Anselmo
GOSTEI 0
POSTAR