Relatório de Coletas, todos os clientes

30/11/2005

1

Olá,

Preciso desenvolver um relatório que contenha o seguinte layout


[b:0975dade73]Nome Cliente | Nome Produto | Valor | Porcentagem | Qtd. |[/b:0975dade73]
Cliente 1 | Distribuição | R$ 500,00 | 0,50¬ | 25
Cliente 2 | Distribuição | R$ 1000,00 | 1,00¬ | 50
Cliente 3 | Distribuição | R$ 500,00 | 1,25¬ | 100

etc...

o Nome do cliente vem da tabela ´CLIENTES´ que possui a seguinte estrutura

ID_CLIENTE
NOME
ENDERECO
....

O Nome do Produto vem da tabela produtos que esta ´linkada´ mestre detalhe com a tabela clientes

ID_PRODUTO
ID_CLIENTE
NOMEPROD

o valor vem da soma de tds os registros da tabela encomendas, campo valor, dakele produto, a tabela encomendas tem a seguinte estrutura:

ID_ENCOMENDA
DESTINATARIO
CEP
...
ID_PRODUTO
ID_CLIENTE

A qtd vem da qtd de registros na tabela pertencente ao produto respectivo...

A Porcentagem eh a divisão do valor pela qtd...

alguem tem alguma idéia de como fazer esse relatório???

Agradeço desde já...



PS.: Utilizo Delphi 7, Firebird 1.5, Fortes Report, DBExpress


Responder

Posts

rapaz... explique melhor de onde vem a quantidade: é o número de registros ou é algum campo na tabela de encomendas?
explique também o seu cálculo do percentual...

Cliente 1 | Distribuição | R$  500,00 | 0,50¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 1,00¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 1,25¬ | 100 


se o percentual for calculado sobre os totais (Valor total R$ 2000. Quantidade total 175):
- em função da quantidade:
Cliente 1 | Distribuição | R$  500,00 | 14,29¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 28,57¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 57,14¬ | 100 


- em função do valor:
Cliente 1 | Distribuição | R$  500,00 | 25,00¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 50,00¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 25,00¬ | 100 


eu não consegui entender o cálculo do percentual... :?


Responder

30/11/2005

Ramms

rapaz... explique melhor de onde vem a quantidade: é o número de registros ou é algum campo na tabela de encomendas? explique também o seu cálculo do percentual...
Cliente 1 | Distribuição | R$  500,00 | 0,50¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 1,00¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 1,25¬ | 100 
se o percentual for calculado sobre os totais (Valor total R$ 2000. Quantidade total 175): - em função da quantidade:
Cliente 1 | Distribuição | R$  500,00 | 14,29¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 28,57¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 57,14¬ | 100 
- em função do valor:
Cliente 1 | Distribuição | R$  500,00 | 25,00¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 50,00¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 25,00¬ | 100 
eu não consegui entender o cálculo do percentual... :?


A Qtd é a Qtd de registro do select, por exemplo o PRODUTO 1 Tem 5 registros, já o produto 2 tem 10, sacou?

E qto ao percentual o que eu coloquei ali foi um número qualquer heuiaheuiae, não considere esse calculo, o calculo de percentual que vou faço eh a divisão do valor total de todos os clientes/produtos com o valor de cada produto, ou seja
Cliente 1 | Distribuição | R$  500,00 | 25,00¬ |  25 
Cliente 2 | Distribuição | R$ 1000,00 | 50,00¬ |  50 
Cliente 3 | Distribuição | R$  500,00 | 25,00¬ | 100 


o total ai a receber eh 2000 reais.....
ai pra calcular o percentual eu divido 500 por 2000, dps 1000 por 2000 e dps 500 por 2000 novamente...

vlw dinovo


Responder
tente aí:

select
  max(cli.nome) cliente,
  max(prod.nomeprod) produto,
  sum(enc.valor) valor,
  count(enc.id_produto) qtd,

  (sum(enc.valor) /
     (select
        sum(enc2.valor)
      from
        encomendas enc2
      where
        enc2.id_cliente = enc.id_cliente
        and enc2.id_produto = enc.id_produto
        [and periodo])) * 100 porcentagem
from
  encomendas enc
inner join
  produto prod on (prod.id_produto = enc.id_produto
                   and prod.id_cliente = enc.id_cliente)
inner join
  clientes cli on (cli.id_cliente = enc.id_cliente)
where
  [periodo]
group by
  enc.id_cliente,
  enc.id_produto
order by
  1, 2



Responder

30/11/2005

Ramms

Kra não entendi sua instrução por completo....
eu qro fazer isso no relatório......
Poderia explicar melhor??

select
  max(cli.nome) cliente,
  max(prod.nomeprod) produto,
  sum(enc.valor) valor,
  count(enc.id_produto) qtd,

  (sum(enc.valor) /
     (select
        sum(enc2.valor)
      from
        encomendas enc2
      where
        enc2.id_cliente = enc.id_cliente
        and enc2.id_produto = enc.id_produto
        [and periodo])) * 100 porcentagem
from
  encomendas enc
inner join
  produto prod on (prod.id_produto = enc.id_produto
                   and prod.id_cliente = enc.id_cliente)
inner join
  clientes cli on (cli.id_cliente = enc.id_cliente)
where
  [periodo]
group by
  enc.id_cliente,
  enc.id_produto
order by
  1, 2



entendi que ele tah selecionando pegando um alias das tabelas e talz..fmz...dps ele soma o valor da coluna, dps pega a soma1 e divide pela soma2

e dps num entendi mais nada....
vlw


Responder
corrigindo... havia um pequeno erro na instrução:

select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 

  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        and enc2.id_produto = enc.id_produto 
        [and periodo])) * 100 porcentagem 
from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
where 
  [periodo] 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2


essa instrução traz o nome do cliente, o nome do produto, a soma das encomendas do produto e a quantidade de encomendas do produto para o cliente - por conta do agrupamento. tudo isso em função do relacionamento entre as tabelas encomendas, produto e cliente, ordenado pelo nome do cliente e nome do produto. foram usados os índices de posicionamento do campo no [i:6468c3152c]order by[/i:6468c3152c] porque os campos ´cliente´ e ´produto´ não existem, são campos virtuais.
select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 
  
  [...] porcentagem

from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
where 
  [periodo] 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2



a instrução ainda pega aquele mesmo valor encontrado pela soma das encomendas do produto do cliente, e divide pelo valor total de encomendas do produto (independente do cliente).
  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        and enc2.id_produto = enc.id_produto 
        [and periodo])) * 100 porcentagem 


a fórmula é simples:
se o valor para o cliente foi 500 e o valor total 2000, a conta será:

(500 / 2000) * 100 = 25¬

obs.: o periodo é opcional. só foi colocado daquela maneira para ilustrar que se for necessário colocar uma condição na instrução principal, a mesma deve ser colocada também na subselect.


Responder

30/11/2005

Ramms

corrigindo... havia um pequeno erro na instrução:
select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 

  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        and enc2.id_produto = enc.id_produto 
        [and periodo])) * 100 porcentagem 
from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
where 
  [periodo] 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2
essa instrução traz o nome do cliente, o nome do produto, a soma das encomendas do produto e a quantidade de encomendas do produto para o cliente - por conta do agrupamento. tudo isso em função do relacionamento entre as tabelas encomendas, produto e cliente, ordenado pelo nome do cliente e nome do produto. foram usados os índices de posicionamento do campo no [i:57c328e880]order by[/i:57c328e880] porque os campos ´cliente´ e ´produto´ não existem, são campos virtuais.
select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 
  
  [...] porcentagem

from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
where 
  [periodo] 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2
a instrução ainda pega aquele mesmo valor encontrado pela soma das encomendas do produto do cliente, e divide pelo valor total de encomendas do produto (independente do cliente).
  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        and enc2.id_produto = enc.id_produto 
        [and periodo])) * 100 porcentagem 
a fórmula é simples: se o valor para o cliente foi 500 e o valor total 2000, a conta será: (500 / 2000) * 100 = 25¬ obs.: o periodo é opcional. só foi colocado daquela maneira para ilustrar que se for necessário colocar uma condição na instrução principal, a mesma deve ser colocada também na subselect.



kra deu erro do msm modo.......
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 13, char 9.
and.

Vlw............

PS.: Continuo sem entender como vou usar isso na minha aplicação.....


Responder
desculpe... é que a instrução estava um pouquinho diferente. esqueci de tirar o AND quando eu a corrigi:

select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 

  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        enc2.id_produto = enc.id_produto 
        [and periodo])) * 100 porcentagem 
from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
where 
  [periodo] 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2



Responder

30/11/2005

Ramms

Putz kra, estou tentando excutar pelo IBEXPERT e continua dando erro:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 14, char 10.
and.


Vlw


Responder
preste atenção:
[and periodo]
e
where
  [periodo]

só devem ser colocados se você informar um período. aí vc substitui aquilo por
and enc2.data between :datainicial and :datafinal
e
where
  enc.data between :datainicial and :datafinal
, o que resultaria em:
select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 

  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        enc2.id_produto = enc.id_produto 
        and enc2.data between :datainicial and :datafinal)) * 100 porcentagem 
from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
where 
  enc.data between :datainicial and :datafinal 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2


se você não informar um período, deve ficar apenas:
select 
  max(cli.nome) cliente, 
  max(prod.nomeprod) produto, 
  sum(enc.valor) valor, 
  count(enc.id_produto) qtd, 

  (sum(enc.valor) / 
     (select 
        sum(enc2.valor) 
      from 
        encomendas enc2 
      where 
        enc2.id_produto = enc.id_produto)) * 100 porcentagem 
from 
  encomendas enc 
inner join 
  produto prod on (prod.id_produto = enc.id_produto 
                   and prod.id_cliente = enc.id_cliente) 
inner join 
  clientes cli on (cli.id_cliente = enc.id_cliente) 
group by 
  enc.id_cliente, 
  enc.id_produto 
order by 
  1, 2



Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira