Dúvida para relatório SQL

10/10/2019

0

Boa tarde!
Possuo a seguinte estrutura de tabela:
nivel / codigopai / codigofilho:
1 casa sala
1 casa cozinha
1 casa patio
2 sala mesa
2 sala rack
2 cozinha microondas
2 cozinha geladeira
3 mesa marrom
3 rack amarelo
3 microondas prata
3 geladeira branca
1 garagem carro
1 garagem bancada
2 celta 4 portas
2 ferramentas metal

porém, as vezes terei uma estrutura dentro de outra, como por ex:

nivel / codigopai / codigofilho:
1 casa cozinha
2 cozinha microondas
3 microondas prata
2 sala mesa
2 sala rack
1 garagem carro
2 celta 4 portas
1 garagem bancada
2 ferramentas metal

e por aí vai.

Não estou conseguindo fazer essa estruturação, por níveis e quebras, alguém para ajudar? A idéia é montar algo nesse estilo no relatório, como exemplo:
1 pai filho
2 pai filho
2 pai filho
3 pai filho
3 pai filho
2 pai filho
1 pai filho
2 pai filho
3 pai filho
3 pai filho
4 pai filho
3 pai filho
2 pai filho
1 pai filho
1 pai filho

desculpa por me estender demais, parece uma pergunta com uma resposta simples mas estou apanhando sozinho. Agradeço.
Mauricio Espido

Mauricio Espido

Responder

Post mais votado

15/10/2019

cara, nunca trabalhei com Oracle (sequer o tenho instalado), mas pesquisando na internet criei a stored procedure abaixo.
Com certeza há erros de sintaxe, mas acho que serve como ponto de partida.
create or replace procedure EstrutProduto(vNivel in int, vCodPai in varchar(15))
as
	--Declarando as variáveis que serão manipuladas
	vCodFilho varchar(15);

	--Criando o cursor que fará um select na tabela de estruturas...
	cursor cEstrut is
	SELECT CODIGOPAI, CODIGOFILHO FROM TBESTRUTURA WHERE COALESCE(CODIGOPAI,'') = COALESCE(:vCodPai,'') ORDER BY NIVEL;
begin
	vNivel := Coalesce(vNivel,1);

	--Abrindo o cursor
	open cEstrut;

	--Instrução de início do loop
	loop
		--Atribuindo o retorno da consulta, às variáveis
		fetch cEstrut into vNivel, vCodPai, vCodFilho;

		--Incluindo uma condição para saída do loop
		exit when cEstrut%notfound;

		if (vNivel = 1) then
			ILevel := ''
		else
			ILevel := lpad('  ', 15 * (vNivel-1), ' ')
		endi if;

		ILevel := ILevel || vCodPai || '  ' || vCodFilho;

		--Imprime o resultado na tela
		dbms_output.put_line(ILevel);

		--Chama a própria stored procedure, de forma recursiva
		EstrutProduto(vNivel+1, vCodFilho);

	--Instrução para finalizar o loop
	end loop;

	--Fechando o cursor para disponibilizar os recursos que estavam sendo utilizados
	close cEstrut;
end

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

10/10/2019

Mauricio Espido

esqueci que o site ignora espaços, então segue o último trecho novamente:
Boa tarde!
Possuo a seguinte estrutura de tabela:
nivel / codigopai / codigofilho:
1 casa sala
1 casa cozinha
1 casa patio
2 sala mesa
2 sala rack
2 cozinha microondas
2 cozinha geladeira
3 mesa marrom
3 rack amarelo
3 microondas prata
3 geladeira branca
1 garagem carro
1 garagem bancada
2 celta 4 portas
2 ferramentas metal

porém, as vezes terei uma estrutura dentro de outra, como por ex:

nivel / codigopai / codigofilho:
1 casa cozinha
2 cozinha microondas
3 microondas prata
2 sala mesa
2 sala rack
1 garagem carro
2 celta 4 portas
1 garagem bancada
2 ferramentas metal

e por aí vai.

Não estou conseguindo fazer essa estruturação, por níveis e quebras, alguém para ajudar? A idéia é montar algo nesse estilo no relatório, como exemplo:
1 pai filho
-----2 pai filho
-----2 pai filho
----------3 pai filho
----------3 pai filho
-----2 pai filho
1 pai filho
-----2 pai filho
----------3 pai filho
----------3 pai filho
---------------4 pai filho
----------3 pai filho
-----2 pai filho
1 pai filho
1 pai filho
Responder

10/10/2019

Mauricio Espido

desculpa a poluição visual, não consigo editar a postagem...
Responder

15/10/2019

Emerson Nascimento

você pode criar stored procedures? pode ser para um banco de dados específico?
o resultado será em texto?
Responder

15/10/2019

Mauricio Espido

você pode criar stored procedures? pode ser para um banco de dados específico?
o resultado será em texto?


sim, pode ser um stored, seria em oracle, porém não tenho idéia de como montar e trazer o retorno depois.
Responder

15/10/2019

Mauricio Espido

Ótimo, vou verificar e testar os comandos aqui, qualquer coisa eu retorno o post. Desde já muito obrigado pelos retornos, valeu!!!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar