[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