Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: JSON Schema Validation: A Comprehensive Guide

# JSON Schema Validation: A Comprehensive Guide ## Understanding JSONSchemaValidator Ensuring the integrity and compliance of JSON data is crucial for modern applications. **JSONSchemaValidator** is a powerful class designed to validate JSON data against a specified JSON Schema. It provides robust methods to check types, patterns, numerical constraints, required properties, and both internal and external schema references. This guide breaks down the key features and functionalities of JSONSchemaValidator, making it easier for developers to implement schema validation effectively. 🔗 **GitHub Repository:** [JSONSchemaValidator](https://github.com/naldodj/naldodj-hb-jsonschema-validator) --- ## Key Features ✅ **Schema-Based Validation** – Ensures JSON data conforms to a predefined schema. ✅ **Error Handling & Logging** – Captures validation errors for debugging. ✅ **Fast Mode Support** – Stops validation upon detecting the first error. ✅ **Internal & External Reference ...

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