Fórum Problemas com InternalCalc #431280

19/12/2012

0

Bom dia, tenho a seguinte situação:

Uma Tabela Master com o campo InternalCalc TOTAL_GERAL e uma Tabela Detail com o campo InternalCalc VALOR_PERCENT.

O Campo VALOR_PERCENT é calculado com base do valor TOTAL_GERAL, isto é, o InternalCalc do DETAIL depende do InternalCalc do Master, só que isso não funciona.
Ronaldo Lanhellas

Ronaldo Lanhellas

Responder

Posts

19/12/2012

Ronaldo Lanhellas

Eu fiz um teste, e verifiquei que o InternalCalc do DETAIL é executado primeiro que o InternalCalc do Master. E agora ? Como faço ?
Responder

Gostei + 0

19/12/2012

Ronaldo Lanhellas

Bom, eu encontrei 1 forma de resolver esse problema. Logo após eu abrir a tabela PROJETO (MASTER) eu dou um refresh nela, e tudo é calculado perfeitamente. Só que não acho que essa seja uma boa solução, se eu tiver 10mil projetos vai demorar muito. Imagine, toda vez que o usuário abrir um PROJETO vai dar refresh em 10mil projetos.
Responder

Gostei + 0

19/12/2012

Claudia Nogueira

Qual banco de dados?
Está usando Table ou Query?
Não é aconselhado usar campo calculado em Table/Query que retorna muitos registros, o certo é usar Query e já trazer as informações da sentença SQL.
Responder

Gostei + 0

19/12/2012

Ronaldo Lanhellas

Olá, estou usando Firebird e o meu TSQLDataset é ctQuery.
Responder

Gostei + 0

19/12/2012

Claudia Nogueira

Esse TOTAL_GERAL é o nome do campo da tabela que você fala ser o do master?
E qual o cálculo do outro campo?
O que tem no CommandText do TSqlDataSet?
Responder

Gostei + 0

19/12/2012

Ronaldo Lanhellas

Vou ser mais especifico:

Tenho uma Tabela PROJETO (Master), SERVICOS (Detail), PRODUTOS (Detail), COMISSOES (Detail).

Nas Tabelas SERVICOS e PRODUTOS tenho em ambas 1 campo chamado TOTAL (aggregate). Na Tabela PROJETO tenho um InternalCalc chamado TOTAL_GERAL que soma TOTAL DE SERVICOS + TOTAL DE PRODUTOS.

Na Tabela COMISSOES tenho um campo InternalCalc VALOR_PERCENT que pega o TOTAL_GERAL da Tabela PROJETO e retira 10% deste. Aqui ocorre o problema: Identifiquei que os Campos Calculados do Detail são executados primeiro do que do Master, dessa forma eu não tenho como pegar o TOTAL_GERAL se ele ainda nem foi calculado.
Responder

Gostei + 0

20/12/2012

Ronaldo Lanhellas

alguem porfavor ?
Responder

Gostei + 0

20/12/2012

Claudia Nogueira

A sentença SQL pra projeto ficaria mais ou menos assim:

SELECT p.id, p.nome, SUM(s.total) AS total_servico,
       SUM(p.total) AS total_produto,
       SUM(s.tota + p.total) AS total_geral 
  FROM projeto pj
LEFT OUTER JOIN servicos s ON (s.id_projeto = pj.id)  
LEFT OUTER JOIN produtos p ON (p.id_projeto = pj.id)  
GROUP BY 1,2


E da comissão assim:

SELECT c.id, c.nome,
       SUM((s.tota + p.total) - ((s.tota + p.total) * 10 / 100)) AS VALOR_PERCENT
  FROM comissoes c
LEFT OUTER JOIN projeto pj ON (pj.id = c.id_projeto)    
LEFT OUTER JOIN servicos s ON (s.id_projeto = pj.id)  
LEFT OUTER JOIN produtos p ON (p.id_projeto = pj.id)
GROUP BY 1,2


Vai ter erro de digitação pois não tenho a estrutura de suas tabelas.
Se quiser alguma coisa mais específica, posta a estrutura das tabelas.
Responder

Gostei + 0

20/12/2012

Ronaldo Lanhellas

Certo, eu já havia pensado nisso também, porém há um problema nisso: Todos os dados são carregados no ClienteDataSet, se eu adicionar mais um SERVIÇO ao projeto ele não atualizará o TOTAL_GERAL, só se eu dar um REFRESH para novamente capturar o SELECT, e isso não é viável.
Responder

Gostei + 0

20/12/2012

Claudia Nogueira

Esses dois campos, TOTAL_GERAL e VALOR_PERCENT têm que ficar obrigatoriamente na Query Projeto e Comissoes ou podem ficar em um ClientDataSet temporário?
Responder

Gostei + 0

20/12/2012

Ronaldo Lanhellas

Bom, não sei ti dizer qual seria o efeito de colocássemos em um CDS Temporário, só posso lhe afirmar que o TOTAL_GERAL é um campo que deve ser calculado e ficar no cds de PROJETO e o VALOR_PERCENT deve ficar no cds COMISSAO.

Veja, 1 PROJETO pode ter 1:N COMISSOES, onde em cada linha da tabela COMISSAO eu tenho uma PERCENTAGEM, vamos supor que seja 5%. Então o campo VALOR_PERCENT deve fazer:

cdsCOMISSAO.FieldByName('VALOR_PERCENT').AsFloat:= (cdsCOMISSAO.FieldByName('PERCENT').AsFloat * / 100) + cdsPROJETO.FieldByName('TOTAL_GERAL').AsFloat;
Responder

Gostei + 0

20/12/2012

Ronaldo Lanhellas

Tem solução ? :D
Responder

Gostei + 0

23/12/2012

Ronaldo Lanhellas

alguém tem alguma solução ?
Responder

Gostei + 0

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

Aceitar