[firebase-br] Store Procedure
Washington Tavares
washingtontavares em gmail.com
Sáb Nov 7 20:12:30 -03 2009
Nilo,
Voce deveria pensar no seu select usando o group by do que usando o distinct.
Minha sugestao seria voce usar o segundo (último da mensagem) select
que voce mandou e utilizá-lo com o Group by complementando com o que
já existe na sua procedure, ficaria algo mais ou menos assim:
select it.produto as codigo
, p.nome as nome
, p.unidade as unidade
, coalesce(p.pesoliq,0) as pesoliq
, coalesce(p.pesobruto,0) as pesobruto
, coalesce(p.preco,0) as precotabela
, coalesce(sum(case when (it.ima_tipoproduto = 'Venda') then
(it.unitario*it.qtdefat) end),0)
, coalesce(sum(case when (it.ima_tipoproduto = 'Venda') then
(it.qtdefat) end),0)
, coalesce(sum(case when (it.ima_tipoproduto = 'Bonificação')
then (it.unitario*it.qtdefat) end),0)
, coalesce(sum(case when (it.ima_tipoproduto = 'Bonificação')
then (it.qtdefat) end),0)
from itempedvenda it
join produto p
on it.produto = p.codigo
join pedvenda pv
on pv.empresa = it.empresa
and pv.numero = it.numero
where it.empresa = 1
and pv.data between '01.09.2009' and '06.09.2009'
group by it.produto
, p.nome
, p.unidade
Veja ae se funciona e qualquer coisa estamos as ordens
Washington Tavares
2009/11/7 Nilo <nilo em goldensoft.inf.br>:
> Boa tarde, preciso de ajuda dos colegas.
>
> Tenho um SP assim:
> begin select coalesce(sum(case when (ipv.ima_tipoproduto = 'Venda') then
> (ipv.unitario*ipv.qtdefat) end),0) , coalesce(sum(case when
> (ipv.ima_tipoproduto = 'Venda') then (ipv.qtdefat) end),0) ,
> coalesce(sum(case when (ipv.ima_tipoproduto = 'Bonificação') then
> (ipv.unitario*ipv.qtdefat) end),0) , coalesce(sum(case when
> (ipv.ima_tipoproduto = 'Bonificação') then (ipv.qtdefat) end),0) from
> itempedvenda ipv join pedvenda pv on pv.empresa = ipv.empresa and
> pv.numero = ipv.numero where pv.empresa = :empresa and pv.data between
> :dataini and :datafim and pv.status = 'Liberado'
> and (:cliente <> 0 and pv.cliente = :cliente or (:cliente = 0))
> and (:repre <> 0 and pv.representante = :repre or (:repre = 0))
> and ipv.produto = :produto and (ipv.ima_tipoproduto = 'Venda' or
> ipv.ima_tipoproduto = 'Bonificação') into :totalvenda, :qtdevenda,
> :totalbonif, :qtdebonif; pmv = 0;
> if (totalvenda <> 0) then pmv = totalvenda / (qtdevenda + qtdebonif);
> suspend; end
>
> Na select abaixo que retorna 2200 registros o processo demora cera de 10min
> para finalizar.
> Sem a SP retorna instantaneamente.
> Quando o conteudo da SP estava "dentro" do select, não tinha problema de
> desempenho.
> Como preciso usar este calculo em varios selects, decidi unificar o processo
> num lugar só, para isso criei a SP, mas agora tem esse problema do
> desempenho.
>
> select p.codigo as codigo
> , p.nome as nome
> , p.unidade as unidade
> , coalesce(p.pesoliq,0) as pesoliq
> , coalesce(p.pesobruto,0) as pesobruto
> , coalesce(p.preco,0) as precotabela
> , (select qtdevenda from pmvenda
> (1,'01.09.2009','06.09.2009',0,0,p.codigo)) as qtdevenda
> from produto p
> where (select qtdevenda from pmvenda
> (1,'01.09.2009','06.09.2009',0,0,p.codigo)) <> 0
>
> Já tentei usar assim e não resolveu tambem.
> select distinct(it.produto) as codigo
> , p.nome as nome
> , p.unidade as unidade
> , coalesce(p.pesoliq,0) as pesoliq
> , coalesce(p.pesobruto,0) as pesobruto
> , coalesce(p.preco,0) as precotabela
> , (select qtdevenda from pmvenda
> (1,'01.09.2009','06.09.2009',0,0,it.produto)) as qtdevenda
> from itempedvenda it
> join produto p
> on it.produto = p.codigo
> join pedvenda pv
> on pv.empresa = it.empresa
> and pv.numero = it.numero
> where it.empresa = 1
> and pv.data between '01.09.2009' and '06.09.2009'
>
> Se alguem souber o que fiz de errado, agradeço a ajuda, porque já tentei
> varias coisas que conheço e não resolveu.
> Ainda preciso incluir os outros 3 retornos da SP na select, então, ficaria
> 3x mais lento ainda. :-(
> FB 2.05, servidor com 2Gb de RAM, AMD X2 5600
>
> Obrigado
> Nilo
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
--
Washington Tavares
84 9188 3135
tawaresw em hotmail.com
tawaresw em yahoo.com
Skype: washington_tavares
Mais detalhes sobre a lista de discussão lista