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:
Código: Selecionar todos
#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.
Código: Selecionar todos
// 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