Clipper On Line • Ver Tópico - Guia Postal dos correios
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Guia Postal dos correios

07 Dez 2016 12:26

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.

Código:
SEEK cUF + cCidade

Guia Postal dos correios

07 Dez 2016 12:56

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

07 Dez 2016 13:17

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

07 Dez 2016 13:21

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

07 Dez 2016 13:25

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

07 Dez 2016 13:34

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:

Código:
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)

Código:
#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)

Código:
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

07 Dez 2016 13:37

A conversão do CEP, ou descriptografia se preferirem.

Código:
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

Código:
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

07 Dez 2016 13:43

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

07 Dez 2016 13:49

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

07 Dez 2016 13:56

Ai eu me pergunto!

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

Guia Postal dos correios

07 Dez 2016 14:03

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

07 Dez 2016 14:09

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

07 Dez 2016 14:11

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

07 Dez 2016 15:27

Jose,

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

Guia Postal dos correios

07 Dez 2016 15:42

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.
Postar uma resposta