[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