Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Como Criar Relatórios de Cotações com Dados Agrupados Usando SQL

img: DALL·E 2024-08-09 07.00.00 - A high-quality image showcasing a detailed SQL query being written in a code editor, such as VS Code, on a dark theme background. ... ## Como Criar Relatórios de Cotações com Dados Agrupados Usando SQL Quando trabalhamos com sistemas ERP e precisamos gerar relatórios de cotações que apresentam dados de múltiplos fornecedores, é comum encontrarmos a necessidade de pivotar registros que, originalmente, são apresentados de forma vertical. Isso é especialmente útil quando o objetivo é comparar preços ou condições de diferentes fornecedores para um mesmo produto em uma única linha do relatório. Neste artigo, vamos explorar uma abordagem para transformar registros verticais em colunas, facilitando a impressão de relatórios que consolidam informações de vários fornecedores em uma única linha. Vamos utilizar SQL com técnicas de pivotagem, e ao final, mostraremos como estender essa técnica para um número variável de fornecedores. ### Estrutura do Relatór

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