Clipper On Line • Ver Tópico - Guia Postal dos correios
Página 1 de 5

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 09:23
por JoséQuintas
Como já sabem, os correios vendem um programa de Guia Postal Brasileiro, nesta data por R$50.00.

Vém tudo em base Access, num arquivo mdb com senha.

Como sempre digo, é bom olhar o que está na frente no nariz...

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 09:30
por JoséQuintas
Olhando o que está na frente do nariz, vão encontrar a senha, dentro da pasta do programa.

O único campo "criptografado" é o CEP.

Criptografia básica: 2 letras correspondem a um número.

Então basta procurar endereços de referência, e vai conseguir montar a tabela pra conversão do CEP.

Resumindo:
O Guia Postal Brasileiro vém com tudo que precisa
Se quiser salvar tudo no MySql, só usar o Bullzip.
Senão, é só usar Harbour.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 09:35
por JoséQuintas
Nunca vi ninguém falar nada a respeito disto existir nos correios.
Bom pra validar CEPs com recursos limitados:

Cada UF, e faixas de CEP

cepuf.png


Cada CIDADE, e faixas de CEP

cepcid.png


cada BAIRRO, e faixas de CEP

cepbai.png

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 09:39
por JoséQuintas
o CEP criptografado...

O detalhe interessante é que o CEP não é o CEP.
Aqui já com a coluna convertida.

cepcri.png


Bom divertimento.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 09:47
por JoséQuintas
A lista de tabelas:

ceparquivos.png

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 09:51
por JoséQuintas
Arquivo original dos correios.

compra.png

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 11:11
por alxsts
Olá!

O preço é bem convidativo, representando 1% da base de dados do e-DNE (Diretório Nacional de Endereços). Não vi nos prints o campo "código da cidade" (domicílio fiscal), que é importante em várias situações, e está presente no e-DNE. Não vem mesmo?

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:00
por gilbertosilverio
Ola, Jose,

Compraram tudo... não tem mais para venda... kkkk

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:02
por JoséQuintas
nem sei o que é isso, ou para que serve.
Talvez tenha.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:05
por JoséQuintas
ou vai sair versão nova kkkkkk

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:07
por JoséQuintas

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:09
por JoséQuintas
Talvez seja interessante cada vez um comprar, e compartilhar.

PQP.
Saiu um novo atualizado até 16/11/2016.
Acabei de comprar e já ficou desatualizado.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:20
por JoséQuintas
O negócio agora será acompanhar as mudanças, pra ver em que datas eles atualizam isso.
Definitivamente, só compensa comprar se dividirmos custos aqui no fórum, e cada vez um comprar.
Caso contrário, é ficar com o que tiver.

Comprei dia 05, e dia 07 saiu novo.
Mal deu tempo de converter a base pra uso.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:20
por alxsts
Olá!

Cada município brasileiro tem um código atribuído pelo IBGE e é também conhecido como código do domicílio fiscal. São Paulo, por exemplo, tem o código 3550308. Trabalhei com uma plataforma de e-commerce que submete cada pedido de venda do site a um controle anti-fraude feito pela empresa Clear Sale. Este código é exigido, assim como pelo menos um número de telefone válido. Deve haver outros usos também, sendo importante mantê-lo no cadastro de endereços dos clientes.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:23
por JoséQuintas
Me parece que pra isso não precisaria dos correios.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:26
por JoséQuintas
Faço isso normalmente pelo meu aplicativo.
Se o código é atribuído pelo IBGE, é baixar a tabela do IBGE....
Isso é por cidade, colocar em cada endereço é desperdício de espaço.

SEEK cUF + cCidade

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 12:56
por JoséQuintas
Pra quem quiser.
Mesma base dos correios, apenas com a adição de NUMCEP, que é o cep descriptografado.
Backup em MySQL.

http://www.jpatecnologia.com.br/arquivos/cepmysql20161031.zip

Comprada há menos de 48 horas, e já não é atualizada.
Fod.m-se os correios.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:17
por gilbertosilverio
Jose,

Onde vc acho a senha... procurei e não achei... kkk

Meu nariz e grande, deve ser por isso que nãoacho... kkkk

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:21
por alxsts
Olá!

O interessante é ter o código do município em cada endereço de cliente (nem precisa ter o nome da cidade e UF) e uma tabela de cidades cuja chave é o código do município. Isto evita problemas nos casos em que as cidades mudam de nome, como relatado no tópico Código do Município IBGE - Relato.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:25
por JoséQuintas
A string pronta pra uso no Harbour, via ADO ou equivalente.

correios.png


Importante: Harbour configurado como PTISO, e o editor de fontes também.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:34
por JoséQuintas
Os fontes que usei, postar em partes, mais ou menos na ordem em que fui usando.

A principal de abrir conexão com o mdb:

PROCEDURE Main2

   LOCAL cnAccess, aDbList, cDb

   Set( _SET_CODEPAGE, "PTISO" )
   cnAccess := ConexaoAccess()
   cnAccess:Open()
   aDbList := ListFiles( cnAccess )
   FOR EACH cDb IN aDbList
      ListRecords( cnAccess, cDb )
   NEXT
   ConsultaMeuCep( cnAccess )

   cnAccess:Close()

   RETURN

FUNCTION ConexaoAccess()

   LOCAL cnAccess

   cnAccess   := win_OleCreateObject( "ADODB.Connection" )
   cnAccess:ConnectionString := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\program files (x86)\correios\Access\dbgpbe.mdb;Mode=Share Deny Write;Persist Security Info=False;Jet OLEDB:Database Password=«¹½¿¥Ð²þÞ¢§³¼»"

   RETURN cnAccess


listar tabelas do mdb (nomes das tabelas)

#define ADSCHEMATABLES 20

FUNCTION ListFiles( cnAccess )

   LOCAL Rs, aDbList := {}, cTb

   Rs := cnAccess:OpenSchema( ADSCHEMATABLES )
   DO WHILE ! Rs:Eof()
      cTb := rs:fields( "TABLE_NAME" ):Value
      IF Left( cTb, 3 ) == "LOG"
         AAdd( aDbList, cTb )
      ENDIF
      Rs:MoveNext()
   ENDDO
   Rs:Close()

   RETURN aDbList


listar o nome dos campos, e o conteúdo do primeiro registro (no access TOP 1 limita ao primeiro registro, o que no MySQL seria LIMIT 1)

FUNCTION ListRecords( cnAccess, cDb )

   LOCAL Rs, nCont

   ? Pad( cDb, 20, "-" )
   Rs := cnAccess:Execute( "SELECT TOP 1 * FROM " + cDb )
   FOR nCont = 0 TO Rs:Fields:Count() - 1
      ? Rs:Fields( nCont ):Name, Rs:Fields( nCont ):Value
   NEXT
   Rs:Close()

   RETURN NIL

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:37
por JoséQuintas
A conversão do CEP, ou descriptografia se preferirem.

FUNCTION ConverteCEP( cCodigo )

   LOCAL nCont, cTxt, cNovo := "", cNum

   FOR nCont = 1 TO Len( cCodigo ) STEP 2
      cTxt := Substr( cCodigo, nCont, 2 )
      DO CASE
      CASE cTxt $ "UG,LA,AL,GU" ; cNum := "0"
      CASE cTxt $ "X8,8X,CN,NC" ; cNum := "1"
      CASE cTxt $ "Z0,EP,PE,0Z" ; cNum := "2"
      CASE cTxt $ "GR,B1,1B,RG" ; cNum := "3"
      CASE cTxt $ "3D,DI,D3,ID" ; cNum := "4"
      CASE cTxt $ "SJ,C4,4C,JS" ; cNum := "5"
      CASE cTxt $ "2A,A2,QH,HQ" ; cNum := "6"
      CASE cTxt $ "FO,09,90,OF" ; cNum := "7"
      CASE cTxt $ "7Y,DM,Y7,MD" ; cNum := "8"
      CASE cTxt $ "5V,BK,V5,KB" ; cNum := "9"
      OTHERWISE                 ; cNum := "X"
      ENDCASE
      cNovo += cNum
   NEXT

   IF Len( cCodigo ) != 16 // não é cep, não converte
      cNovo = cCodigo
   ENDIF

   RETURN cNovo


A conversão, mas neste caso já tinha colocado a base no MySql

PROCEDURE Main

   LOCAL cnMySql, cTable, aTable, aConvertList, cSql, Rs, cNumCep, nID, nKey, cCampo, cChave, nCont, nTotal

   Set( _SET_CODEPAGE, "PTISO" )
   cnMySql := ConexaoMySql()
   cnMySql:Open()

   aConvertList := { ;
      { "LOG_UNID_OPER",      "UOP_KEY_DNE", "UOP_NU_SEQUENCIAL" }, ;
      { "LOG_LOGRADOURO",     "LOG_KEY_DNE", "LOG_NU_SEQUENCIAL" }, ;
      { "LOG_LOCALIDADE",     "LOC_KEY_DNE", "LOC_NU_SEQUENCIAL" }, ;
      { "LOG_GRANDE_USUARIO", "GRU_KEY_DNE", "GRU_NU_SEQUENCIAL" }, ;
      { "LOG_CPC",            "CPC_KEY_DNE", "CPC_NU_SEQUENCIAL" } }

   FOR EACH aTable IN aConvertList
      cTable := aTable[ 1 ]
      cCampo := aTable[ 2 ]
      cChave := aTable[ 3 ]
      ? "tabela", cTable, "campo", cCampo, "chave", cChave
      Rs := cnMySql:Execute( "SELECT COUNT(*) AS QTD FROM " + cTable )
      nTotal := Rs:Fields( "QTD" ):Value
      Rs:Close()
      cSql := "SELECT NUMCEP, " + cChave + ", " + cCampo + " FROM " + cTable
      Rs := cnMySql:Execute( cSql )
      nCont := 0
      DO WHILE nKey != K_ESC .AND. ! Rs:Eof()
         nKey := Inkey()
         nCont++
         cNumCep := ConverteCep( Rs:Fields( cCampo ):Value )
         nID     := Rs:Fields( cChave ):Value
         IF Mod( nCont, 1000 ) = 0
            ? cTable, nTotal, nCont, Rs:Fields( cChave ):Value, nID, cNumCep
         ENDIF
         IF Rs:Fields( "NUMCEP" ):Value == NIL .OR. Len( Trim( rs:Fields( "NUMCEP" ):Value ) ) = 0
            cSql := "UPDATE " + cTable + " SET NUMCEP='" + cNumCep + "' WHERE " + cChave + "=" + Ltrim( Str( nID ) )
            cnMySql:Execute( cSql )
         ENDIF
         Rs:MoveNext()
      ENDDO
      Rs:Close()
   NEXT
   cnMySql:Close()

   RETURN

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:43
por JoséQuintas
Pra gravar no MySQL deu preguiça, então encontrei o utilitário Bullzip que faz isso.
Ele joga direto do mdb pra MySQL, sem nada de programação.
Apenas criei uma base de dados vazia chamada CEP, por precaução.

Também assim ficou mais fácil visualizar as informações pelo HEIDISQL.

Não quis arriscar a instalar algum Access pirata no W10, ainda mais pra usar uma única vez.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:49
por JoséQuintas
Só pra completar:
As pastas não tem muitos arquivos, em último caso, seria abrir um por um no bloco de notas.
Mas eu não sabia disso, acabei mesmo foi encontrando a informação no google... nesse caso procurei o nariz de alguém também... rs

correios1.png


correios2.png

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 13:56
por gilbertosilverio
Ai eu me pergunto!

Pra quer colocar senha, se ela vem junto... kkkk

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 14:03
por JoséQuintas
O interessante é ter o código do município em cada endereço de cliente (nem precisa ter o nome da cidade e UF) e uma tabela de cidades cuja chave é o código do município. Isto evita problemas nos casos em que as cidades mudam de nome, como relatado no tópico Código do Município IBGE - Relato.


Nesse caso vamos precisar de uma tabela não oficial pra consertar as tabelas oficiais.

Por enquanto ainda nem sei sobre como manter a tabela oficial atualizada, e já está querendo colocar algo não oficial nela... problema...

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 14:09
por JoséQuintas
Pra quer colocar senha, se ela vem junto... kkkk


Talvez seja só pra impedir um usuário comum de estragar o conteúdo.
Lembrando que o Access faz parte o Office.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 14:11
por JoséQuintas
Mais um comentário....

Meu download está disponível nos correios por 60 dias.

Durante 60 dias vou poder baixar o arquivo que já virou desatualizado.......

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 15:27
por gilbertosilverio
Jose,

So por curiosidade, como você montou o ConverteCEP(), como voce descobriu as referencias aos numeros?

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 15:42
por JoséQuintas
Comecei pelo meu endereço: RUA MAESTRO ALFREDO BEVILACQUA, que só tem uma.
Identifiquei 03676-080

Considerando as 40 combinações diferentes, só a primeira pesquisa já pegou 8, restando 32.

Depois fui fazendo o mesmo com outras ruas únicas, e vendo o que sobrava.
Aproveitava as sobras que tinham mais "X" no cep convertido, pra resolver mais números por vez.

Nota: vi sobre isso numa pesquisa do google, que deu uma tabela que não funcionou.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 15:44
por JoséQuintas
Tem uma coisa interessante nisso que percebi depois.
Algumas combinações são apenas as letras invertidas.
Serviu até pra uma pequena "conferida".

      CASE cTxt $ "UG,LA,AL,GU" ; cNum := "0"
      CASE cTxt $ "X8,8X,CN,NC" ; cNum := "1"
      CASE cTxt $ "Z0,EP,PE,0Z" ; cNum := "2"
      CASE cTxt $ "GR,B1,1B,RG" ; cNum := "3"
      CASE cTxt $ "3D,DI,D3,ID" ; cNum := "4"
      CASE cTxt $ "SJ,C4,4C,JS" ; cNum := "5"
      CASE cTxt $ "2A,A2,QH,HQ" ; cNum := "6"
      CASE cTxt $ "FO,09,90,OF" ; cNum := "7"
      CASE cTxt $ "7Y,DM,Y7,MD" ; cNum := "8"
      CASE cTxt $ "5V,BK,V5,KB" ; cNum := "9"

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 15:48
por JoséQuintas
Estava tentando me lembrar pra que servia a outra rotina.... rs
Era pra isso, pra listar o que faltava.

FUNCTION ConsultaMeuCep( cnAccess )

   LOCAL Rs, nAtual := 0, nOk := 0, nKey := 0, nTotal

   ? "Pesquisando meu cep"
   Rs := cnAccess:Execute( "SELECT COUNT(*) AS QTD FROM LOG_LOGRADOURO" )
   nTotal := rs:Fields( "QTD" ):Value
   Rs:Close()
   ? "num total de " + Ltrim( Str( nTotal ) ) + " CEPs"
   Rs := cnAccess:Execute( "SELECT LOG_NOME, LOG_KEY_DNE FROM LOG_LOGRADOURO" )
   DO WHILE nKey == K_ESC .AND. ! Rs:Eof()
      nKey := Inkey()
      nAtual++
      IF ! "X" $ ConverteCep( Rs:Fields( "LOG_KEY_DNE" ):Value )
         nOk++
      ENDIF
      IF Mod( nAtual, 10000 ) == 0 .OR. nTotal - nAtual < 10
         ? nAtual, nOk, nTotal - nAtual, Rs:Fields( "LOG_NOME" ):Value, Rs:Fields( "LOG_KEY_DNE" ):Value, ConverteCep( Rs:Fields( "LOG_KEY_DNE" ):Value )
      ENDIF
      Rs:MoveNext()
   ENDDO
   Rs:Close()

   RETURN NIL

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 16:49
por JoséQuintas
Uma vantagem no MySQL, ou Access, é que você pode nomear resultado, relacionar tabelas, etc.
Aqui um exemplo:

mysql.png


Trouxe os campos logradouro, bairro, cidade, UF e CEP, sendo que:
bairro é o resultado da pesquisa do bairro na tabela de bairros (log_bairro)
cidade é o resultado da pesquisa da cidade na tabela de cidades (log_localidade)
e os demais estão em log_logradouro

Basta criar uma tabela com esses campos, inserindo esse resultado e pronto.
INSERT INTO NOVATABELA ..... o comando acima


O mesmo poderia ser feito no próprio Access e já salvar a tabela pronta pelo Harbour.
Mas é interessante ver os conteúdos pra ver as possibilidades.
Cada um pode querer de um jeito.

Inclusive pode existir uma tabela IBGE, e já acrescentá-la no resultado e/ou na base nova.

Nota: acho que errei no comando na parte do bairro, vou confirmar depois.

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 17:10
por JoséQuintas
Vixi... compliquei... aproveitei uma tabela do IBGE da ANP que está em outra base de dados.
Mas funcionou.
Aproveitei pra corrigir o bairro que estava errado, tinha usado o código de localidade e não de bairro.
Uma vez a base no MySQL, dá pra brincar à vontade.

Ou se tiver Access, pode brincar diretamente na base dos correios.
Isso funcionaria em Harbour também, mas ter visual dos testes é mais interessante.

,ysql2.png

Guia Postal dos correios

MensagemEnviado: 07 Dez 2016 22:03
por JoséQuintas
Não sei que tipo de teste quer fazer mas a estrutura é igual, só tem 1 campo a mais em alguns arquivos.
Ou só editar o SQL na criação de tabelas pra ficar compatível com Access.

Guia Postal dos correios

MensagemEnviado: 08 Dez 2016 15:08
por JoséQuintas
NENHUM campo foi excluído.
Crie um mdb com a mesma senha dos correios, e restaure esse backup.
Depois é só APAGAR os campos NUMCEP.
Pronto.

Nota:
Se puder comprar o novo mais atualizado, melhor ainda, porque esse deixou de ser.
Acho que cópia do original já é distribuir o que é dos correios.
Não é CD, é um misero download, de um EXE de instalação que tem 3 EXEs de instalação.
E o primeiro dos três é pra instalar os outros dois.
É instalação da instalação, que instala as outras instalações.
Bem estilo Brasil.

Guia Postal dos correios

MensagemEnviado: 08 Dez 2016 15:25
por JoséQuintas
Como exemplo, este aqui, se eliminar a coluna NUMCEP, tem o conteúdo exato dos correios.
Qualquer que seja o teste, o resultado com esse arquivo será o mesmo.

correios.png

Guia Postal dos correios

MensagemEnviado: 08 Dez 2016 16:01
por JoséQuintas
Uia.
Tem a lista dos novos CEPs, mas está em PDF.
Converter esses PDFs deixaria a base totalmente atualizada.

https://www.correios.com.br/para-voce/consultas-e-solicitacoes/busca-cep/novas-cidades-codificadas-por-logradouros

Guia Postal dos correios

MensagemEnviado: 08 Dez 2016 19:45
por JoséQuintas
AVISO !!!

Vários CEPs estão convertidos errados, mais de 100.000

É só converter de novo, a rotina de conversão está no post.

É só pesquisar LENGTH( TRIM( NUMCEP ) ) <> 8, e converter.

Estou usando pra atualizar meu webservice, pra não perder nenhum CEP, e sobraram esses sem atualizar, por isso percebi.

Guia Postal dos correios

MensagemEnviado: 09 Dez 2016 09:33
por JoséQuintas
Outra coisa que é fod.
Assinatura do email.

contato.png


Ligando usando telefone fixo:
mensagem: pra ligar pra este telefone não precisa código da operadora

Retirando o código da operadora:
mensagem: este número de telefone não existe

Ligando pelo celular:
Cai numa central de fax.

Imaginem se não estivessem à inteira disposição, o que seria...

Guia Postal dos correios

MensagemEnviado: 09 Dez 2016 09:44
por JoséQuintas
E o cronograma dos correios, apesar que é do DNE.
O Guia Postal foi lançado 07/12, ao invés de 30/11, mas com atualizações até 16/11/2016.
Todo mês tem um novo....

correios3.png

Guia Postal dos correios

MensagemEnviado: 09 Dez 2016 10:59
por JoséQuintas
Foi mais fácil do que eu pensava.

3381 CEPs novos.

Apenas peguei os CEPs dos PDFs e adicionei no meu webservice.
Agora o próprio webservice vai atualizar.

Se os próximos saírem em PDF, só usar o mesmo esquema.

Nota: na falta de outra opção, usei o copiar/colar e rotina pra separar as "palavras" que correspondem ao CEP.

Guia Postal dos correios

MensagemEnviado: 09 Dez 2016 22:31
por JoséQuintas
Os ceps vazios que adicionei.

cep1.png


Alguns ceps que já foram preenchidos

cep2.png


Só não sei o que fazer com excluídos/etc.
Por enquanto registrando as opções de cep que o correio informa., em ceplist
cep deixou de existir e entrou lista no lugar, ou foi desmembrado e o correio informa a lista pra confirmar.

cep3.png


Mas no momento, ficou mais atualizado do que o original.
E se considerar esse "extra", tem até algo mais.

É a primeira vez que os correios disponibilizam lista do que foi alterado.
Se continuar assim, vai dar pra manter atualizado.

Nota: com algumas mudanças do Windows 10, já estou conseguindo usar o monitor em 4k.
O problema é que quando esqueço de reduzir, a imagem vém pra cá grande.

Guia Postal dos correios

MensagemEnviado: 11 Dez 2016 12:42
por JoséQuintas
Algumas rotinas fui fazendo e apagando, a do PDF foi uma delas.
Basicamente copiar/colar pra um arquivo texto, manualmente.

Depois no processo do arquivo texto, separar palavras, e analisar qual tinha o formato do CEP.
Mais ou menos isto:

LOCAL aCepList := {}, cCep := "", cLetra, cTxt
cTxt := MemoRead( "texto.txt" )
FOR EACH cLetra IN cTxt
   DO CASE
   CASE $ cLetra $ "0123456789"
      cCep += cLetra
   OTHERWISE
      cCep := SoNumeros( cCep )
      IF Len( cCep ) ==8
         AAdd( aCepList, cCep
      ENDIF
   ENDCASE
NEXT
...

FUNCTION SoNumeros( cTxt )

   LOCAL cSoNumero := "", cLetra

   FOR EACH cLetra IN cTxt
      IF cLetra $ "0123456789"
         cSoNumero += cLetra
     ENDIF
   NEXT
   RETURN cSoNumero


Ainda estou ajustando.
Para a lista completa de CEPs é necessário pegar LOG_LOGRADOURO, LOG_LOCALIDADE, LOG_CPC, LOG_UNID_OPER, LOG_GRANDE_USUARIO

Vamos ver o que vai sobrar agora.

Nota: Como eu disse antes, deixei por conta do webservice atualizar o resto, nem me preocupei em pegar informação completa

Guia Postal dos correios

MensagemEnviado: 11 Dez 2016 13:54
por JoséQuintas
Em mdb é mais que o dobro do que em MySql, e tem menos informação.
76.916.684 cep20161031.zip
36.428.892 cepmysql20161031.zip

Divirta-se

http://www.jpatecnologia.com.br/arquivos/cep20161031.zip

Ficará disponível por tempo limitado.

Guia Postal dos correios

MensagemEnviado: 11 Dez 2016 19:58
por JoséQuintas
Acho que só agora encerrei isso.
Daqui pra frente é deixar atualizando o que sobrou.
A título de curiosidade, tem CEP que inclui o endereço completo, incluindo número.
O primeiro da lista é um dos exemplos.
Não sei porque em cpCepList ficou dobrado.

cep2.png

Guia Postal dos correios

MensagemEnviado: 11 Dez 2016 20:14
por JoséQuintas
Só a título de curiosidade:
Serviu pra deixar a base atualizada, mas para o webservice não fez diferença.
Como 31/10/2016 já tem mais de 30 dias, de qualquer forma o webservice vai consultar on-line e atualizar.

Guia Postal dos correios

MensagemEnviado: 11 Dez 2016 20:21
por JoséQuintas
A propósito: descobri a "criptografia" inversa.
Daria pra usar direto a base dos correios no aplicativo, sem conversão nenhuma.
Ou a base MySQL do mesmo jeito.

aqui direto no Access:


#include "inkey.ch"
#define AD_USE_CLIENT 3
REQUEST HB_CODEPAGE_PTISO

PROCEDURE Main

   LOCAL cnGuia, Rs, nKey := 0, cCep, Rs2, Rs3, cSql

   Set( _SET_CODEPAGE, "PTISO" )

   SetMode( 40, 100 )
   CLS
   cnGuia := ConexaoAccess()
   cnGuia:Open()

   cCep := ConverteFromCep( "03677070" )

   cSql := "SELECT " + ;
           "LOG_LOGRADOURO.LOG_NOME AS ENDERECO, " + ;
           "BAI_NU_SEQUENCIAL_INI, " + ;
           "LOC_NU_SEQUENCIAL, " + ;
           "LOG_LOGRADOURO.UFE_SG AS UF, " + ;
           "LOG_LOGRADOURO.LOG_KEY_DNE AS KEYDNE " + ;
           "FROM LOG_LOGRADOURO " + ;
           "WHERE LOG_KEY_DNE=" + StringSql( cCep )
   //? cSql
   Rs := cnGuia:Execute( cSql )
   cSql := "SELECT BAI_NO AS BAIRRO FROM LOG_BAIRRO WHERE BAI_NU_SEQUENCIAL=" + NumberSql( Rs:Fields( "BAI_NU_SEQUENCIAL_INI" ):Value )
   //? cSql
   Rs2 := cnGuia:Execute( cSql )
   cSql := "SELECT LOC_NO AS CIDADE FROM LOG_LOCALIDADE WHERE LOC_NU_SEQUENCIAL=" + NumberSql( Rs:Fields( "LOC_NU_SEQUENCIAL" ):Value )
   //? cSql
   Rs3 := cnGuia:Execute( cSql )
   DO WHILE nKey != K_ESC .AND. ! Rs:Eof()
      nKey := Inkey()
      ?
      ?? Rs:Fields( "ENDERECO" ):Value
      ?? Rs2:Fields( "BAIRRO" ):Value
      ?? Rs3:Fields( "CIDADE" ):Value
      ?? Rs:Fields( "UF" ):Value
      ?? ConverteToCep( Rs:Fields( "KEYDNE" ):Value )
      Rs2:Close()
      Rs3:Close()
      Rs:MoveNext()
   ENDDO
   Rs:Close()
   cnGuia:Close()

   RETURN


A função inversa é simples: o critério é que a cada ocorrência de mesmo número, é usada a codificação seguinte.
Testei só alguns CEPs, não todos.
Pode ser que precise ajustar a ordem das letras de cada número.
Como não vou usar, não me preocupei em acertar todos.
Usei dois CEPs de referência: 03676-080 e 03677-070

O primeiro zero vai usar UG, o segundo LA, o terceiro AL, e o quarto GU.
Não sei o que acontece se tivesse um quinto zero, mas coloquei pra reiniciar.

Desta forma, é só pegar um CEP, converter e pesquisar direto, sem nem precisar mexer na base original.

// SELECT * FROM LOG_LOGRADOURO WHERE LOG_DNE_KEY = ConverteFromCep( cCep )
//

FUNCTION ConverteFromCEP( cCep )

   LOCAL oElement, cKey := "", ConvList, nIndex

   ConvList := { ;
      { "UG", "LA", "AL", "GU" }, ;
      { "X8", "8X", "CN", "NC" }, ;
      { "Z0", "EP", "PE", "0Z" }, ;
      { "GR", "B1", "1B", "RG" }, ;
      { "3D", "DI", "D3", "ID" }, ;
      { "SJ", "C4", "4C", "JS" }, ;
      { "2A", "A2", "QH", "HQ" }, ;
      { "FO", "90", "09", "OF" }, ;
      { "7Y", "DM", "Y7", "MD" }, ;
      { "5V", "BK", "V5", "KB" } }

   FOR EACH oElement IN ConvList
      AAdd( oElement, 1 )
   NEXT
   FOR EACH oElement IN cCep
      nIndex := ConvList[ Val( oElement ) + 1, 5 ]
      cKey += ConvList[ Val( oElement ) + 1, nIndex ]
      ConvList[ Val( oElement ) + 1, 5 ] := iif( ConvList[ Val( oElement ) + 1, 5 ] == 4, 1, ConvList[ Val( oElement ) + 1, 5 ] + 1 )
   NEXT

   RETURN cKey

Guia Postal dos correios

MensagemEnviado: 13 Dez 2016 18:04
por JoséQuintas
Como eu disse, testei somente alguns.
Deve ser o caso de testar todos, e acertar a ordem.

Guia Postal dos correios

MensagemEnviado: 17 Dez 2016 10:53
por JoséQuintas
Ainda como eu disse, só a questão da ordem.
Uma vez que a "descriptografia" deu certo, só usá-la pra decifrar a "criptografia", que só depende da ordem.

FUNCTION ConverteFromCEP( cCep )

   LOCAL oElement, cKey := "", ConvList

   ConvList := { ;
      { "UG", "AL", "UG", "AL", "GU", "LA", "00", "LA" }, ;
      { "X8", "CN", "X8", "CN", "8X", "NC", "8X", "NC" }, ;
      { "Z0", "EP", "02", "EP", "0Z", "7Y", "02", "PE" }, ;
      { "1B", "GR", "1B", "03", "B1", "RG", "B1", "GR" }, ;
      { "3D", "ID", "3D", "04", "D3", "04", "3D", "DI" }, ;
      { "4C", "JS", "05", "05", "05", "SJ", "C4", "SJ" }, ;
      { "2A", "HQ", "06", "06", "06", "06", "A2", "06" }, ;
      { "09", "FO", "09", "FO", "07", "07", "90", "OF" }, ;
      { "Y7", "DM", "Y7", "DM", "7Y", "MD", "7Y", "MD" }, ;
      { "V5", "BK", "09", "BK", "09", "09", "09", "KB" } }

   FOR EACH oElement IN cCep
      cKey += ConvList[ Val( oElement ) + 1, oElement:__EnumIndex ]
   NEXT

   RETURN cKey


usei este fonte pra testar.


#include "inkey.ch"
REQUEST HB_CODEPAGE_PTISO

PROCEDURE Main

   LOCAL cnGuia, Rs, nKey := 0, cSql, cCep, cKeyDne, cNewKeyDne, nCont := 1, aTabelaList, oElement

   aTabelaList := { ;
      { "LOG_LOCALIDADE",     "LOC_KEY_DNE" }, ;
      { "LOG_UNID_OPER",      "UOP_KEY_DNE" }, ;
      { "LOG_CPC",            "CPC_KEY_DNE" }, ;
      { "LOG_GRANDE_USUARIO", "GRU_KEY_DNE" }, ;
      { "LOG_LOGRADOURO",     "LOG_KEY_DNE" } }

   Set( _SET_CODEPAGE, "PTISO" )

   SetMode( 40, 100 )
   CLS
   cnGuia := ConexaoAccess()
   cnGuia:Open()

   FOR EACH oElement IN aTabelaList
      ? oElement[ 1 ]
      cSql := "SELECT " + ;
              oElement[ 2 ] + " AS KEYDNE " + ;
              "FROM " + oElement[ 1 ]
      Rs := cnGuia:Execute( cSql )
      DO WHILE nKey != K_ESC .AND. ! Rs:Eof()
         nKey := Inkey()
         cKeyDne    := Rs:Fields( "KEYDNE" ):Value
         cCep       := ConverteToCep( cKeyDne )
         cNewKeyDne := ConverteFromCep( cCep )
         nCont++
         IF Left( cKeyDne, 4 ) != Left( cNewKeyDne, 4 ) .AND. cKeyDne != "LOC"
            ? nCont, cCep, Transform( cKeyDne, "@R XX-XX-XX-XX-XX-XX-XX-XX" ), Transform( cNewKeyDne, "@R XX-XX-XX-XX-XX-XX-XX-XX" ), cKeyDne == cNewKeyDne
         ENDIF
         Rs:MoveNext()
      ENDDO
      ? nCont
   NEXT
   Rs:Close()
   cnGuia:Close()
   ? nCont

   RETURN


Testado para todos os 1.016.352 CEPs existentes no guia postal.

Guia Postal dos correios

MensagemEnviado: 17 Dez 2016 11:10
por JoséQuintas
Opa... estava fazendo por partes, não reparei que não terminei.... rs
Aqui só fez para os primeiros dígitos.

         IF Left( cKeyDne, 4 ) != Left( cNewKeyDne, 4 ) .AND. cKeyDne != "LOC"

Guia Postal dos correios

MensagemEnviado: 18 Dez 2016 06:21
por JoséQuintas
Até o quarto digito numérico deu certo: a cada número em cada posição corresponde um par de letras.
Nos demais, há algum critério que precisa decifrar, porque pode ser normal ou invertido.


FUNCTION ConverteFromCEP( cCep )

   LOCAL oElement, cKey := "", ConvList

   ConvList := { ;
      { "UG", "AL", "UG", "AL", "GU", "LA", "GU", "AL" }, ;
      { "X8", "CN", "X8", "CN", "8X", "CN", "8X", "NC" }, ;
      { "Z0", "EP", "Z0", "EP", "0Z", "PE", "0Z", "PE" }, ;
      { "1B", "GR", "1B", "GR", "B1", "RG", "B1", "GR" }, ;
      { "3D", "ID", "3D", "ID", "D3", "DI", "3D", "DI" }, ;
      { "4C", "JS", "4C", "JS", "C4", "SJ", "C4", "SJ" }, ;
      { "2A", "HQ", "2A", "HQ", "A2", "QH", "A2", "QH" }, ;
      { "09", "FO", "09", "FO", "90", "OF", "90", "OF" }, ;
      { "Y7", "DM", "Y7", "DM", "7Y", "MD", "7Y", "MD" }, ;
      { "V5", "BK", "V5", "BK", "5V", "KB", "5V", "KB" } }

   FOR EACH oElement IN cCep
      cKey += ConvList[ Val( oElement ) + 1, oElement:__EnumIndex ]
   NEXT

   RETURN cKey

Guia Postal dos correios

MensagemEnviado: 20 Dez 2016 10:01
por JoséQuintas
Mas e aquelas ferramentas que disse ter? Elas não ajudam a decifrar?

Guia Postal dos correios

MensagemEnviado: 20 Dez 2016 13:17
por JoséQuintas
Sem chance. Talvez seja pela data de cadastro, e não tenha nenhuma lógica aritmética.
Os mesmos CEPs com final 6500, cada hora o último zero é codificado como LA ou AL.
Não é pela soma ser par ou ímpar, não é por ter zero repetido, e não é relacionado a nenhum número anterior.

    832672        617 24866500 Z0IDY7HQA2SJGULA Z0IDY7HQA2SJGUAL
    833106        617 24846500 Z0IDY7IDA2SJGULA Z0IDY7IDA2SJGUAL
    833771        617 24856500 Z0IDY7JSA2SJGULA Z0IDY7JSA2SJGUAL
    836369        617 41336500 3DCN1BGRA2SJGULA 3DCN1BGRA2SJGUAL
    847328        617 08726500 UGDM09EPA2SJGULA UGDM09EPA2SJGUAL
    848288        617 71256500 09CNZ0JSA2SJGULA 09CNZ0JSA2SJGUAL
    851535        617 32056500 1BEPUGJSA2SJGULA 1BEPUGJSA2SJGUAL
    868625        617 24936500 Z0IDV5GRA2SJGULA Z0IDV5GRA2SJGUAL
    868676        617 24926500 Z0IDV5EPA2SJGULA Z0IDV5EPA2SJGUAL
    873362        617 07726500 UGFO09EPA2SJGULA UGFO09EPA2SJGUAL
    874232        617 09336500 UGBK1BGRA2SJGULA UGBK1BGRA2SJGUAL
    876302        617 70686500 09AL2ADMA2SJGULA 09AL2ADMA2SJGUAL
    877419        617 79816500 09BKY7CNA2SJGULA 09BKY7CNA2SJGUAL
    884237        617 74936500 09IDV5GRA2SJGULA 09IDV5GRA2SJGUAL
    893319        617 08586500 UGDM4CDMA2SJGULA UGDM4CDMA2SJGUAL
    894545        617 63046500 2AGRUGIDA2SJGULA 2AGRUGIDA2SJGUAL
    908479        617 05276500 UGJSZ0FOA2SJGULA UGJSZ0FOA2SJGUAL
    912855        617 29136500 Z0BKX8GRA2SJGULA Z0BKX8GRA2SJGUAL
    921991        617 32636500 1BEP2AGRA2SJGULA 1BEP2AGRA2SJGUAL
    923457        617 25946500 Z0JSV5IDA2SJGULA Z0JSV5IDA2SJGUAL
    923955        617 25916500 Z0JSV5CNA2SJGULA Z0JSV5CNA2SJGUAL
    928842        617 07786500 UGFO09DMA2SJGULA UGFO09DMA2SJGUAL
    932399        617 29016500 Z0BKUGCNA2SJGULA Z0BKUGCNA2SJGUAL
    963361        617 75516500 09JS4CCNA2SJGULA 09JS4CCNA2SJGUAL
    967387        617 28926500 Z0DMV5EPA2SJGULA Z0DMV5EPA2SJGUAL
    978999        617 13736500 X8GR09GRA2SJGULA X8GR09GRA2SJGUAL
    979286        617 13176500 X8GRX8FOA2SJGULA X8GRX8FOA2SJGUAL
    982182        617 76386500 09HQ1BDMA2SJGULA 09HQ1BDMA2SJGUAL
    985010        617 75386500 09JS1BDMA2SJGULA 09JS1BDMA2SJGUAL
    987918        617 79076500 09BKUGFOA2SJGULA 09BKUGFOA2SJGUAL
    991608        617 14786500 X8ID09DMA2SJGULA X8ID09DMA2SJGUAL
    995860        617 55156500 4CJSX8JSA2SJGULA 4CJSX8JSA2SJGUAL
   1010244        617 64036500 2AIDUGGRA2SJGULA 2AIDUGGRA2SJGUAL


Esses são apenas alguns, onde usaram no final LA ao invés de AL, pra representar o zero.
Nenhum ponto em comum que indique o porque disso.

Para os quatro primeiros dígitos, basta a posição.
Para os quatro últimos... não dá pra saber.

Isso seria pra pesquisar diretamente no arquivos dos correios, sem nenhuma alteração.
No caso é só criar uma cópia, que permita alteração, e gravar um campo com o CEP descodificado, como fiz no início, e usar esse novo campo como pesquisa.

Pesquisar por endereço dá, mas pesquisar por CEP só fazendo isso.

Guia Postal dos correios

MensagemEnviado: 03 Jan 2017 09:05
por JoséQuintas
Pois é....
Ainda não terminei de verificar todos os CEPs, mas alguns do guia COMPRADO já não valem mais.
Definitivamente, impossível manter uma base 100% atualizada, nem mesmo comprando dos correios.
Só mesmo online, e olhe lá....
Nota: falta verificar uns 8.000 ainda, e estou verificando somente os "extras" que vieram no guia, menos de 2% do total.

cep.png

Guia Postal dos correios

MensagemEnviado: 03 Jan 2017 17:55
por JoséQuintas
Foi só coincidência eu ter dado uma olhada nisto.
Mas achei curioso.
CEPs diferentes, conforme o andar do prédio.

cep.png

Guia Postal dos correios

MensagemEnviado: 04 Jan 2017 14:15
por JoséQuintas
Só ficou faltando aprender como montar um webservice em todos detalhes, mas já agradeço pelo que pude aprender sobre o CEP.


Vai escolher aonde vai hospedar o webservice, escolher a linguagem de programação, o banco de dados, e fazer.
Não há o que ensinar, ou sabe ou não sabe.
Com certeza, dificilmente vai ser usando Harbour.

Guia Postal dos correios

MensagemEnviado: 08 Mar 2017 21:47
por JoséQuintas
Só a título de curiosidade:
Quando fui mexer com CEP, sairam atualizacões logo em seguida, constando no site dos correios..
Até agora não tem nenhuma novidade no site dos correios, apesar do guia postal dizer que está atualizado até uma data mais nova.

Sei lá se foi concidência issso, ou se deixaram pra mostrar serviço só no final do ano.... rs

Guia Postal dos correios

MensagemEnviado: 27 Mar 2017 08:47
por Concentra
Bom dia !

Esta base de dados tem informações de posição, latitude, longitude ?

[[]]

Guia Postal dos correios

MensagemEnviado: 27 Mar 2017 09:04
por JoséQuintas
Não.
Até comecei a gravar numa época, mas não era base confiável, então não atualizei mais.
Acho que era do opencep.

Guia Postal dos correios

MensagemEnviado: 17 Abr 2018 10:12
por JoséQuintas
Microsoft até removeu o GPS dela por conter informação errada.
Google também tem informação errada.
E manual, como opencep, sempre tem os FDPs que cadastram informação errada de propósito, só de sacanagem.

O que um cliente meu usa é definir regiões de mapa no cadastro, e o motorista usar aquela classificação.
Mas forneço o mapa do google também, já faz parte do aplicativo.

Guia Postal dos correios

MensagemEnviado: 06 Set 2018 22:03
por JoséQuintas
Não sei porque meu webservice não consegue mais consultar os correios.
Parti novamente pro plano B.
Continua tudo no mesmo esquema de antes, só que mais rápido.
Em alguns minutos, já salvando no MySQl.

cepcorreios.png

Guia Postal dos correios

MensagemEnviado: 07 Set 2018 11:30
por asimoes
Olá Quintas,

Venho usando o seu serviço http://www.josequintas.com.br/cep.asp e está dando erro na consulta, o seu serviço está em manutenção ?
Obrigado por fornecer o serviço gentilmente.

Guia Postal dos correios

MensagemEnviado: 07 Set 2018 14:31
por JoséQuintas
Só não está no formato XML, se for usar alguma função própria pra XML.
Se usar o XmlNode() continua tudo igual.

tá saindo "correios daqui" "correios até aqui" e depois o XML de sempre
É que precisei adicionar informação para o provedor poder fazer testes, e descobrir porque não acessa os correios.
Depois que o provedor resolver, volta ao normal.

Alternativas:

XmlNode( cRetorno, "jpacep", .T. ) - extrai todo bloco de cep
XmlNode( cRetorno, "logradouro" ) - extrai normalmente

webservice.png

Guia Postal dos correios

MensagemEnviado: 07 Set 2018 19:12
por asimoes
Quintas,

Qual é a URL do serviço ?

Guia Postal dos correios

MensagemEnviado: 08 Set 2018 00:08
por JoséQuintas
O webservice sempre funciona, mesmo sem correios.
Por isso fica difícil do provedor testar se está funcionando os correios.

Mas sua pergunta me deu uma idéia: é só eu fazer uma cópia do cep.asp com outro nome, para o provedor fazer testes.

O endereço é o mesmo que colocou, talvez tenha consultado numa das mexidas de teste.

http://www.josequintas.com.br/cep.asp?cep=03676-080

Guia Postal dos correios

MensagemEnviado: 08 Set 2018 19:28
por asimoes
Quintas
O endereço é o mesmo que colocou, talvez tenha consultado numa das mexidas de teste.


O retorno antes era um xml agora é outra forma ?

a

MensagemEnviado: 08 Set 2018 23:07
por JoséQuintas
Temporariamente virou um texto + xml
Mas já criei uma opção pro provedor fazer testes, e voltei a somente xml.

Guia Postal dos correios

MensagemEnviado: 21 Ago 2019 14:33
por JoséQuintas
Só pra avisar....

A atualização automática do meu webservice está sem funcionar há algum tempo...
O webservice sempre funcionou, a atualização dos correios é que parou.

Ontem comprei o CEP atualizado dos correios e fiz a atualização.
Aquele... direto no site dos correios.... atualizado até 25/julho/2019... que vém em MDB e vém a senha...
Descobri um detalhe interessante: ao usar o Bullzip pra importar para o MySQL deve ser selecionada a opção pra ANSI e não UTF-8.
Fica 100% compatível com Harbour codepage PTISO.

cep.png


http://shopping.correios.com.br/wbm/store/script/wbm2400901p01.aspx?cd_company=ErZW8Dm9i54=&cd_product=LuY8OPEFBNc=&cd_department=SsNp3FlaUpM=