Página 2 de 5
Guia Postal dos correios
Enviado: 07 Dez 2016 13: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.
Guia Postal dos correios
Enviado: 07 Dez 2016 13: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/arquivo ... 161031.zip
Comprada há menos de 48 horas, e já não é atualizada.
Fod.m-se os correios.
Guia Postal dos correios
Enviado: 07 Dez 2016 14: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
Enviado: 07 Dez 2016 14: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
Enviado: 07 Dez 2016 14:25
por JoséQuintas
A string pronta pra uso no Harbour, via ADO ou equivalente.
Importante: Harbour configurado como PTISO, e o editor de fontes também.
Guia Postal dos correios
Enviado: 07 Dez 2016 14: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:
Código: Selecionar todos
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: Selecionar todos
#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: Selecionar todos
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
Enviado: 07 Dez 2016 14:37
por JoséQuintas
A conversão do CEP, ou descriptografia se preferirem.
Código: Selecionar todos
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: Selecionar todos
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
Enviado: 07 Dez 2016 14: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
Enviado: 07 Dez 2016 14: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
Guia Postal dos correios
Enviado: 07 Dez 2016 14:56
por gilbertosilverio
Ai eu me pergunto!
Pra quer colocar senha, se ela vem junto... kkkk
Guia Postal dos correios
Enviado: 07 Dez 2016 15: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
Enviado: 07 Dez 2016 15: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
Enviado: 07 Dez 2016 15: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
Enviado: 07 Dez 2016 16:27
por gilbertosilverio
Jose,
So por curiosidade, como você montou o ConverteCEP(), como voce descobriu as referencias aos numeros?
Guia Postal dos correios
Enviado: 07 Dez 2016 16: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.