Ajude o site desativando o bloqueador de anúncio
Cabeçalho

ADVPL Browse com json, tcbrowser tccolumn

Autor: Eurai Criado: 08/11/2025 Atualizado: 12/11/2025 ADVPL
Postagem

💻 ADVPL – Exemplo de TcBrowse com JSON e TcColumn

Neste artigo, vamos demonstrar como utilizar o TcBrowse no ADVPL em conjunto com objetos JSON para exibir e manipular dados de forma dinâmica e estruturada. Esse recurso é muito útil para gerar grids de navegação flexíveis e modernas dentro do ambiente Protheus.

✅ Exemplo prático em ADVPL

O exemplo abaixo mostra como montar uma consulta SQL, converter os resultados para JSON e exibir em uma TcBrowse com múltiplas colunas configuradas dinamicamente:

function tcBrowseJson()

    // Fecha área anterior, se aberta
    If Select('QrySE2') > 0
        QrySE2->( dbCloseArea() )
    Endif

    // Monta a query SQL dinamicamente
    cQuery := cCRLF + "SELECT "
    cQuery += cCRLF + " A2_BANCO, A2_AGENCIA, A2_DVAGE, A2_NUMCON, A2_DVCTA, "
    cQuery += cCRLF + " SE2.R_E_C_N_O_ E2RECNO, E2_FORBCO, E2_FORAGE, E2_FAGEDV, E2_FORCTA, E2_FCTADV, "
    cQuery += cCRLF + " E2_NUM, E2_PREFIXO, E2_LOJA, E2_FORNECE "
    cQuery += cCRLF + " FROM " + RetSqlName('SE2') + " SE2 "
    cQuery += cCRLF + " INNER JOIN " + RetSqlName('SA2') + " SA2 "
    cQuery += cCRLF + " ON " + FWJoinFilial('SA2', 'SE2')
    cQuery += cCRLF + " AND E2_FORNECE = A2_COD "
    cQuery += cCRLF + " AND E2_LOJA    = A2_LOJA "
    cQuery += cCRLF + " WHERE E2_FILIAL = '" + xFilial('SE2') + "' "
    cQuery += cCRLF + " AND A2_BANCO != ' ' "
    cQuery += cCRLF + " AND A2_BANCO != E2_FORBCO "
    cQuery += cCRLF + " AND A2_NUMCON != A2_NUMCON "
    cQuery += cCRLF + " AND E2_SALDO > 0 "
    cQuery += cCRLF + " AND SE2.D_E_L_E_T_ = ' ' "

    // Executa a query
    MPSysOpenQuery(cQuery, 'QrySE2')

    // Monta o JSON com os resultados
    Do While QrySE2->(!EOF())
        jBody := JsonObject():New()

        jBody['E2_NUM']      := QrySE2->E2_NUM
        jBody['E2_PREFIXO']  := QrySE2->E2_PREFIXO
        jBody['E2_FORNECE']  := QrySE2->E2_FORNECE
        jBody['E2_LOJA']     := QrySE2->E2_LOJA
        jBody['A2_BANCO']    := QrySE2->A2_BANCO
        jBody['A2_AGENCIA']  := QrySE2->A2_AGENCIA
        jBody['A2_DVAGE']    := QrySE2->A2_DVAGE
        jBody['A2_NUMCON']   := QrySE2->A2_NUMCON
        jBody['A2_DVCTA']    := QrySE2->A2_DVCTA
        jBody['E2_FORBCO']   := QrySE2->E2_FORBCO
        jBody['E2_FORAGE']   := QrySE2->E2_FORAGE
        jBody['E2_FAGEDV']   := QrySE2->E2_FAGEDV
        jBody['E2_FORCTA']   := QrySE2->E2_FORCTA
        jBody['E2_FCTADV']   := QrySE2->E2_FCTADV
        jBody['E2RECNO']     := QrySE2->E2RECNO

        aAdd(aRep01, jBody)
        QrySE2->( dbSkip() )
    EndDo
    QrySE2->( dbCloseArea() )

    If Empty(aRep01)
        MsgInfo('Sem Dados', 'BSFINA05')
        Return(Nil)
    EndIf

    // Atalhos de marcação
    SetKey(VK_F4, { || CursorWait(), BSGENC01():BrwMarca(0, aRep01, oRep01, 1, 'LCHECK'), CursorArrow() })
    SetKey(VK_F5, { || CursorWait(), BSGENC01():BrwMarca(2, aRep01, oRep01, 1, 'LCHECK'), CursorArrow() })
    SetKey(VK_F6, { || CursorWait(), BSGENC01():BrwMarca(3, aRep01, oRep01, 1, 'LCHECK'), CursorArrow() })

    // Cria a janela e o browse
    oDlg := MSDialog():New(000,000,520,830,'Atualizar Banco',,,, .F.,,,,,,.T.,,,.T.)
    oPnlItens := TPanel():NEW(000, 000, '', oDlg, , .T., , CLR_BLUE, , 000, 000, .T., .T.)
    oPnlItens:Align := CONTROL_ALIGN_ALLCLIENT

    oRep01 := TcBrowse():New(010,010,258,195,,,,oPnlItens,,,,,,,,,,,,.f.,,.t.,,.f.,,,,)
    oRep01:Align := CONTROL_ALIGN_ALLCLIENT

    // Define colunas do browse
    oRep01:AddColumn(TcColumn():New(" ", { || If(aRep01[oRep01:nAt]['LCHECK'], oOk, oNo) }, "@!",,, "CENTER",015,.t.,.f.))
    oRep01:AddColumn(TcColumn():New("Número", { || aRep01[oRep01:nAt]['E2_NUM'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Prefixo", { || aRep01[oRep01:nAt]['E2_PREFIXO'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Fornecedor", { || aRep01[oRep01:nAt]['E2_FORNECE'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Loja", { || aRep01[oRep01:nAt]['E2_LOJA'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Banco", { || aRep01[oRep01:nAt]['A2_BANCO'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Agência", { || aRep01[oRep01:nAt]['A2_AGENCIA'] + '-' + aRep01[oRep01:nAt]['A2_DVAGE'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Conta", { || aRep01[oRep01:nAt]['A2_NUMCON'] + '-' + aRep01[oRep01:nAt]['A2_DVCTA'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Banco Fornecedor", { || aRep01[oRep01:nAt]['E2_FORBCO'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Agência Fornecedor", { || aRep01[oRep01:nAt]['E2_FORAGE'] + '-' + aRep01[oRep01:nAt]['E2_FAGEDV'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("Conta Fornecedor", { || aRep01[oRep01:nAt]['E2_FORCTA'] + '-' + aRep01[oRep01:nAt]['E2_FCTADV'] }, "@!",,, "CENTER",030))
    oRep01:AddColumn(TcColumn():New("RECNO", { || aRep01[oRep01:nAt]['E2RECNO'] }, "@!",,, "CENTER",030))

Return(Nil)

📘 Conclusão

Este exemplo mostra o poder do TcBrowse quando combinado com objetos JSON no ADVPL. Essa abordagem facilita a manipulação de dados, tornando o código mais limpo e a interface de exibição muito mais flexível.

💡 Dica: use teclas de atalho como F4, F5 e F6 para marcar registros dinamicamente no browse.


👍 Gostou do conteúdo?
Compartilhe com seus colegas de desenvolvimento e deixe um comentário abaixo! 😎

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL