Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

Protheus :: Advpl :: Resolvendo a Limitação da ClassMethArr() com __ClsArr()

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

Comentários

  1. Parabens Naldo, otima abordagem do assunto.
    Seu blog esta mto completo, mta documentação util encontramos aqui.
    Obrigado em nome de todos ;D

    ResponderExcluir
  2. 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.
    Obrigado e parabéns pelo blog!

    ResponderExcluir
    Respostas
    1. 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.

      Excluir
    2. vou usar o exemplo do TDN (Exemplo de DBTREE http://tdn.totvs.com.br/kbm#15144) para exemplificar melhor

      Excluir
  3. Obrigado 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.

    Bem 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

    ResponderExcluir
  4. Naldo, bom dia.

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

    ResponderExcluir

Postar um comentário

Postagens mais visitadas