Como calcular o valor do frete e prazo de entrega utilizando WebService dos Correios no SQL Server

Olá, pessoal!
Boa tarde!

Neste post, vou demonstrar mais uma vez a utilização de OLE Automation no SQL Server para consumir os dados de um serviço da Web. Dessa vez, vou consumir o serviço dos Correios para calcular prazo e valor do frete (muito utilizado pra e-Commerce).

Conhecendo o WebService dos Correios

Antes de iniciarmos a criação da Stored Procedure que irá consultar os dados, precisamos primeiro entender os parâmetros e flags do serviço dos Correios.

WebService Correios - Parâmetros de Entrada

CampoTipoObrigatórioDescrição
nCdEmpresaStringNão. O parâmetro tem que ser passado mesmo vazio.Seu código administrativo junto à ECT. O código está disponível no corpo do contrato firmado com os Correios.
sDsSenhaStringNão. O parâmetro tem que ser passado mesmo vazio.Senha para acesso ao serviço associada ao seu código administrativo. A senha inicial corresponde aos 8 primeiros dígitos do CNPJ informado no contrato.
nCdServicoStringSimCódigo do serviço
sCepOrigemStringSimCEP de Origem sem hífen.Exemplo: 05311900
sCepDestinoStringSimCEP de Destino sem hífen
nVlPesoDecimalSimPeso da encomenda incluindo sua embalagem. O peso deve ser informado em quilogramas.
nCdFormatoIntSimFormato da encomenda (incluindo embalagem). 1 – Formato caixa/pacote / 2 – Formato rolo/prisma
nVlComprimentoDecimalSimComprimento da encomenda (incluindo embalagem) em centímetros.
nVlAlturaDecimalSimAltura da encomenda (incluindo embalagem) em centímetros.
nVlLarguraDecimalSimLargura da encomenda (incluindo embalagem) em centímetros.
nVlDiametroDecimalSimDiâmetro da encomenda (incluindo embalagem) em centímetros.
sCdMaoPropriaStringSimIndica se a encomenda será entregue com o serviço adicional mão própria. Valores possíveis: S ou N (S – Sim / N – Não)
nVlValorDeclaradoDecimalSimIndica se a encomenda será entregue com o serviço adicional valor declarado. Neste campo deve ser apresentado o valor declarado desejado em Reais.
sCdAvisoRecebimentoStringSimIndica se a encomenda será entregue com o serviço adicional aviso de recebimento. Valores possíveis: S ou N (S – Sim / N – Não)
StrRetornoStringSimIndica a forma de retorno da consulta. XML = Resultado em XML / Popup = Resultado em uma janela popup / = Resultado via post em uma página do requisitante

WebService Correios - Parâmetros de Retorno

Parâmetro de SaídaDescrição
CodigoCódigo do Serviço de Entrega.
ValorValorDeclaradoPreço do serviço adicional Valor Declarado.
ValorPreço total da encomenda em Reais incluindo os preços dos serviços opcionais.
ValorMaoPropriaPreço do serviço adicional Mão Própria.
ValorAvisoRecebimentoPreço do serviço adicional Aviso de Recebimento.
PrazoEntregaPrazo estimado em dias para entrega do produto. Se o valor retornado for 0 (zero) indica que o prazo não foi retornado corretamente.
EntregaDomiciliarInforma se a localidade informada possui entrega domiciliária. Se o prazo não for retornado corretamente o retorno deste parâmetro será vazio.
EntregaSabadoInforma se a localidade informada possui entrega domiciliária aos sábados. Se o prazo não for retornado corretamente o retorno deste parâmetro será vazio.
ErroOs mesmos do Web Services.
MsgErroRetorna a descrição do erro gerado.

WebService Correios - Códigos de Serviço

Códigos de Serviço 
41106PAC sem contrato
40010SEDEX sem contrato
40045SEDEX a Cobrar sem contrato
40126SEDEX a Cobrar com contrato
40215SEDEX 10 sem contrato
40290SEDEX Hoje sem contrato
40096SEDEX com contrato
40436SEDEX com contrato
40444SEDEX com contrato
81019e-SEDEX com contrato
41068PAC com contrato
40568SEDEX com contrato
40606SEDEX com contrato
81868(Grupo 1) e-SEDEX com contrato
81833(Grupo 2) e-SEDEX com contrato
81850(Grupo 3) e-SEDEX com contrato

Criando a Stored Procedure para consultar os dados

Com o trecho de código abaixo, iremos criar a Stored Procedure que iremos utilizar para consultar os dados de valor do frete e prazo de entrega utilizando procedures OLE Automation para realizar a requisição GET e retornar o XML da Web, que iremos ler utilizando XQuery.

Exemplos de uso

Realizando um teste simples, preenchendo só os parâmetros obrigatórios
WebService Correios - Teste simples

Realizando um teste mais completo, preenchendo todos os parâmetros da SP
WebService Correios - Teste completo

Chamando a SP, mas informando um CEP inválido
WebService Correios - CEP inválido

É isso aí, pessoal!
Até o próximo post!

SQL, sql server, sql server 2008, sql server 2008 R2, Oracle, Oracle Database, Oracle 11g, Oracle 10g, Oracle 12c, MySQL, Firebird, Consultoria, Consultor, Programador, Programação. Desenvolvedor, Analista de Sistemas, DBA, Criação de website, Criação de Sistema Web, Vitória, Vila Velha, Guarapari, Espírito Santo, ES, Consultoria SQL em VItória, Treinamento, Curso, Prestação de serviço, prestar serviço, freelancer, freela, banco de dados, consultoria em banco de dados, consultor de banco de dados

2 comentários em “Como calcular o valor do frete e prazo de entrega utilizando WebService dos Correios no SQL Server

  1. Olá Dirceu achei esse post otimo, realizei varios testes com webservice usando essa mesma lógica. A minha duvida fica com base em qual a vantagem ou desvantagem de desenvolver a comunicação do webservice via SQL ou via linguagem de programação como C# por exemplo? Aonde trabalho os desenvolvedores usam C# para a comunicação com diversos webservices e em alguns casos me parece ser até mais trabalhoso e oneroso atuar dessa maneira.

    1. Thiago,
      Boa noite e obrigado pela visita.

      No caso desse exemplo, o webservice dos correios é bem simples e responde a requisições simples HTTP. Para esse tipo de situação, realizar consultas é bem mais simples mesmo pelo SQL server do que pelo C#, embora eu tenha até feito um post de como criar uma SP no c# e executar pelo SQL server (Usando o CLR) para realizar requisições post e get que fica até mais fácil do que usando OLE Automation.

      Porém, quando você vai trabalhar com Webservices mais completos, que possuem WSDL, métodos de chamadas, retornos de tipos complexos, etc, isso não é possível de ser utilizado pelo SQL server puro. Nesses casos, você precisa de uma linguagem de programação para atuar nisso. Na empresa que eu trabalho, eu costumo criar a integração com o Webservice no visual studio, que já lê a URL do Webservice e gera as classes prontas em C# e encapsulo isso na minha biblioteca CLR, onde posso consultar o Webservice pelo SQL server e retornar como um XML ou mesmo já tratar o XML pelo próprio C# e retornar os dados como tabela.

      Provavelmente nesse fim de semana vou criar uma post sobre isso 🙂

Deixe uma resposta