sexta-feira, 31 de janeiro de 2014

ADVPL-Importador de cep

Importar CEPS e transformar tudo em faixa

Um belo dia, precisei que o banco me enviasse uma faixa de cep para saber quais municípios o banco atenderia.
Para minha surpresa, o banco me enviou um arquivo parecido com isso :

01007000;SAO PAULO;SP;SIM
01007010;SAO PAULO;SP;SIM
01007020;SAO PAULO;SP;SIM
01007030;SAO PAULO;SP;SIM
01007906;SAO PAULO;SP;SIM
01008000;SAO PAULO;SP;SIM
01008010;SAO PAULO;SP;SIM
01008900;SAO PAULO;SP;SIM
01008908;SAO PAULO;SP;SIM

O arquivo é muito maior, este é só um exemplo.

O que o banco enviou, foi o cep de todas as ruas daquele município para eu popular em meu banco de dados.

Como eu precisava de uma FAIXA fiz o seguinte :
ZZ_FAIXAINI e ZZ_FAIXAFIM mas desta forma :
01007-000 até 01007-906 e deixar somente este registro no banco de dados.

Então, fiz um programinha para fazer isto. Vocês podem alterar conforme a necessidade, mas vale como exemplo.

#INCLUDE 'PROTHEUS.CH'
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "protheus.ch"

USER FUNCTION XIMPORTA
Local cArq    := "CEP_AGENCIA.TXT"
Local aRange  := {}
Local cDir    := "E:\"
Local cCol1     := ""
Local cCol2     := ""

Local pCol1     := ""
Local pCol2     := ""

Local aTables   := { "SZZ" }
Local pAnte

RPCSetType( 3 )
RpcSetEnv ( "01", "01", Nil, Nil, "FAT", Nil, aTables )

Private aErro := {}

Conout("Carregando arquivo ...")
FT_FUSE(cDir+cArq)
FT_FGOTOP()

// Carrega a linha previamente
cLinha := FT_FREADLN()
aadd(aRange,{"",""})

pCol1   := Substr(cLinha,1,5)
pCol2   := Substr(cLinha,6,3)
pAnte   := Substr(cLinha,6,3)
While !FT_FEOF()
   
    cCol1   := Substr(cLinha,1,5)
    cCol2   := Substr(cLinha,6,3)
   
    While cCol1 == pCol1
       
        aRange[Len(aRange)][01]:=cCol1 + cCol2 // COLUNA 1
        aRange[Len(aRange)][02]:=cCol1 + cCol2 // COLUNA 2
       
        pAnte   := Substr(cLinha,6,3)
        FT_FSKIP()
        cLinha := FT_FREADLN()
       
        pCol1   := Substr(cLinha,1,5)
        pCol2   := Substr(cLinha,6,3)
       
    Enddo

    aRange[Len(aRange)][02]:=cCol1 + pAnte // COLUNA 2
   
    Conout("Range novo " + aRange[Len(aRange)][01] + "-" + aRange[Len(aRange)][02])

    SZZ->(dbAppend(),.T.)
    SZZ->ZZ_FILIAL := SPACE(02)
    SZZ->ZZ_BANCO  := "745"
    SZZ->ZZ_CEPINI := aRange[Len(aRange)][01]
    SZZ->ZZ_CEPFIM := aRange[Len(aRange)][02]
    SZZ->(MSUNLOCK())
    aadd(aRange,{"",""})
    pCol1   := Substr(cLinha,1,5)
    pCol2   := Substr(cLinha,6,3)
EndDo
FT_FUSE()
RETURN

OBSERVAÇÕES GERAIS

Esta rotina foi feita para rodar fora do Protheus.

Abaixo segue um exemplo de como fiz :


Um comentário: