Fórum Procedure para organizar valores por ordem venda #364838

09/10/2008

0

Pessoal,

Talvez até já tenha discutido sobre esse assunto, mas não me dou muito bem na pesquisa desse fórum.

Bem, estou querendo fazer uma procedure que me devolvesse o seguinte, a venda dos vendedores por fornecedor com os 5 fornecedores mais vendidos e outra coluna informando o restante da venda dos outros fornecedores.

Dados do sistema
FORNECEDOR    VALOR
AAA R$ 200,00 
BBB R$ 1250,00 
CCC R$ 216,00 
DDD R$ 5250,00 
EEE R$ 2600,00 
FFF R$ 6200,00 
GGG R$ 150,00 
HHH R$ 652,00 


No meu resultado ficaria assim:
FORNECEDOR    VALOR
FFF  R$ 6200,00 
DDD  R$ 5250,00 
EEE  R$ 2600,00 
BBB  R$ 1250,00 
HHH   R$ 652,00 
OUTROS R$ 566,00 


Não sei se fui claro.

Se precisar de mais detalhes e só postar quais detalhes precisa.

[b:7c18ec4614]ps. Coloquei 5 primeiros, mas na verdade preciso é dos 9 primeiros, sendo que atualmente a empresa conta com mais de 15 fornecedores [/b:7c18ec4614]


Digitom

Digitom

Responder

Posts

09/10/2008

Diegotiemann

Uma solução seria fazer uma consulta SQL do tipo:

Select first 9 nome_forncedor valor_venda from ....order by valor_venda desc
union 
select ´Outros´ , Sum(valor_venda) from ... where fornecedor not in (select  first 9 fornecedor .......)

Resolveria, é só adaptar pras suas tabelas mas vai ficar lento.


Responder

Gostei + 0

10/10/2008

Digitom

Blz, mas acho que não resolve o meu problema.

Veja só como é meu banco de dados:
TABELA (Campos)
FORNECEDOR (CODFOR - NOMEFOR)
PRODUTOS (CODPRO - NOMEPRODUTO - CODFOR)
NFSAIDA (NFNUMNOTA - NFVENDCOD - CODCLI - NFEMISSAO)
ITENSNOTAFISCAL (NUMNOTA - CODCLI - CODPRO - VALORVENDA - QUANTIDADE)
VENDEDORES (VENDCOD - VENDNOME)


Então pensei em fazer o seguinte:
Criar uma procedure para percorrer o cadastro de vendedor, e depois percorrer o cadastro de NFSAIDA juntamente com os ITENS para saber se existe venda do determinado fornecedor.


Responder

Gostei + 0

10/10/2008

Emerson Nascimento

qual o banco de dados utilizado?


Responder

Gostei + 0

10/10/2008

Digitom

Estou usando o FIREBIRD


Responder

Gostei + 0

10/10/2008

Emerson Nascimento

creio que isso seja possível somente com stored procedure.

crie uma SP assim:
CREATE PROCEDURE VENDA_POR_FORNECEDOR (
    listar integer)
returns (
    id_fornecedor integer,
    nomefornecedor varchar(60),
    valor float
)
as
declare variable isql varchar(255); -- instrução sql
declare variable ifor varchar(255); -- lista de fornecedores
begin
  listar = coalesce(listar, 0);

  if (listar < 0) then listar = 0;

  if (listar = 0) then
  begin
    select ´TODOS´, sum(it.valorvenda * it.quantidade)
    from itensnotafiscal
    into :nomefornecedor, :valor;

    id_fornecedor = -1;
  end
  else
  begin
    isql = ´select first ´ || cast(:listar as varchar(5)) ||
           ´ f.codfor, f.nomefor,´ ||
           ´ sum(it.valorvenda * it.quantidade)´ ||
           ´from itensnotafiscal it´ ||
           ´ inner join produtos p on (p.codpro = it.codpro)´ ||
           ´ inner join fornecedor f on (f.codfor = p.codfor)´ ||
           ´ group by f.codfor, f.nomefor´ ||
           ´ order by 3 desc ´;

    ifor = ´´;

    for execute statement isql into :id_fornecedor, :nomefornecedor, :valor do
    begin
      if (ifor <> ´´) then ifor = ifor || ´,´;
      ifor = ifor || cast(:id_fornecedor as varchar(10));

      suspend;
    end

    isql = ´select ´´OUTROS´´, sum(it.valorvenda * it.quantidade) ´ ||
           ´from itensnotafiscal it ´ ||
           ´inner join produtos p on (p.codpro = it.codpro) ´ ||
           ´where not p.codfor in (´ || ifor || ´)´;
  
    execute statement isql into :nomefornecedor, :valor;
    id_fornecedor = -1;
  end

  suspend;
end


e execute um select como se fosse uma tabela normal:
select * from venda_por_fornecedor(5) -- lista os 5 maiores e consolida os demais


Responder

Gostei + 0

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

Aceitar