Regazzo estava manipulando a Classe dbTree e perguntou-me como fazer para “recolher” todos os “Nodes”, respondi: “Não Sei”. Deixe-me Pesquisar. 
 Usando ClassMethArr() para obter os Métodos da Classe dbTree percebi, pela descrição, que nenhum dos métodos listados iria resolver o seu problema. 
 Então, usei __ClsArr() para obter a Lista das Classes passiveis de uso em ADVPL e deparei-me com a TTREE. Presumi que TTREE era a Classe Base e, que dbTree, provavelmente, era derivada dela.
 O problema com ClassMethArr() é que ela só lista os Métodos Específicos da Classe cujo objeto é passado como parâmetro. Os Métodos Herdados não são Listados. 
 Para isso temos que descobrir qual a Classe Base para, a partir daí, tentar descobrir o Método que irá atender à nossa necessidade. Neste caso, “recolher” todos os “Nodes” do Tree. O Método, em questão, é o PTCOLLAPSE().
 Os Métodos da Classe TTree estão Listados abaixo:
    TTree:Methods -> ARRAY (17) [...]      TTree:Methods[1] -> ARRAY (2) [...]           TTree:Methods[1][1] -> C (11) [BEGINUPDATE]           TTree:Methods[1][2] -> ARRAY (0) [...]      TTree:Methods[2] -> ARRAY (2) [...]           TTree:Methods[2][1] -> C (9) [ENDUPDATE]           TTree:Methods[2][2] -> ARRAY (0) [...]      TTree:Methods[3] -> ARRAY (2) [...]           TTree:Methods[3][1] -> C (3) [NEW]           TTree:Methods[3][2] -> ARRAY (0) [...]      TTree:Methods[4] -> ARRAY (2) [...]           TTree:Methods[4][1] -> C (15) [PTADDARRAYNODES]           TTree:Methods[4][2] -> ARRAY (0) [...]      TTree:Methods[5] -> ARRAY (2) [...]           TTree:Methods[5][1] -> C (10) [PTADDNODES]           TTree:Methods[5][2] -> ARRAY (0) [...]      TTree:Methods[6] -> ARRAY (2) [...]           TTree:Methods[6][1] -> C (11) [PTCHANGEBMP]           TTree:Methods[6][2] -> ARRAY (0) [...]      TTree:Methods[7] -> ARRAY (2) [...]           TTree:Methods[7][1] -> C (14) [PTCHANGEPROMPT]           TTree:Methods[7][2] -> ARRAY (0) [...]      TTree:Methods[8] -> ARRAY (2) [...]           TTree:Methods[8][1] -> C (10) [PTCOLLAPSE]           TTree:Methods[8][2] -> ARRAY (0) [...]      TTree:Methods[9] -> ARRAY (2) [...]           TTree:Methods[9][1] -> C (19) [PTDELETECURRENTNODE]           TTree:Methods[9][2] -> ARRAY (0) [...]      TTree:Methods[10] -> ARRAY (2) [...]           TTree:Methods[10][1] -> C (10) [PTGETNIVEL]           TTree:Methods[10][2] -> ARRAY (0) [...]      TTree:Methods[11] -> ARRAY (2) [...]           TTree:Methods[11][1] -> C (14) [PTGETNODECOUNT]           TTree:Methods[11][2] -> ARRAY (0) [...]      TTree:Methods[12] -> ARRAY (2) [...]           TTree:Methods[12][1] -> C (11) [PTGETPROMPT]           TTree:Methods[12][2] -> ARRAY (0) [...]      TTree:Methods[13] -> ARRAY (2) [...]           TTree:Methods[13][1] -> C (12) [PTGOTOTONODE]           TTree:Methods[13][2] -> ARRAY (0) [...]      TTree:Methods[14] -> ARRAY (2) [...]           TTree:Methods[14][1] -> C (7) [PTRESET]           TTree:Methods[14][2] -> ARRAY (0) [...]      TTree:Methods[15] -> ARRAY (2) [...]           TTree:Methods[15][1] -> C (11) [PTSENDNODES]           TTree:Methods[15][2] -> ARRAY (0) [...]      TTree:Methods[16] -> ARRAY (2) [...]           TTree:Methods[16][1] -> C (10) [PTSENDTREE]           TTree:Methods[16][2] -> ARRAY (0) [...]      TTree:Methods[17] -> ARRAY (2) [...]           TTree:Methods[17][1] -> C (9) [SETSCROLL]           TTree:Methods[17][2] -> ARRAY (0) [...]  | 
Já, os Métodos, específicos da dbTree, listo abaixo:
dbTree:Methods -> ARRAY (27) [...]      dbTree:Methods[1] -> ARRAY (2) [...]           dbTree:Methods[1][1] -> C (7) [ADDITEM]           dbTree:Methods[1][2] -> ARRAY (7) [...]                dbTree:Methods[1][2][1] -> C (7) [CPROMPT]                dbTree:Methods[1][2][2] -> C (6) [CCARGO]                dbTree:Methods[1][2][3] -> C (5) [CRES1]                dbTree:Methods[1][2][4] -> C (5) [CRES2]                dbTree:Methods[1][2][5] -> C (6) [CFILE1]                dbTree:Methods[1][2][6] -> C (6) [CFILE2]                dbTree:Methods[1][2][7] -> C (5) [NTIPO]      dbTree:Methods[2] -> ARRAY (2) [...]           dbTree:Methods[2][1] -> C (7) [ADDTREE]           dbTree:Methods[2][2] -> ARRAY (7) [...]                dbTree:Methods[2][2][1] -> C (7) [CPROMPT]                dbTree:Methods[2][2][2] -> C (7) [LOPENED]                dbTree:Methods[2][2][3] -> C (5) [CRES1]                dbTree:Methods[2][2][4] -> C (5) [CRES2]                dbTree:Methods[2][2][5] -> C (6) [CFILE1]                dbTree:Methods[2][2][6] -> C (6) [CFILE2]                dbTree:Methods[2][2][7] -> C (6) [CCARGO]      dbTree:Methods[3] -> ARRAY (2) [...]           dbTree:Methods[3][1] -> C (11) [ADDTREEITEM]           dbTree:Methods[3][2] -> ARRAY (4) [...]                dbTree:Methods[3][2][1] -> C (7) [CPROMPT]                dbTree:Methods[3][2][2] -> C (5) [CRES1]                dbTree:Methods[3][2][3] -> C (6) [CFILE1]                dbTree:Methods[3][2][4] -> C (6) [CCARGO]      dbTree:Methods[4] -> ARRAY (2) [...]           dbTree:Methods[4][1] -> C (8) [BUILDTRB]           dbTree:Methods[4][2] -> ARRAY (2) [...]                dbTree:Methods[4][2][1] -> C (7) [NLENTXT]                dbTree:Methods[4][2][2] -> C (9) [NLENCARGO]      dbTree:Methods[5] -> ARRAY (2) [...]           dbTree:Methods[5][1] -> C (9) [CHANGEBMP]           dbTree:Methods[5][2] -> ARRAY (5) [...]                dbTree:Methods[5][2][1] -> C (5) [CRES1]                dbTree:Methods[5][2][2] -> C (5) [CRES2]                dbTree:Methods[5][2][3] -> C (6) [CFILE1]                dbTree:Methods[5][2][4] -> C (6) [CFILE2]                dbTree:Methods[5][2][5] -> C (6) [CCARGO]      dbTree:Methods[6] -> ARRAY (2) [...]           dbTree:Methods[6][1] -> C (12) [CHANGEPROMPT]           dbTree:Methods[6][2] -> ARRAY (2) [...]                dbTree:Methods[6][2][1] -> C (10) [CNEWPROMPT]                dbTree:Methods[6][2][2] -> C (6) [CCARGO]      dbTree:Methods[7] -> ARRAY (2) [...]           dbTree:Methods[7][1] -> C (7) [DEFAULT]           dbTree:Methods[7][2] -> ARRAY (0) [...]      dbTree:Methods[8] -> ARRAY (2) [...]           dbTree:Methods[8][1] -> C (9) [DELETEALL]           dbTree:Methods[8][2] -> ARRAY (1) [...]                dbTree:Methods[8][2][1] -> C (4) [CPAI]      dbTree:Methods[9] -> ARRAY (2) [...]           dbTree:Methods[9][1] -> C (7) [DELITEM]           dbTree:Methods[9][2] -> ARRAY (0) [...]      dbTree:Methods[10] -> ARRAY (2) [...]           dbTree:Methods[10][1] -> C (7) [DISPLAY]           dbTree:Methods[10][2] -> ARRAY (0) [...]      dbTree:Methods[11] -> ARRAY (2) [...]           dbTree:Methods[11][1] -> C (7) [ENDTREE]           dbTree:Methods[11][2] -> ARRAY (0) [...]      dbTree:Methods[12] -> ARRAY (2) [...]           dbTree:Methods[12][1] -> C (11) [FINDLASTSUN]           dbTree:Methods[12][2] -> ARRAY (2) [...]                dbTree:Methods[12][2][1] -> C (6) [NRECNO]                dbTree:Methods[12][2][2] -> C (4) [NMAX]      dbTree:Methods[13] -> ARRAY (2) [...]           dbTree:Methods[13][1] -> C (8) [GETCARGO]           dbTree:Methods[13][2] -> ARRAY (1) [...]                dbTree:Methods[13][2][1] -> C (4) [CKEY]      dbTree:Methods[14] -> ARRAY (2) [...]           dbTree:Methods[14][1] -> C (9) [GETPROMPT]           dbTree:Methods[14][2] -> ARRAY (1) [...]                dbTree:Methods[14][2][1] -> C (10) [LCOMESPACO]      dbTree:Methods[15] -> ARRAY (2) [...]           dbTree:Methods[15][1] -> C (7) [ISEMPTY]           dbTree:Methods[15][2] -> ARRAY (0) [...]      dbTree:Methods[16] -> ARRAY (2) [...]           dbTree:Methods[16][1] -> C (3) [NEW]           dbTree:Methods[16][2] -> ARRAY (10) [...]                dbTree:Methods[16][2][1] -> C (4) [NTOP]                dbTree:Methods[16][2][2] -> C (5) [NLEFT]                dbTree:Methods[16][2][3] -> C (7) [NBOTTOM]                dbTree:Methods[16][2][4] -> C (6) [NRIGHT]                dbTree:Methods[16][2][5] -> C (4) [OWND]                dbTree:Methods[16][2][6] -> C (7) [UCHANGE]                dbTree:Methods[16][2][7] -> C (7) [URCLICK]                dbTree:Methods[16][2][8] -> C (6) [LCARGO]                dbTree:Methods[16][2][9] -> C (8) [LDISABLE]                dbTree:Methods[16][2][10] -> C (5) [OFONT]      dbTree:Methods[17] -> ARRAY (2) [...]           dbTree:Methods[17][1] -> C (5) [NIVEL]           dbTree:Methods[17][2] -> ARRAY (0) [...]      dbTree:Methods[18] -> ARRAY (2) [...]           dbTree:Methods[18][1] -> C (5) [PTEND]           dbTree:Methods[18][2] -> ARRAY (0) [...]      dbTree:Methods[19] -> ARRAY (2) [...]           dbTree:Methods[19][1] -> C (9) [PTREFRESH]           dbTree:Methods[19][2] -> ARRAY (0) [...]      dbTree:Methods[20] -> ARRAY (2) [...]           dbTree:Methods[20][1] -> C (19) [PTSRVUPDATEPOSITION]           dbTree:Methods[20][2] -> ARRAY (0) [...]      dbTree:Methods[21] -> ARRAY (2) [...]           dbTree:Methods[21][1] -> C (13) [PTUPDATENODES]           dbTree:Methods[21][2] -> ARRAY (1) [...]                dbTree:Methods[21][2][1] -> C (6) [CLEVEL]      dbTree:Methods[22] -> ARRAY (2) [...]           dbTree:Methods[22][1] -> C (7) [PTVALID]           dbTree:Methods[22][2] -> ARRAY (2) [...]                dbTree:Methods[22][2][1] -> C (11) [CNODEATU_ID]                dbTree:Methods[22][2][2] -> C (10) [CNODEGO_ID]      dbTree:Methods[23] -> ARRAY (2) [...]           dbTree:Methods[23][1] -> C (5) [RESET]           dbTree:Methods[23][2] -> ARRAY (0) [...]      dbTree:Methods[24] -> ARRAY (2) [...]           dbTree:Methods[24][1] -> C (10) [SETDISABLE]           dbTree:Methods[24][2] -> ARRAY (0) [...]      dbTree:Methods[25] -> ARRAY (2) [...]           dbTree:Methods[25][1] -> C (9) [SETENABLE]           dbTree:Methods[25][2] -> ARRAY (0) [...]      dbTree:Methods[26] -> ARRAY (2) [...]           dbTree:Methods[26][1] -> C (5) [TOTAL]           dbTree:Methods[26][2] -> ARRAY (0) [...]      dbTree:Methods[27] -> ARRAY (2) [...]           dbTree:Methods[27][1] -> C (8) [TREESEEK]           dbTree:Methods[27][2] -> ARRAY (1) [...]                dbTree:Methods[27][2][1] -> C (6) [CCHAVE]  | 
Lembrando que __ClsArr() retorna um Array com as Classes e __FunArr() retorna um Array com as Funções da “API” do Protheus. 
[]s 
иαldσ dj
  
 
Parabens Naldo, otima abordagem do assunto.
ResponderExcluirSeu blog esta mto completo, mta documentação util encontramos aqui.
Obrigado em nome de todos ;D
Bom dia, reabrindo a discussão sobre DbTree, como percorrer os nodes? Não encontrei em lugar nenhum algum exemplo que permita fazer um loop nos nodes de um DbTree. Meu maior problema é em relacionar o node superior com seus filhos.
ResponderExcluirObrigado e parabéns pelo blog!
A tabela criada pela dbTree possui 2 campos em que guarda, no primeiro o código do Tree e no segudo o Node a que pertence. Consequentemente possui 2 chaves. A ordem 1 é pelo Tree, a 2 é pelo Node (Superior). Para achar a quem pertencem os filhos basta pesquisar pela chave 2 e obter os itens da chave 1.
Excluirvou usar o exemplo do TDN (Exemplo de DBTREE http://tdn.totvs.com.br/kbm#15144) para exemplificar melhor
ExcluirObrigado Naldo, vou ficar no aguardo do exemplo, procurei pelos atributos do objeto Tree, mas o que eu achei que funcionaria não deu certo tentei trabalhar com o atributo CURRENTNODEID, mas alterando ele não altera em nada o ponteiro dos dados.
ResponderExcluirBem que poderia existir um método nextNode, prevNode pra facilitar nossa vida!
É normal o Tree demorar para ser preenchido? Ou pode ser a lógica que estou usando? Pois pra preencher uns 1000 registros demora uns 5 minutos e a query retorna em menos de 1 segundo...
mais uma vez obrigado
Naldo, bom dia.
ResponderExcluirCom relação ao problema inicial, vocês conseguiram? Estou tentando fazer com que o controle, só deixe aberto, o item que o usuario está, fechando todos os outros. Veja o código que estou tentando, mas ao invés de fechar todos, ele está abrindo todos.
for i = 1 to oDBTree:Total() //percorre todos os itens
if (oDBTree:TreeSeek(CVALTOCHAR(i))) //se achar o item
//verifica se é o atual, se não for fecha
if (cvaltochar(i) = pCargo)
else
oDBTree:PTCOLLAPSE()
endif
endif
next i
oDBTree:TreeSeek(pCargo) //volta a seleção para o que o usuario escolheu
desde já, muito obrigado ...