Página 1 de 1

Classe para consulta de CEP

Enviado: 07 Nov 2013 15:25
por bencz

Código: Selecionar todos

#include "hbxml.ch"
#include "hbclass.ch"

function main()
  local cep := BuscaCEP():New("99999999")
  ? cep:GetTipo() + " " + cep:GetLogradouro()
  ? cep:GetBairro()
  ? cep:GetCidade()
  ? cep:GetUF()
return nil

class BuscaCEP
private:
  data cLogradouro init ""
  data cBairro     init ""
  data cCidade     init ""
  data cTipo       init ""
  data cCep        init ""
  data cUF         init ""
  data cSrvResp    init ""

public:
  method new(cep) constructor
  method busca(cep)
  
  inline method GetLogradouro()
    return ::cLogradouro
  endmethod
   
  inline method GetBairro()
    return ::cBairro
  endmethod
   
  inline method GetCidade()
    return ::cCidade
  endmethod
  
  inline method GetTipo()
    return ::cTipo
  endmethod
   
  inline method GetUF()
    return ::cUF
  endmethod
  
  inline method GetSrvSts()
    return ::cSrvResp
  endmethod  
endclass

method new(cep) class BuscaCEP
  if cep != nil
    ::cCep := cep
  else        
    ::cCep := "99999999"       
  endif
  ::busca()
return self

method busca(cep) class BuscaCEP
  local oHttp, cXML
  local oDoc, oIterator          
  
  if cep != nil
    ::cCep := cep
  endif
  
  oHttp:= TIpClientHttp():new( "http://cep.republicavirtual.com.br/web_cep.php?cep="+::cCep+"&formato=xml" ) 
  oHttp:open() 
  cXML := oHttp:readAll()
  oHttp:close()
  
  oDoc := TXmlDocument():New(cXML, HBXML_STYLE_NOESCAPE)
  if oDoc:nError != HBXML_ERROR_NONE
    ? "Erro ao ler o XML dos correios"
  endif

  oIterator := TXmlIterator():New( oDoc:findfirst( "webservicecep" ) ) 
  if oIterator:Next():cData == "1"
     ::cSrvResp    := oIterator:Next():cData
     ::cUF         := oIterator:Next():cData
     ::cCidade     := oIterator:Next():cData
     ::cBairro     := oIterator:Next():cData
     ::cTipo       := oIterator:Next():cData
     ::cLogradouro := oIterator:Next():cData
  else
    ? "ERRO :("
  endif
  
return nil

Classe para consulta de CEP

Enviado: 08 Nov 2013 02:50
por alxsts
Olá!

Muito bacana! Obrigado por compartilhar. Vou testar.

Interessante: atualmente, muitos tópicos postados neste site, que é o maior site ativo a tratar de um dinossauro chamado xBase, exemplificam programação orientada a objetos. Seria a a prova concreta da sobrevivência da alma?

Classe para consulta de CEP

Enviado: 08 Nov 2013 09:09
por bencz
"Interessante: atualmente, muitos tópicos postados neste site, que é o maior site ativo a tratar de um dinossauro chamado xBase, exemplificam programação orientada a objetos. Seria a a prova concreta da sobrevivência da alma?", Alexandre

Lindo isto que você postou Alexandre :)

Bom, eu sou adepto a programação OO para no xBase, repare que praticamente em todos os exemplos que postei, utilizo apenas a programação OO, acho muito legal a programação xBase em conjunto com OO.

Poderiamos fazer um incentivo aqui na comunidade, oque acha ?

Classe para consulta de CEP

Enviado: 08 Nov 2013 10:08
por fladimir
Olha eu não entendo muito de OOP mas to dentro no q eu puder ajudar/aprender vamos juntos.

[]´s

Classe para consulta de CEP

Enviado: 08 Nov 2013 18:58
por JoséQuintas
Como eu já falei aqui no grupo, tem horas que não sei se estou facilitando ou complicando.
Na sua classe, sinceramente, achei que complicou o que não precisava complicar.
Aqui minha rotina é esta, que uso durante os GETs de cadastro:

Código: Selecionar todos

@ 1, 0 SAY "CEP:" GET mCep PICTURE "99999-999" VALID CepOk( @mCep, @mEndereco, @mCidade, @mUf )
@ Row()+1, 0 SAY "Endereco:" GET mEndereco
@ Row()+1, 0 SAY "Número:" GET mNumero
@ Row()+1, 0 SAY "Cidade:" GET mCidade
@ Row()+1, 0 SAY "UF:" GET mUF
READ

FUNCTION CepOk( mCep, mEndereco, mBairro, mCidade, mUf )
   LOCAL mTexto
   
   IF Val( SoNumeros( mCep ) ) == 0
      RETURN .T.
   ENDIF
   mTexto := WebCep( mCep )
   mUf       := Pad( XmlNode( mTexto, "UF" ), 2 )
   mCidade   := Pad( XmlNode( mTexto, "CIDADE" ), Len( mCidade ) )
   mBairro   := Pad( XmlNode( mTexto, "BAIRRO" ), Len( mBairro ) )
   mEndereco := Pad( XmlNode( mTexto, "LOGRADOURO" ), Len( mEndereco ) )
   RETURN .T.

Classe para consulta de CEP

Enviado: 09 Nov 2013 13:17
por bencz
JoséQuintas, boa tarde!

BOm, a sua versão é funcional sim, comletamente, mas ai acabamos voltando para a ideia de programação tradicional do xBase, a idéia q eu quis apresentar é simplesmente a ideia do POO com xBase :)

Classe para consulta de CEP

Enviado: 09 Nov 2013 22:03
por JoséQuintas
Programação tradicional do xbase?
Que tal em VB?

Código: Selecionar todos

PUBLIC FUNCTION CepOk( mCep As String, mEndereco As String, mBairro As String, mCidade As String, mUf As String)
   DIM mTexto AS String
   
   IF Val( SoNumeros( mCep ) ) = 0
      RETURN TRUE
   ENDIF
   mTexto = WebCep( mCep )
   mUf      = Pad( XmlNode( mTexto, "UF" ), 2 )
   mCidade  = Pad( XmlNode( mTexto, "CIDADE" ), Len( mCidade ) )
   mBairro   = Pad( XmlNode( mTexto, "BAIRRO" ), Len( mBairro ) )
   mEndereco = Pad( XmlNode( mTexto, "LOGRADOURO" ), Len( mEndereco ) )
   RETURN TRUE
Seu exemplo pode ser usado como está, pode ser usado pra aprender OOP, pra fazer um webservice, ou pra usar a biblioteca de XML.
O exemplo é válido.
OOP é ótimo, uso muito. Eu só comentei que acho que pra esse caso só complica.