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 ...