Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Objetivo

O objetivo deste documento é auxiliar o usuário a criar um “script” para consumo de API Rest, que fornece dados de cotação de moeda, gravando-os em uma tabela personalizada, chamada “U_COTACAOMOEDAS”.

Criando a tabela personalizada “U_COTACAOMOEDAS”

Será necessário utilizar o Person para criar a tabela “U_COTACAOMOEDAS”. Caso exista alguma dúvida sobre o funcionamento do Person, a documentação a seguir deverá ser consultada. Person - Criando campos, tabelas e consultas personalizadas /wiki/spaces/TD/pages/1991213070   

Estrutura da tabela

Abaixo é descrita a estrutura da tabela personalizada, a qual receberá os dados da cotação

...

Descrição: Tabela para cotação cotação de moedas 

Coluna

MOEDABASE

Descrição completa/reduzida

Moeda Base

Dica para usuário

Moeda a ser convertida

Tipo da coluna

Texto

Tamanho máximo

10 caracteres 

 

 

Coluna

MOEDADESEJADA

Descrição completa/reduzida

Moeda desejada

Dica para usuário

Moeda desejada para o cálculo da moeda base

Tipo da coluna

Texto

Tamanho máximo

10 caracteres 

 

 

Coluna

NOMECONVERSAO

Descrição completa/reduzida

Descrição

Dica para usuário

Descrição da conversão

Tipo da coluna

Texto

Tamanho máximo

50 caracteres 

 

 

Coluna

VALORMAXIMO

Descrição completa/reduzida

Valor máximo

Dica para usuário

Valor máximo da moeda na data

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

VALORMINIMO

Descrição completa/reduzida

Valor mínimo

Dica para usuário

Valor mínimo da moeda na data

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

PCTVARIACAO

Descrição completa/reduzida

Porcentagem de Variação / Variação

Dica para usuário

Porcentagem de Variação

Tipo da coluna

Número

Quantidade casas inteiras / decimal

3 / 4

 

 

Coluna

PRECOCOMPRA

Descrição completa/reduzida

Preço de compra

Dica para usuário

Preço pago na compra da moeda

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

PRECOVENDA

Descrição completa/reduzida

Preço de venda

Dica para usuário

Preço de venda da moeda

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

VARIACAO

Descrição completa/reduzida

Variação

Dica para usuário

Valor da variação de preços

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

DATACOTACAO

Descrição completa/reduzida

Data da cotação

Dica para usuário

Data na qual a cotação foi feita

Tipo da coluna

Data e hora

Após criação da tabela, a mesma deverá ficar parecida com a figura abaixo:

...

Criando o “script” por meio do Gerenciador de Projetos

Para iniciar o editor do VsScripter, no Gerenciador de Projetos, clique no botão Novo Projeto. O nome do projeto será solicitado, conforme imagem abaixo:

...

Inicialmente, a tela de edição do VsScripter será mostrada apenas com a “unit” uPrinc, conforme abaixo: 

...

Entendendo o código do “script”

Copie ou digite o código abaixo na “unit” uPrinc: 

Code Block
languagepas
uses
   // dá acesso ao conteúdo "unit" uPesquisaCotacao
   uPesquisaCotacao;

var
   // reserva espaço na memória para um objeto com o nome form que
   // herdará todas as características do formulário TfrmPesquisaCotacao
   form : TfrmPesquisaCotacao;

begin
   // início do ciclo de vida do "script"
   try

    // cria, efetivamente, um objeto com o nome form que herdará todas as
    // características do formulário TfrmPesquisaCotacao
    form := TfrmPesquisaCotacao.Create(nil);

    // monitora o status do objeto "form". Assim, quando as operações
    // finalizarem e o ModalResult do formulário for mrOk, o ciclo de vida
    // do "script" será finalizado. Qualquer ação que seja pretendida após o
    // final do "script", como mensagens ao operador, devem ser colocadas
    // entre o begin e o end logo abaixo
    if form.ShowModal = mrOk then
    begin
    end;

   // final do ciclo de vida do "script"
  finally

    // libera o objeto "form" da memória, destruindo todos os dados e objetos
    // criados nele.
    form.Free;
  end;
end;

Criando o formulário “frmPesquisaCotacao”

Para criar um novo formulário, acessar o menu “File” e em seguida o submenu “New Form”, ou clicando no botão “New form”, que é representado por um formulário em branco com uma estrela amarela na parte superior esquerda. 

O novo formulário precisará de dois componentes, listados abaixo: 

Componente

Novo nome (Name)

Caption / Text

TButton

btnProcessar

&Pesquisar

TComboBox

cboEscolherCotacao

Escolha a conversão desejada

Os componentes visuais ficam na “Tool Palette”, a direita. Selecionar um componente por vez, clicando, segurando o botão do mouse e arrastando o componente para o formulário. Assim, repetir para todos os componentes.

...

Pressionar “F12” para mudar para o modo de programação do “script”. O código abaixo deve ser copiado/digitado na área de programação:

Código da “unit” uPesquisaCotacao: 

Code Block
languagepas
{$FORM TfrmPesquisaCotacao, uPesquisaCotacao.sfm}

uses
  Classes, Graphics, Controls, Forms, Dialogs, Db, DbClient;

uses
   uVsHttpRequest, IdSSLOpenSSL, uLkJson, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, VsMask, System; 

var
   http: TVsHttp;
   SSL1 : TIdSSLIOHandlerSocketOpenSSL;
   cUrl : String;
   obj : TlkJSONobject;
   
Function buscarMoedas(moedas: String):String;
begin
   http := TVsHttp.Create;                                    
   cUrl := Format('https://economia.awesomeapi.com.br/%s', [moedas]);

   //somente necessário para https
   SSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
   IdSSLOpenSSL.UnLoadOpenSSLLibrary();

   try
     //essas opções vai de cada servidor
     SSL1.SSLOptions.Method := sslvTLSv1_2;    
     SSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];//, sslvTLSv1, sslvSSLv23, sslvTLSv1_1, sslvTLSv1_2];

     //associando o SSL ao componente de conexão
     http.SetIOHandler(SSL1);
    
    //primeira consulta get simples
    Result := http.get(cUrl);
    
    // Se precisar analisar o retorno, remover comentário do comando abaixo
//    showMessage(Result);    

   finally
      SSL1.free;
      http.free;
   end;                
end;

function trocaPonto(valor: String):String
var
   x: Integer;
   nStr: String;
begin
   nStr := '';
   for x:=1 to length(valor) do
     begin
      if copy(valor, x, 1) <> '.' then
        nStr := nStr + copy(valor, x, 1)
      else
        nStr := nStr + ',';
      end;
  Result := nStr;
end;

function GravaCotacao(jsonO: TlkJSONobject):Boolean;
var
    cdsMoeda: TClientDataSet;
begin
    try                                              
        // cria o objeto cdsMoeda do tipo TClientDataSet                               
        cdsMoeda := TClientDataSet.Create(nil);


        // preparando o objeto cdsMoeda para receber um TDataSetProvider com nome formado por   
        // dsp+NOMETABELA e abertura automática                  
        dmConexao3c.GetDspEdicao(cdsMoeda, 'U_COTACAOMOEDAS', true);          
        
        // abre o cdsMoeda
        cdsMoeda.open;                                                       
        
        // coloca o cdsMoeda em modo de inserção de dados              
        cdsMoeda.Append;
        
        // busca um valor válido e ordenado que será o índice da tabela, armazenado em
        // U_COTACAOMOEDAS_ID
        cdsMoeda.FieldByName('U_COTACAOMOEDAS_ID').value :=
                            dmConexao3c.QueryPegaCampo('SEL_PADRAO_COM_WHERE',
                            'MAX(U_COTACAOMOEDAS_ID)',   
                            ['?', '1:s', 'U_COTACAOMOEDAS',              
                            '?', '2:s', '0=0'],   
                            [ftString, ftString],                          
                            [20, 100])+1;
        
        // atribui ao campo MOEDABASE o valor da chave code
        cdsMoeda.FieldByName('MOEDABASE').value := jsonO.Field['code'].value;
        
        // atribui ao campo MOEDADESEJADA o valor da chave codein
        cdsMoeda.FieldByName('MOEDADESEJADA').value := jsonO.Field['codein'].value;
        
        // atribui ao campo NOMECOVERSAO o valor da chave name                       
        cdsMoeda.FieldByName('NOMECONVERSAO').value := jsonO.Field['name'].value;             
        
        // atribui ao campo VALORMAXIMO o valor da chave high                        
        cdsMoeda.FieldByName('VALORMAXIMO').value := 
                          trocaPonto(jsonO.Field['high'].value);
        
        // atribui ao campo VALORMINIMO o valor da chave low                                
        cdsMoeda.FieldByName('VALORMINIMO').value := 
                          trocaPonto(jsonO.Field['low'].value);
        
        // atribui ao campo PCTVARIACAO o valor da chave pctChange                       
        cdsMoeda.FieldByName('PCTVARIACAO').value := 
                          trocaPonto(jsonO.Field['pctChange'].value);
                          
        // atribui ao campo PRECOCOMPRA o valor da chave bid                       
        cdsMoeda.FieldByName('PRECOCOMPRA').value := 
                          trocaPonto(jsonO.Field['bid'].value);
                          
        // atribui ao campo PRECOVENDA o valor da chave ask                       
        cdsMoeda.FieldByName('PRECOVENDA').value := 
                          trocaPonto(jsonO.Field['ask'].value);
                                                            
        
        // atribui ao campo VARIACAO o valor da chave varBid                       
        cdsMoeda.FieldByName('VARIACAO').value := 
                          trocaPonto(jsonO.Field['varBid'].value);
                          
                          
        // atribui ao campo DATACOTACAO o valor da chave create_date                       
        cdsMoeda.FieldByName('DATACOTACAO').Value :=
                         DateTimeToStr(jsonO.Field['create_date'].Value);
        
        // Indica ao cds que os dados podem ser gravados
        cdsMoeda.post;
        
        // indica ao servidor de aplicações para aplicar as alterações feitas
        dmConexao3c.CDSApplyUpdates([cdsMoeda]);
     
        
    finally
        // destruindo os objetos em memória
        cdsMoeda.free;
        showMessage(Format('Cotação: %s'+#13#13+
                           'Valor mínimo: R$ %s'+#13#13+
                           'Valor máximo: R$ %s'+#13#13+
                           'Data: %s',
                           [jsonO.Field['name'].value,
                            trocaPonto(jsonO.Field['bid'].value),
                            trocaPonto(jsonO.Field['ask'].value),
                            DateTimeToStr(jsonO.Field['create_date'].Value)]));
    end;
end;

procedure btnPesquisarClick(Sender: TObject);
var                                                                         
   obj     : TlkJSONobject;
   json    : WideString;
   jsonL   : TlkJSONlist;
   jsonO   : TlkJSONobject;
   i       : Integer;
   cdsMoeda: TClientDataSet;

begin
   try
    // recebe o json relativo à conversão das moedas.
    json := UTF8Encode((buscarMoedas(cboEscolherCotacao.Items[cboEscolherCotacao.ItemIndex])));
                                                   
    // se json não estiver vazio e não conter '#erro' em seu conteúdo.
    if ((Length(json) > 0) and (Pos('#erro', lowercase(json)) = 0)) then
    begin
      // transforma o conteúdo de json em uma lista JSON
      jsonL := TlkJSON.ParseText(Json) as TlkJSONlist;

      // verifica se a lista foi criada com sucesso
      if assigned(jsonL) then
      begin

        // cria um 'loop' para processar todos os itens da lista Json
        for i:=0 to jsonL.count-1 do
        begin
        
          // cria um objeto json, equivalente a um registro
          jsonO := jsonL.child[i] as TlkJSONobject;
          GravaCotacao(jsonO);  
                                        
        end;
        end else
           // se a lista JSON não for criada
           ShowMessage('Não carregou a conversão de moedas.');
      end else
          // se existir alguma mensagem de erro, ela é mostrada ao usuário
          if Pos('#erro', lowercase(json)) > 0 then
                ShowMessage(Format('Erro retornado: %s', [UTF8Encode(json)]));
   finally     
      // finaliza os objetos criados e retorna a constante mrOk para indicar que o
      // processo finalizou.
      jsonL.Free;             
      ModalResult := mrOk;
   end;                                              
end;

Salvar novamente o projeto do “VsScripter” e fechar seu editor.

Testando o “script” de cotação de moedas

Para testar o “script”, é necessário executá-lo por meio do botão Executar, a partir do Gerenciador de Projetos:

...