Exemplo de consulta a Cotação do Dólar via AdvPL

No artigo de hoje, vamos demonstrar como consultar a cotação do dólar através de uma API do Banco Central.

Antes de começarmos, esse exemplo foi disponibilizado pelo grande Thiago Andrrade ( LinkedIn ).

O funcionamento é realizado uma busca na API Cotação do Dolar Ptax, que é uma API Oficial do Banco Central ( https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/documentacao ).

Basicamente você monta um FWRest, passa a informação de data atual, e os dados são retornados. Abaixo um print em um MsgInfo:

Mensagem de Exemplo

Abaixo o código fonte feito pelo Thiago:

#include "Totvs.ch"
#Include "Tbiconn.ch"
 
//=================================================================================
/*/{Protheus.doc} zApiDol
Api | Cotação do Dolar Ptax, Api Oficial do Banco Central
https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/documentacao
Api Dolar Ptax Banco Central x Advpl
@type       function
@author     Thiago.Andrrade
@since      04/03/2021
@version    1.1
/*/
//=================================================================================
User function zApiDol()   
    Local aHeader     := {}
    Local cDataPtx    := ''//MM-DD-AAAA
    Local oJsObj      := JsonObject():New()
    Local cJsonRt     := ''
    Local oRestClient := FWRest():New("https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata")
    //Cabeçalho
    aadd(aHeader,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
    aAdd(aHeader,'Content-Type: application/json; charset=utf-8')
    //Ajusta Padrão da Data para MM-DD-AAAA
    cDataPtx := Dtos(dDataBase-1)
    cDataPtx := SubStr(cDataPtx,5,2)+'-'+SubStr(cDataPtx,7,2)+'-'+SubStr(cDataPtx,1,4)
    
    //[GET] Consulta Dados na Api
    oRestClient:setPath("/CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='"+cDataPtx+"'&$format=json")
    If oRestClient:Get(aHeader)
        //Grava Retorno
        cJsonRt := oJsObj:FromJson(oRestClient:CRESULT)
        //Exibe Cotação
        If ValType(cJsonRt) == 'U'
            fViewCot(oJsObj)
        Endif
        //Limpa Objeto
        FreeObj(oJsObj)
    Endif
     
Return
//=================================================================================
/*/{Protheus.doc} fViewCot
Exibe Cotação
@author     Thiago.Andrrade
@since      04/03/2021
/*/
//=================================================================================
Static Function fViewCot(oJsObj)
    Local cMsg := ''
    cMsg += "<b>Data:</b> "+Dtoc(Stod(StrTran(SubStr(oJsObj["value"][1]["dataHoraCotacao"],1,10),'-','')))
    cMsg += " - "+SubStr(oJsObj["value"][1]["dataHoraCotacao"],12,5)+"h<br>"
    cMsg += "<b>Cotação de Compra:</b> "+cValToChar(oJsObj["value"][1]["cotacaoCompra"])+"<br>"
    cMsg += "<b>Cotação de Venda:</b> "+cValToChar(oJsObj["value"][1]["cotacaoVenda"])+"<br>"
    MsgInfo(cMsg,"Cotação Dolar Ptax")
Return

Esse fonte também está disponível no GitHub do Thiago.

Update 28/06/2021:

O grande Maicon Macedo ( LinkedIn ), baseado no exemplo acima, também montou um, mas ao invés de usar FWRest, usando HTTPGet.

O motivo, é que algumas redes, bloqueiam recursos, inclusive esse caso de falha foi em um ambiente TCloud.

#include "Totvs.ch"
#include "Tbiconn.ch"
   
/*/{Protheus.doc} zApiMdCH
    Função utilizada para buscar a cotação de determinada moeda em determinada data (período) no API Olinda disponibilizado pelo Banco Central (conforme documentação - vide url)
    Neste fonte, utilizei a função HTTPGet para receber - via varíval de texto - a URL do CotacaoMoedaPeriodoFechamento da API Olinda do BC (acrescida dos parâmetros [codigoMoeda] e [dataInicialCotacao]/[dataFinalCotacao], a qual efetua o processamento da cotação da moeda indicada no período indicado. O retorno da função HTTPGet (texto) é transformado em um objeto JSon
    Inicialmente, este fonte visa obter a cotação da Moeda Dólar em uma única data. Contudo, ele pode ser adaptado para obter a cotação de outras moedas e um período maior.
    @type       function
    @author     Maicon Macedo
    @since      12/06/2021
    @version    1.0
    @sample        U_zApiMdCH()
    @url        Dólar comercial (venda e compra) - cotações diárias e Taxas de Câmbio - todos os boletins diários - v1
                    https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/documentacao
                    https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/aplicacao#!/recursos
                    https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/$metadata
  
                JsonObject - https://tdn.totvs.com/display/tec/Classe+JsonObject 
                HTTPGet - https://tdn.totvs.com/display/tec/HTTPGet 
    @history    Maicon Macedo - 20210612 - Utilização do recurso CotacaoMoedaPeriodoFechamento para retornar os dados de cotação das moedas
/*/
User function zApiMdCH()
    Local cBCApi    := 'https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata'
    Local cBCRec    := ''
    Local cGetParms := ''
    Local nTimeOut  := 200
    Local aHeadStr  := {'Content-Type: application/json'}
    Local cHeadGet  := ''
    Local cRetorno  := ''
    Local cIdMoeda  := 'USD'
    Local cDtCot    := '' //MM-DD-AAAA
    Local oJsObj    := JsonObject():New()
    Local cJsonRt   := ''
    Local cMsg      := ''
  
    //Ajusta Padrão da Data para MM-DD-AAAA
    cDtCot := DToS(dDataBase-1)
    cDtCot := SubStr(cDtCot,5,2) + '-' + SubStr(cDtCot,7,2) + '-' + SubStr(cDtCot,1,4)
      
    //[GET] Consulta Dados na Api Olinda
    cBCRec += cBCApi
    cBCRec += "/CotacaoMoedaPeriodoFechamento(codigoMoeda=@idMD,dataInicialCotacao=@dtIniCt,dataFinalCotacao=@dtFinCt)"
    cBCRec += "?@idMD='"+cIdMoeda+"'&@dtIniCt='"+cDtCot+"'&@dtFinCt='"+cDtCot
    cBCRec += "'&$format=json&$select=cotacaoCompra,cotacaoVenda,dataHoraCotacao,tipoBoletim"
  
    cRetorno := HTTPGet( cBCRec , cGetParms, nTimeOut, aHeadStr, @cHeadGet )
  
    cJsonRt := oJsObj:FromJson(cRetorno)
  
    If ValType(cJsonRt) == 'U' //NIL
      
        MsgInfo("JsonObject populado com sucesso!", ':: Cotação Moeda PTAX - BC API Olinda ::')
  
        //Valida se a Cotação já está liberada para o dia - oJsObj:hasProperty("value")
        If Len(oJsObj["value"]) > 0
  
            cMsg  += "<b>Data:</b> " + DToC(SToD(StrTran(SubStr(oJsObj["value"][1]["dataHoraCotacao"],1,10),'-','')))
            cMsg  += " - " + SubStr(oJsObj["value"][1]["dataHoraCotacao"],12,5) + "h<br>"
            cMsg  += "<b>Moeda: </b> " + cIdMoeda + "<br>"
            cMsg  += "<b>Cotação de Compra:</b> " + cValToChar(oJsObj["value"][1]["cotacaoCompra"]) + "<br>"
            cMsg  += "<b>Cotação de Venda:</b> " + cValToChar(oJsObj["value"][1]["cotacaoVenda"]) + "<br>"
       
            MsgInfo( cMsg ,":: Cotação Moeda PTAX - BC API Olinda ::")
        Endif
  
        //Limpa Objeto
        FreeObj(oJsObj)
    Else
        MsgStop("Ocorreu erro no processamento do Json" + CRLF+CRLF + cJsonRt, ':: Cotação Moeda PTAX - BC API Olinda ::')
    EndIf
      
Return

Update Agosto de 2023:

Pessoal, foi disponibilizado no padrão do sistema, a atualização das moedas, através da rotina FINXTAXA, segue o link do TDN com a documentação: clique aqui.

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação