[firebase-br] SQL novamente!!!

Andrei Luís compuvale.software em gmail.com
Sex Maio 8 16:05:02 -03 2009


Olá Luis,

Dá, tem que adaptar um pouco mas dá. Como o Eduardo lhe explicou na outra
thread, tem que fazer uma Stored Procedure ou utilizar Execute Block se
estiver usando FB 2.X.

Seria +/- assim: (não testei mas deve funcionar)

Detalhe que precisa retorar cada um dos campos para variáveis diferentes.
Vou comentar as linhas que alterei/adicionei


dataini = '01.01.2009';   -- definindo o valor das variáveis, o valor pode
ser também recebido ao executar a SP
datafim = '31.01.2009';
memory_t1 = nome_da_tabela;

select
 id_nf,
 id_produto,
 valor_liq,
 ipi_valor,
 valor_liq-ipi_valorliquido,
 id_vendedor,
 d.comissao,

 case
 when d.comissao='A' then c.comissaoA
 when d.comissao='B' then c.comissaoB
 when d.comissao='C' then c.comissaoC
 when d.comissao='D' then c.comissaoD
 when d.comissao='E' then c.comissaoE
 when d.comissao='F' then c.comissaoF
 else 0
 end perc_comissao,
 0.00 valor_comissao

from nfprodutos a
left join nfmestre b on b.id = a.id_nf
left join vendedores c on c.id = b.id_vendedor
left join produtosprincipal d on d.id = a.id_produto
where b.geracao_data between :dataini and :datafim
into :wid_nf, :wid_produto, :wvalor_liq, :wipi_valor,
:wvalor_liq_valor_liquido, :wid_vendedor, :wcomissao, :wperc_comissao,
:wvalor_comisao;

wSQL := 'update ' || :memory_t1 || ' set valor_comissao = liquido *
(perc_comissao/100)';

Execute statement wSQL;

wSQL := 'select id_vendedor,nome,sum(liquido)
total_vendido,sum(valor_comissao) total_comissao from ' || :memory_t1 || ' a
left join vendedores b on b.id = a.id_vendedor group by id_vendedor order by
nome';

Execute statement wSQL;

[]
Andrei



2009/5/8 <luis em bmsoft.com.br>

> Pessoal,
>
> No DBisam tinha uma query para fazer um relatório assim:
>
> ******** INICIO *********
> select
>  id_nf,
>  id_produto,
>  valor_liq,
>  ipi_valor,
>  valor_liq-ipi_valor liquido,
>  id_vendedor,
>  d.comissao,
>
>  case
>  when d.comissao='A' then c.comissaoA
>  when d.comissao='B' then c.comissaoB
>  when d.comissao='C' then c.comissaoC
>  when d.comissao='D' then c.comissaoD
>  when d.comissao='E' then c.comissaoE
>  when d.comissao='F' then c.comissaoF
>  else 0
>  end perc_comissao,
>  0.00 valor_comissao
>
> into "memory\t1"
> from nfprodutos a
> left join nfmestre b on b.id = a.id_nf
> left join vendedores c on c.id = b.id_vendedor
> left join produtosprincipal d on d.id = a.id_produto
> where b.geracao_data between '[dataini]' and '[datafim]'
> ;
> update "memory\t1" set valor_comissao = liquido * (perc_comissao/100)
> ;
>
> select id_vendedor,nome,sum(liquido) total_vendido,sum(valor_comissao)
> total_comissao
> from "memory\t1" a
> left join vendedores b on b.id = a.id_vendedor
> group by id_vendedor
> order by nome
> *********  FIM  ***********
>
> ISSO DÁ PRA FAZER NO FIREBIRD??
>
>
> --
> _________________________________________
> BMSOFT - SERVIÇOS DE INFORMÁTICA LTDA.
> Luis C. de Azevedo
> Analista de Sistemas
> (47)8848-9722



Mais detalhes sobre a lista de discussão lista