[firebase-br] Lógica de Cadeia de Itens
Sandro Souza
escovadordebits em gmail.com
Qui Dez 5 19:51:33 -03 2019
Bom dia/tarde/noite Moacir.
Vou fazer aqui um exemplo bem básico de stored procedure recursivo que
resolveria o seu caso.
Primeiramente, vamos criar uma tabela de exemplo de hierarquia.
*CREATE TABLE TABELA_EXEMPLO( CODIGO INTEGER NOT NULL, CODIGO_PAI
INTEGER, DESCRICAO VARCHAR(10)NOT NULL, CONSTRAINT PK_TABELA_EXEMPLO
PRIMARY KEY(CODIGO), CONSTRAINT FK_TABELA_EXEMPLO_PAI FOREIGN
KEY(CODIGO_PAI)REFERENCES TABELA_EXEMPLO(CODIGO)ON UPDATE CASCADE);COMMIT;*
Agora vamos inserir alguns registros, seguindo o seu próprio exemplo.
*INSERT INTO TABELA_EXEMPLO(CODIGO,DESCRICAO)VALUES(1,'E');INSERT INTO
TABELA_EXEMPLO(CODIGO,CODIGO_PAI,DESCRICAO)VALUES(2,1,'D');INSERT INTO
TABELA_EXEMPLO(CODIGO,CODIGO_PAI,DESCRICAO)VALUES(3,2,'C');INSERT INTO
TABELA_EXEMPLO(CODIGO,CODIGO_PAI,DESCRICAO)VALUES(4,3,'B');INSERT INTO
TABELA_EXEMPLO(CODIGO,CODIGO_PAI,DESCRICAO)VALUES(5,4,'A');COMMIT;*
Consulte os registros para ver se está tudo correto.
*SELECT * FROM TABELA_EXEMPLO ORDER BY CODIGO;*
Agora vamos criar uma stored procedure que percorra essa hierarquia de
registros.
*SET TERM ^ ;CREATE OR ALTER PROCEDURE EXEMPLO_RECURSAO( CODIGO
INTEGER)RETURNS( CAMINHO VARCHAR(2000))ASDECLARE VARIABLE CODIGO_PAI
INTEGER;DECLARE VARIABLE CAMINHO_PAI VARCHAR(2000);BEGIN -- Sem codigo?
IF (CODIGO IS NULL) THEN -- Sem caminho. CAMINHO = NULL; ELSE
BEGIN -- Obtem as informacoes do registro desejado. SELECT
CODIGO_PAI, DESCRICAO FROM TABELA_EXEMPLO WHERE CODIGO
= :CODIGO INTO :CODIGO_PAI, :CAMINHO; -- Nao consta
qualquer registro com o codigo informado? IF (ROW_COUNT = 0) THEN
-- Sem caminho. CAMINHO = NULL; ELSE BEGIN -- Esse registro
esta ligado a outro? IF (CODIGO_PAI IS NOT NULL) THEN BEGIN
-- Obtem o caminho do registro pai. EXECUTE PROCEDURE
EXEMPLO_RECURSAO :CODIGO_PAI RETURNING_VALUES :CAMINHO_PAI; --
Retornou o caminho do registro pai? IF (CAMINHO_PAI IS NOT NULL)
THEN -- Concatena o caminho desse registro com o caminho do
registro pai. CAMINHO = CAMINHO || ' => ' || CAMINHO_PAI; END
-- IF END -- ELSE END -- ELSE -- Retorna o caminho encontrado.
SUSPEND;END^COMMIT^SET TERM ; ^*
Agora vamos aos testes.
*SELECT * FROM EXEMPLO_RECURSAO(1);*
Deve retornar: "E"
*SELECT * FROM EXEMPLO_RECURSAO(2);*
Deve retornar: "D => E"
*SELECT * FROM EXEMPLO_RECURSAO(3);*
Deve retornar: "C => D => E"
*SELECT * FROM EXEMPLO_RECURSAO(4);*
Deve retornar: "B => C => D => E"
*SELECT * FROM EXEMPLO_RECURSAO(5);*
Deve retornar: "A => B => C => D => E"
Se eu entendi bem a sua dúvida, creio que esse exemplo poderá lhe ajudar a
resolver o seu caso.
No que mais eu puder lhe ajudar, fique à vontade para entrar em contato.
Espero ter mais ajudado que atrapalhado.
Em qui., 5 de dez. de 2019 às 16:38, Moacir Kuhn <moacir em softin.com.br>
escreveu:
> Senhores,
>
>
>
> Estou quebrando a cabeça pra montar a lógica do uma procedure em FIREBIRD
> pra voltar uma cadeia de registros onde:
>
> A aponta pra B
>
> B aponta pra C
>
> C aponta pra D
>
> D aponta pra E
>
> E não aponta pra nenhum item
>
>
>
> Assim, se o usuário solicitar qualquer informação desta cadeia de
> registros(A,B,C,D,E) precisa voltar todas estas informações.
>
>
>
> Alguém já fez algo parecido ou alguma lógica neste sentido?
>
>
>
> Att,
>
> Moacir
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>
Mais detalhes sobre a lista de discussão lista