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)