Configurações do webservice do banco central – Cotações diversas

Olá pessoal!

Outro dia precisei criar um serviço para atualizar a cotação do dólar diariamente. Para quem não sabe o banco central disponibiliza um webservice com diversas cotações como: dólar, euro, ouro etc.
O webservice é bem simples. Ele possui vários métodos conforme listado abaixo:

servicos_bc
Segue abaixo a descrição de cada método:

getUltimoValorVO – Recupera o último valor de uma determinada série e retorna um objeto do tipo WSSerieVO.

Parâmetros:
long codigoSerie – Código da série.
Retorno:
WSSerieVO – Objeto série.

GetUltimoValorXML – Recupera o último valor de uma determinada série e retorna o resultado em formato XML.

Parâmetros:
long codigoSerie – Código da série.
Retorno:
String – String contendo o resultado da consulta em formato XML.

getValor – Recupera o valor de uma série em uma determinada data (dd/MM/aaaa).

Parâmetros:
long codigoSerie – Código da série.
String data – String contendo a data (dd/MM/aaaa) do valor a ser pesquisado.
Retorno:
BigDecimal – Objeto contendo o valor.

getValorEspecial – Recupera o valor de uma série especial em um período.
Parâmetros:
long codigoSerie – Código da série.
String data – String contendo a data (dd/MM/aaaa) inicial.
String dataFim – String contendo a data (dd/MM/aaaa) final.
Retorno:
BigDecimal – Objeto contendo o valor.

getValoresSeriesXML – Recupera os valores de uma ou mais séries dentro de um determinado período.O resultado da consulta é devolvido ao cliente em formato XML.

Parâmetros:
long[] codigosSeries – Lista(array) dos códigos das séries.
String dataInicio – String contendo a data (dd/MM/aaaa) inicial.
String dataFim – String contendo a data (dd/MM/aaaa) final.
Retorno:
String – String contendo o resultado da consulta em formato XML.

getValoresSeriesVO – Recupera os valores de uma ou mais séries dentro de um determinado período e retorna o resultado em forma de Array de objetos do tipo WSSerieVO.

Parâmetros:
long[] codigosSeries – Lista(array) dos códigos das séries.
String dataInicio – String contendo a data (dd/MM/aaaa) inicial.
String dataFim – String contendo a data (dd/MM/aaaa) final.
Retorno:
WSSerieVO – Lista(array) de objeto série.

O endereço do webservice é: https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/FachadaWSSGS.wsdl
O problema que tive com esse serviço foi em conseguir a cotação de venda do dólar, pois, o código 1 é o preço de compra. Fiz muita pesquisa na net e não achei uma tabela de referência do códigos.
Consegui entrar em contato com o banco central e eles me passaram a lista de todos os códigos que são utilizados neste serviço. Segue a lista abaixo:

CÓDIGO NOME
1 Dólar (venda)
10813 Dólar (compra)
21619 Euro (venda)
21620 Euro (compra)
21621 Iene (venda)
21622 Iene (compra)
21623 Libra esterlina (venda)
21624 Libra esterlina (compra)
21625 Franco Suíço (venda)
21626 Franco Suíço (compra)
21627 Coroa Dinamarquesa (venda)
21628 Coroa Dinamarquesa (compra)
21629 Coroa Norueguesa (venda)
21630 Coroa Norueguesa (compra)
21631 Coroa Sueca (venda)
21632 Coroa Sueca (compra)
21633 Dólar Australiano (venda)
21634 Dólar Australiano (compra)
21635 Dólar Canadense (venda)
21636 Dólar Canadense (compra)

Também no site do Banco Central (www.bcb.gov.br – menu Câmbio de capitais estrangeiros – Taxas de câmbio), na opção “Cotações e Boletins”, podem ser consultadas as cotações diárias de outras moedas, para compra e venda. Nesse mesmo endereço, na opção “Todas as moedas”, pode-se acessar o arquivo CSV, contendo as cotações de fechamento dos últimos 7 dias de todas as moedas. Esse arquivo também pode ser acessado diretamente pela seguinte URL: http://www4.bcb.gov.br/Download/fechamento/[AAAAMMDD].csv, onde o padrão AAAAMMDD deve ser substituído pelo ano, mês e dia da cotação desejada.

Um dos mecanismos utilizados para automatizar o acesso a esse arquivo é a utilização do aplicativo WGET, disponível para Windows em http://gnuwin32.sourceforge.net/packages/wget.htm  e também disponível para plataforma Linux ou Unix.

Exemplo de linha de comando para Windows:

# wget http://www4.bcb.gov.br/Download/fechamento/[AAAAMMDD].csv

 Exemplo de comandos Unix:
——
$ D=`date -d “1 day ago” +%Y%m%d`
$ D=”http://www4.bcb.gov.br/Download/fechamento/“$D”.csv” # [AAAAMMDD].csv
$ wget $D
—-

Cabe ressaltar, no entanto, que o Banco Central do Brasil não se compromete em manter inalteradas as estruturas do site nem dos arquivos nele contidos. Eventuais alterações podem impactar soluções de automação construídas com base na sua estrutura atual.

Consumindo o serviço

No meu caso, criei um Job do SSIS (SQL Server Integration Services) que consome esse webservice e em seguida executa uma task que atualiza a tabela. O processo é muito parecido com uma aplicação web comum.

1 – Adicione uma script task e uma execute sql task presentes no SSIS Toolbox
packages

2 – Clique com o botão direito em seu projeto e vá em Add Service Reference…
service_reference

3 – Adicionei uma como uma referencia a um webservice comum. Então na janela que se abriu clique em Advanced conforme mostrado abaixo:
webservice_refence

service_reference1

4 – Coloque o endereço do webservice, clique na seta para ir ao endereço e clique em Add Reference. Provavelmente você irá receber um aviso de segurança de SSL. Clique em sim e na mensagem de bloqueio que aparece logo abaixo da caixa onde você coloca o endereço do serviço clique em permitir conteúdo bloqueado. Após esse processo você terá o resultado abaixo:
service_reference2

5 – Em seguida utilize o código abaixo para buscar os dados do serviço. Utilizei o método getUltimoValorVO porque este método pega a ultima cotação cadastrada pelo BC.

public void Main()
{
   //Referencia ao serviço do banco central https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/FachadaWSSGS.wsdl
   var cotacaoService = new CotacoesService.FachadaWSSGSService();
   Dts.Variables["Cotacao"].Value = cotacaoService.getUltimoValorVO(10813).ultimoValor.svalor;
   Dts.TaskResult = (int)ScriptResults.Success;
}

Na 6ª linha você pode observar o trecho “Dts.Variables[“Cotacao”]”. Essa é uma variável que criei do tipo string. Essa variável foi criada na aba “Variables” conforme abaixo:
variables

Na SQL Task eu utilizei o seguinte código:

DECLARE @lastDate AS VARCHAR(8)
SET @lastDate = (SELECT TOP 1 CONVERT(CHAR, CAST(data_cotacao AS DATETIME), 112) FROM dbo.Table WHERE CONVERT(CHAR, CAST(data_cotacao AS DATETIME), 112) = CONVERT(CHAR, CAST(GETDATE() AS DATETIME), 112))
IF CONVERT(CHAR, CAST(GETDATE() AS DATETIME), 112) = @lastDate
BEGIN
UPDATE dbo.TABLE SET cotacao = (?) WHERE CONVERT(CHAR, CAST(data_cotacao AS DATETIME), 112) = @lastDate
END
ELSE
BEGIN
INSERT INTO dbo.TABLE(cotacao, data_cotacao)
VALUES ( ? , CAST(GETDATE() AS DATE)
)
END

Se existir uma cotação para o dia eu apenas atualizo essa cotação, se não existir eu vou inserir um novo registro na table.

Basicamente esse é o procedimento para criar uma rotina que pega a cotação de uma moeda de uma fonte confiável (Banco Central do Brasil) e atualiza diariamente em um table no banco de dados.
Esse serviço pode ser utilizado de outras formas e o foco deste post foi informar o códigos utilizados para pegar o valor da cotação desejada.

Neste link você consegue mais informações sobre cada código disponibilizado neste txt.

Neste post eu mostro como configurar o ambiente e fazer o deploy de seu projeto SSIS no SQL Server!

Até a próxima!