Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

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 deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã