Problemas com InternalCalc
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.
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
Curtidas 0
Respostas
Ronaldo Lanhellas
19/12/2012
Eu fiz um teste, e verifiquei que o InternalCalc do DETAIL é executado primeiro que o InternalCalc do Master. E agora ? Como faço ?
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
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.
GOSTEI 0
Claudia Nogueira
19/12/2012
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.
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.
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
Olá, estou usando Firebird e o meu TSQLDataset é ctQuery.
GOSTEI 0
Claudia Nogueira
19/12/2012
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?
E qual o cálculo do outro campo?
O que tem no CommandText do TSqlDataSet?
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
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.
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.
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
alguem porfavor ?
GOSTEI 0
Claudia Nogueira
19/12/2012
A sentença SQL pra projeto ficaria mais ou menos assim:
E da comissão assim:
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.
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.
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
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.
GOSTEI 0
Claudia Nogueira
19/12/2012
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?
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
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;
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;
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
Tem solução ? :D
GOSTEI 0
Ronaldo Lanhellas
19/12/2012
alguém tem alguma solução ?
GOSTEI 0