Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matias Rezende

[Resolvido] Gerar um relatório

Recommended Posts

Pessoal, hoje venho pedir uma ajuda. Preciso gerar uma consulta e não estou conseguindo sair do lugar...

 

Usando esta consulta

SELECT produto, operadora, loja, venda, estoque
FROM relatorio_complemento
JOIN relatorio USING(id_relatorio)
JOIN produto USING (id_produto)
JOIN loja USING (id_loja)
JOIN operadora USING (id_operadora)
WHERE quinzena = 1
AND mes = 7
AND loja.status = 'Ativo'
ORDER BY operadora, loja, produto

 

Obtenho este resultado (o resultado foi reduzido, para facilitar o entendimento)

'GD330', 'Tim', 'Tim Barra Shop.', 2, 2

'GM205', 'Tim', 'Tim Barra Shop.', 2, 2

'GM210', 'Tim', 'Tim Barra Shop.', 2, 2

// esta linha aqui é só para demonstrar onde acaba um e começa o outro

'GD330', 'Tim', 'Tim Shopping', 1, 1

'GM205', 'Tim', 'Tim Shopping', 1, 1

'GM210', 'Tim', 'Tim Shopping', 1, 1

 

O que eu gostaria de fazer...

'GD330', 'Tim', 'Tim Barra Shop.', 2, 2, 'Tim', 'Tim Shopping', 1, 1

'GM205', 'Tim', 'Tim Barra Shop.', 2, 2, 'Tim', 'Tim Shopping', 1, 1

'GM210', 'Tim', 'Tim Barra Shop.', 2, 2, 'Tim', 'Tim Shopping', 1, 1

 

Aqui para o exemplo, só existem 2 lojas, mas existirão mais de 20. Aqui tem 3 produtos. Mas na realidade tem mais de 30.

 

Tentei criar uma view empilhando estes valores pro produto, só que não rolou também... Se precisar eu posto aqui a minha tentativa de criar a view... Senão o post fica muito longo.

 

Quem poderia me ajudar?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Referencia Cruzada resolve isto.

 

Gera o SQL por linha e use um gerador de relatórios (Crystral) para fazer a referência cruzada.

 

Não tendo Crystal use o Excel (Dados / Rel dados dinamicos) que faz isto.

 

Ouvi falar de um programa (iReport) que é free , mas nãO sei se faz CroSs Reference.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, obrigado pela dica...

Mas o pouco que eu li no Google sobre referência cruzada cita a utilização de JOIN, INNER JOIN... o que já estou usando, já que faço referencia a 5 tabelas. Não consegui entender como entraria a referência cruzada no meu exemplo ou não entendi o que você quis dizer com referência cruzada.

 

use um gerador de relatórios (Crystral)

Ouvi falar de um programa (iReport) que é free

 

Estou vendo estes programas, mas pelo pouco que vi, não me parecem que ajudarão, já que preciso rodar este relatório via PHP (esqueci de mencionar isto antes).

 

Não tendo Crystal use o Excel

Vou ter que gerar estes relatórios dinamicamente. Não consegui imaginar como usar o Excel para isto.

 

Estou precisando gerar estes relatórios em uma aplicação PHP.

 

A estrutura das tabelas...

 

loja

CREATE TABLE  `loja` (
 `id_loja` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `id_operadora` int(10) unsigned NOT NULL 
 `id_usuario` int(10) unsigned DEFAULT NULL 
 `loja` varchar(100) NOT NULL,
 `status` enum('Ativo','Desativado') NOT NULL DEFAULT 'Ativo',
 PRIMARY KEY (`id_loja`),
 KEY `loja_operadora` (`id_operadora`),
 KEY `loja_usuario` (`id_usuario`),
 CONSTRAINT `loja_operadora` FOREIGN KEY (`id_operadora`) REFERENCES `operadora` (`id_operadora`),
 CONSTRAINT `loja_usuario` FOREIGN KEY (`id_usuario`) REFERENCES `usuario` (`id_usuario`) ON DELETE SET NULL ON UPDATE NO ACTION
) ENGINE=InnoDB 

 

Produto

CREATE TABLE  .`produto` (
 `id_produto` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `produto` varchar(100) NOT NULL,
 `status` enum('Ativo','Desativado','Suspenso') NOT NULL,
 PRIMARY KEY (`id_produto`)
) ENGINE=InnoDB 

 

Relatorio

 

CREATE TABLE  `relatorio` (
 `id_relatorio` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `id_loja` int(10) unsigned NOT NULL,
 `mes` int(2) unsigned zerofill NOT NULL,
 `quinzena` enum('1','2') NOT NULL,
 `hora` time NOT NULL,
 PRIMARY KEY (`id_relatorio`),
 KEY `relatorio_loja` (`id_loja`),
 CONSTRAINT `relatorio_loja` FOREIGN KEY (`id_loja`) REFERENCES `loja` (`id_loja`)
) ENGINE=InnoDB 

 

Relatorio_complemento

CREATE TABLE  `relatorio_complemento` (
 `id_relatorio_complemento` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `id_relatorio` int(10) unsigned NOT NULL,
 `id_produto` int(10) unsigned NOT NULL,
 `venda` int(10) unsigned NOT NULL,
 `estoque` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id_relatorio_complemento`),
 KEY `complemento_relatorio` (`id_relatorio`),
 KEY `complemento_produto` (`id_produto`),
 CONSTRAINT `complemento_produto` FOREIGN KEY (`id_produto`) REFERENCES `produto` (`id_produto`),
 CONSTRAINT `complemento_relatorio` FOREIGN KEY (`id_relatorio`) REFERENCES `relatorio` (`id_relatorio`)
) ENGINE=InnoDB

 

Se alguém tiver outra idéia.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em sql para transpor linhas em colunas pode-se usar o CASE (veja exemplos), mas no caso citado existem muitas ocorrencias o que dificultaria a montagem do sql , por isto sugeri a montagem do relatório com um gerador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, consegui resolver aqui fazendo uma gambiarra monstruosa no PHP (tão gambiarra que não tenho nem coragem de postar o código aqui).

Continuo querendo fazer isto no Mysql, então se alguém tiver alguma idéia...

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pior que nem tinha entendido direito o CASE. Parece que vai funcionar...

 

Obrigado, Motta. Te devo uma... Se precisar de alguma coisa em PHP, passa lá...

 

Carlos Eduardo

 

RESOLVIDO

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.