Relatório de Coletas, todos os clientes
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
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
Ramms
Curtidas 0
Respostas
Emerson Nascimento
30/11/2005
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...
se o percentual for calculado sobre os totais (Valor total R$ 2000. Quantidade total 175):
- em função da quantidade:
- em função do valor:
eu não consegui entender o cálculo do percentual... :?
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... :?
GOSTEI 0
Ramms
30/11/2005
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...
se o percentual for calculado sobre os totais (Valor total R$ 2000. Quantidade total 175):
- em função da quantidade:
- em função do valor:
eu não consegui entender o 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
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
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
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
GOSTEI 0
Emerson Nascimento
30/11/2005
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
GOSTEI 0
Ramms
30/11/2005
Kra não entendi sua instrução por completo....
eu qro fazer isso no relatório......
Poderia explicar melhor??
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
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
GOSTEI 0
Emerson Nascimento
30/11/2005
corrigindo... havia um pequeno erro na instrução:
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.
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).
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.
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.
GOSTEI 0
Ramms
30/11/2005
corrigindo... havia um pequeno erro na instrução:
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.
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).
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.
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
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
(sum(enc.valor) / (select sum(enc2.valor) from encomendas enc2 where and enc2.id_produto = enc.id_produto [and periodo])) * 100 porcentagem
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.....
GOSTEI 0
Emerson Nascimento
30/11/2005
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
GOSTEI 0
Ramms
30/11/2005
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
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 14, char 10.
and.
Vlw
GOSTEI 0
Emerson Nascimento
30/11/2005
preste atenção:
e
só devem ser colocados se você informar um período. aí vc substitui aquilo por e , o que resultaria em:
se você não informar um período, deve ficar apenas:
[and periodo]
where [periodo]
só devem ser colocados se você informar um período. aí vc substitui aquilo por
and enc2.data between :datainicial and :datafinal
where enc.data between :datainicial and :datafinal
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
GOSTEI 0