Hierarchical tree

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
NiNo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 62
Registrado em: Seg, 11 Jul 2005 2:03 pm
Localização: são Paulo
NiNo
Developer

Ola para todos,

estou de volta com um problema que resolvi a uns 3 anos, porem perdi o fonte, mas vamos la...
Tenho uma tabela auto-relacionada, fiz um query utilizando o "start with" com "connect by prior", funciona perfeitamente no SQL+. Até ai tudo bem, porém criei um forms novo com um bloco "non base table" e, neste bloco, criei um "hierarchical tree"; na propriedade "Data query" coloquei a QUERY que criei, compilei o forms e não me aparece nada na "hierarchical tree", experimentei criar um "record group", com a mesma query e o resultado foi o mesmo. Existe um exemplo para popular o "hierarchical tree", porém na empresa onde trabalho, não consigo fazer o download dele. Necessito de ajuda para saber onde estou "pecando", sendo que, não vou conseguir fazer download de nada.
Agradeço a todos os que me ajudarem.

Obrigado !
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Neste link tem um exemplo:
http://www.glufke.net/oracle/download/Forms_Tree.zip

Já que você não pode fazer download, tem algum email aí que eu posso te mandar esse arquivo ?

:-o
NiNo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 62
Registrado em: Seg, 11 Jul 2005 2:03 pm
Localização: são Paulo
NiNo
Developer

Tem sim, almir.jg@********
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Ok, enviado...

Editei seu email e coloquei *** para seu email não ficar visível para os spammers !!! :-o
NiNo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 62
Registrado em: Seg, 11 Jul 2005 2:03 pm
Localização: são Paulo
NiNo
Developer

cara, recebi seu eMail, olhei o exemplo, achei perfeito. Exemplifica bem como popular a arvore nó a nó, sem falar em outros controles.
Mas o que estou necessitando agora é apenas para um protótipo, então eu quero utilizar o componente em sua forma mais simples, ou seja, criar o objeto em um canvas e popular ele através de record_group ou query, utilizando o "connect by prior" na query. Pelo que eu me lembro, existe uma forma simples de se fazer isto, é esta forma que estou tendo alguma dificuldade.
valeu
tomgmf
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 10 Abr 2006 5:00 pm
Localização: Guarujá - SP

Bom dia

Eu tentei rodar este arquivo teste, mas deu o seguinte erro abaixo:

Selecionar tudo

FRM-30162: Inconsistent relationship between window NAVIGATOR and its vertical toolbar .
Window NAVIGATOR
Tem como me ajudarem por favor !!!!

Obrigado
tomgmf
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 10 Abr 2006 5:00 pm
Localização: Guarujá - SP

Oi gente, funcionou sim, agora eu to tentando alerar o código para existir mais um nó... mas não estou conseguindo, se alguém puder me ajudar eu agradeceria muito !!!

Até mais... fico no aguardo,

Tom
Cleiton_Ramos
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 01 Jun 2006 8:22 pm
Localização: são paulo

Criar essa package no forms (espeficação)

Selecionar tudo

PACKAGE PKG_TREE IS

RG_AREA      RECORDGROUP; -- NOME DO RECORD GROUP QUE SERÁ CRIADO
RG_NAME      VARCHAR2(30) := 'TREE_RG';
V_STATE      GROUPCOLUMN; 
V_LEVEL      GROUPCOLUMN;
V_LABEL      GROUPCOLUMN;
V_ICON       GROUPCOLUMN;
V_VALUE      GROUPCOLUMN;
TREE_ID      ITEM := FIND_ITEM('MENU.DS_MENU');

------------------------------------
--- Rotina que Inicia o Processo ---
------------------------------------
  PROCEDURE  START_TREE;
  
-----------------------------------------------------------
--- Rotina que Lê os dados para serem adicionados no RG ---
-----------------------------------------------------------
  FUNCTION LOAD_TREE RETURN BOOLEAN;
  
-----------------------------------------
--- Rotina que Define o RG (estrutura) --
-----------------------------------------
  PROCEDURE DEFINE_RG;
  
-------------------------------------------------
--- Rotina que Adiciona dados no Record Group ---
-------------------------------------------------
  PROCEDURE ADD_NODE (NODENUM   IN NUMBER,   -- NUMERO DA LINHA
                      NODESTATE IN NUMBER,   
                      NODELEVEL IN NUMBER,   
                      NODELABEL IN VARCHAR2,
                      NODEICON  IN VARCHAR2,
                      NODEVALUE IN VARCHAR2);
END;

Criar o corpo da package :
PACKAGE BODY PKG_TREE IS
------------------------------------
--- Rotina que Inicia o Processo ---
------------------------------------
  PROCEDURE START_TREE IS
   BEGIN
   	-- SE O RECORD GROUP FOI CARREGADO, ATRIBUI O RG AO ITEM DS_MENU
   	IF (PKG_TREE.LOAD_TREE) THEN
    	FTREE.SET_TREE_PROPERTY(TREE_ID,FTREE.RECORD_GROUP,RG_AREA);
    END IF;	
   	
   END;
-----------------------------------------
--- Rotina que Define o RG (estrutura) --
-----------------------------------------
  PROCEDURE DEFINE_RG IS
   BEGIN
    RG_AREA := FIND_GROUP(RG_NAME);
    -- CRIA O GROUP --
    RG_AREA := CREATE_GROUP (RG_NAME);
   
    -- MONTA A ESTRUTURA DO RECORD GROUP --
    V_STATE      := ADD_GROUP_COLUMN(RG_AREA,'INIT_STATE',NUMBER_COLUMN) ;  
    V_LEVEL      := ADD_GROUP_COLUMN(RG_AREA,'V_LEVEL'   ,NUMBER_COLUMN) ; 
    V_LABEL      := ADD_GROUP_COLUMN(RG_AREA,'LABEL'     ,CHAR_COLUMN,90) ;
    V_ICON       := ADD_GROUP_COLUMN(RG_AREA,'ICON'      ,CHAR_COLUMN,50) ;
    V_VALUE      := ADD_GROUP_COLUMN(RG_AREA,'VALUE'     ,CHAR_COLUMN,15) ; 
  END;

-------------------------------------------------
--- Rotina que Adiciona dados no Record Group ---
-------------------------------------------------
  PROCEDURE ADD_NODE (NODENUM   IN NUMBER,   -- NUMERO DA LINHA
                      NODESTATE IN NUMBER,   
                      NODELEVEL IN NUMBER,   
                      NODELABEL IN VARCHAR2,
                      NODEICON  IN VARCHAR2,
                      NODEVALUE IN VARCHAR2)
   IS
    BEGIN
      ADD_GROUP_ROW        (PKG_TREE.RG_AREA,NODENUM);	
      SET_GROUP_NUMBER_CELL(V_STATE         ,NODENUM,NODESTATE); -- (1 MENU EXPANDIDO) (-1 MENU NÃO EXPANDIDO)  
 	    SET_GROUP_NUMBER_CELL(V_LEVEL         ,NODENUM,NODELEVEL);
 	    SET_GROUP_CHAR_CELL  (V_LABEL         ,NODENUM,NODELABEL);
 	    SET_GROUP_CHAR_CELL  (V_ICON          ,NODENUM,NODEICON );
 	    SET_GROUP_CHAR_CELL  (V_VALUE         ,NODENUM,NODEVALUE);	 
    END;                   

-----------------------------------------------------------
--- Rotina que Lê os dados para serem adicionados no RG ---
-----------------------------------------------------------
  FUNCTION LOAD_TREE RETURN BOOLEAN IS
  -- SELECT QUE DEFINE A HIERARQUIA A SER CONSTRUIDA --
  CURSOR C_MENU IS
   SELECT LEVEL, 
          CD_MENU, 
          initcap(DS_MENU)DS_MENU
     FROM MENUS
  CONNECT BY PRIOR CD_MENU = ITEM_CD_MENU
  START WITH ITEM_CD_MENU IS NULL;
 
 
 V_LINHA     INTEGER;
 V_CONTA_REG INTEGER;
 
 BEGIN
 	 -- MONTA A ESTRUTURA DO RECORD GROUP --  
   PKG_TREE.DEFINE_RG;
   
   V_LINHA     := 1;
   V_CONTA_REG := 0;
   
   FOR C_REG IN C_MENU LOOP
   	 -- ADICIONA UMA LINHA NO RECORD GROUP --
   	 PKG_TREE.ADD_NODE(V_LINHA,-1,C_REG.LEVEL,C_REG.DS_MENU,NULL,NULL); 
  	 -- SOMA 1 LINHA
  	 V_LINHA := V_LINHA  + 1;
  	 V_CONTA_REG := 1;
  END LOOP;
  
  -- RETORNA 'True' SE O CURSOR RETORNOU REGISTROS E CARREGOU O RECORD GROUP --
  IF (V_CONTA_REG = 1) THEN
  	RETURN(TRUE);
  ELSE
  	RETURN(FALSE);
  END IF;
 END ; 
END pkg_tree;
Crie um canvas com um bloco(menu) e um item hierarchical tree com o nome DS_MENU


No form instance, coloque a chamada para START_TREE.

Espero ter ajudado.
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Eu Acredito que o que você quer é isso:
Eu tenho um Plano de contas Contabeis que uso esta forma de montagem para a arvore. veja o exemplo:

Selecionar tudo

RG_EMPS := Create_Group_From_Query('rg_emps',
           ' SELECT -1, LEVEL, CD_CONTACONTABIL||'' - ''||NM_CONTACONTABIL, ''PROXIMO'', CD_CONTACONTABIL 
               FROM PLANOCONTABIL
            CONNECT BY PRIOR CD_CONTACONTABIL = CD_CTACTBMAE
              START WITH CD_CTACTBMAE IS NULL
              ORDER BY CD_CLASSIFCONTABIL');
v_ignore := Populate_Group(rg_emps);
   
Ftree.Set_Tree_Property('CONSULTAPLANO.ARVORE', Ftree.RECORD_GROUP, rg_emps);
vejan algumas linhas do record Group

Selecionar tudo

-1         LEVEL      CD_CONTACONTABIL||'-'||NM_CONTACONTABIL                                          'PROXIM CD_CONTACO
---------- ---------- -------------------------------------------------------------------------------- ------- ----------
        -1          1 100009 - ATIVO                                                                   PROXIMO     100009
        -1          2 110000 - CIRCULANTE                                                              PROXIMO     110000
        -1          3 110015 - DISPONIBILIDADES                                                        PROXIMO     110015
        -1          4 110020 - DISPONIBILIDADES                                                        PROXIMO     110020
        -1          5 110034 - CAIXA GERAL                                                             PROXIMO     110034
        -1          6 110049 - CAIXA                                                                   PROXIMO     110049
        -1          6 111164 - CAIXA-SEMEADOR                                                          PROXIMO     111164
        -1          6 110825 - TRANSACOES FINANCEIRAS - MATRIZ/FILIAIS                                 PROXIMO     110825
        -1          6 110051 - TESOURARIA                                                              PROXIMO     110051
        -1          5 110053 - BANCOS C/ MOVIMENTO                                                     PROXIMO     110053
        -1          6 110119 - BANCO BOA VISTA S/A                                                     PROXIMO     110119
        -1          6 110072 - BANCO BRADESCO S/A                                                      PROXIMO     110072

Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Ixxx....deixa eu tirar os espeços um pouco

Selecionar tudo

-1         LEVEL      CD_CONTACONTABIL||'-'||NM_CONTACONTABIL  'PROXIM CD_CONTACO
---------- ---------- ---------------------------------------- ------- ----------
        -1          1 100009 - ATIVO                           PROXIMO     100009
        -1          2 110000 - CIRCULANTE                      PROXIMO     110000
        -1          3 110015 - DISPONIBILIDADES                PROXIMO     110015
        -1          4 110020 - DISPONIBILIDADES                PROXIMO     110020
        -1          5 110034 - CAIXA GERAL                     PROXIMO     110034
        -1          6 110049 - CAIXA                           PROXIMO     110049
        -1          6 111164 - CAIXA-SEMEADOR                  PROXIMO     111164
        -1          6 110825 - TRANSACOES FINANCEIRAS - MATRIZ PROXIMO     110825
        -1          6 110051 - TESOURARIA                      PROXIMO     110051
        -1          5 110053 - BANCOS C/ MOVIMENTO             PROXIMO     110053
        -1          6 110119 - BANCO BOA VISTA S/A             PROXIMO     110119
        -1          6 110072 - BANCO BRADESCO S/A              PROXIMO     110072
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Estou com seguinte problema:

Preciso pegar o valor de uma das linhas das árvores, assim que ele for selecionado para poder pegar o valor e usar como condição WHERE de um outro bloco.

Estou usando o seguinte código, na trigger WHEN-TREE-NODE-SELECTED:

Selecionar tudo

DECLARE

cr_n FTREE.NODE;
valor varchar2(100);
BEGIN

cr_n := Ftree.Get_Tree_Selection('NAV_DISPLAY', 1);

valor := Ftree.Get_Tree_Node_Property('NAV_DISPLAY',cr_n, Ftree.NODE_VALUE);
mostra_men('I*',VALOR);

END;
Só que ele me traz sempre o valor da primeira e principal linha.

Assim:

Selecionar tudo


135
...132
...133
...134
.....135
.....135
.....137
...138
E independente de qual linha eu clico, ele seleciona sempre 135.

O que estou fazendo de errado??

Obrigado!
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Pessoal, resolvi o problema mudando o modo como a Tree buscava os dados. Mudei de RecordGroup para Data Query Text.
:D
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Ah claro, o código usado para isso:

Selecionar tudo


PROCEDURE refresh_trees IS

   V_ID_MASTER number := :GLOBAL.V_CLI;
   
   v_query varchar2(4000);
  

begin
	 SET_APPLICATION_PROPERTY(CURSOR_STYLE,'BUSY');
	 message('Carregando Rede de Clientes...');
   --
   IF (GET_APPLICATION_PROPERTY(USER_INTERFACE) = 'WEB' ) THEN
   	
   	   v_query := 'select DECODE(LEVEL, 1,1,
                     					      2,1,
                     					      3,1,
                     						    -1 ) state, level lvl, 
                  (id_cli||'' - ''||nm_cli) displ_val, null icn, id_cli val
                  from cliente
                  connect by prior id_cli = id_cli_pai
                  start with id_cli = '||V_ID_MASTER;   	  
   ELSE
   	   v_query := 'select 1 state, level lvl, (id_cli||'' - ''||nm_cli) displ_val, null icn, id_cli val
                  from cliente
                  connect by prior id_cli = id_cli_pai
                  start with id_cli = '||V_ID_MASTER;
   END IF;               
               
    ftree.set_tree_property('navigator.nav_display', ftree.QUERY_TEXT, v_query);
    SET_APPLICATION_PROPERTY(CURSOR_STYLE,'DEFAULT');
end;

Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Pessoa, to tentando implementar uma progress bar que vai crescendo de acordo com o preenchimento da tree.

Existe alguma trigger que é ativada quando um nó é adicionado à árvore?

A idéia era contar o total de nós adicionados até então, e ir fazendo a barra crescer até 100% (total de nós esperado na tree, previamente calculado).

Alguém conhece alguma maneira de ir executando esse processo ao mesmo tempo que a árvore é preenchida?

:?:
davidcastilholi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

Boa tarde, não consegui fazer o download do Forms_Tree, pode me enviar em meu email

http://www.glufke.net/oracle/download/Forms_Tree.zip
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Veja se você consegue accessar via HTTPS:

https://www.glufke.net/oracle/download/Forms_Tree.zip
Se não funcionar, tenta copiar e colar esse endereço na URL.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Bing [Bot], Majestic-12 [Bot] e 3 visitantes