Página 1 de 5

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 27 Dez 2016 18:46
por Marcos
Senhores, alguém poderia nos ajudar com esta questão, preciso implementar em uma aplicação GUI utilizando Harbour com Minigui a consulta de Cep pela Internet, e importar as informações e assim gravar em um banco Mysql, se alguém nos ajudar seria de grande valia.

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 27 Dez 2016 20:54
por fladimir
Tem algumas formas...

Vc pode usar o ACBr como ponte, gera o comando em um arquivo TXT na pasta q é monitorada pelo ACBr ou acessa o ACBr via TCP e manda o comando e le o retorno, se for via TXT o retorno será lido através de memoread por exemplo.

Fora isto se souber algum webservice q forneça a informação pode acessar o webservice e tratar o retorno através de métodos GET e POST (tem exemplo aqui no fórum)

Ou já tem tb banco de dados com os CEPs etc em SQL ai seria somente alterar o script para inserir no seu banco.

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 27 Dez 2016 22:05
por Fernando queiroz

Código: Selecionar todos

***************************
static FUNCTION ConsultarCEP
***************************
LOCAL oHttp, cXML, cCep
LOCAL cRes, cResTxt, cUf, cCidade, cTipo, cEnde, cBairro
 
DO WHILE .T.
	IF M->CEP = SPACE(09)
	   RETURN .F.
	ENDIF
	oHttp:= TIpClientHttp():new( "http://www.jpatecnologia.com.br/cep.asp?cep="+M->Cep+"&clipper=1" )
	IF ! oHttp:open()
		Alert( "Erro na conexů: "+ oHttp:lastErrorMessage() )
		RETURN .T.
	ENDIF
	cXML := oHttp:readAll()
	oHttp:close()

	IF Empty(cXML)
**		alert( "Ocorreu um erro inesperado. Tente outro CEP...")
		return .t.
	ENDIF


	cUf 		:= Substr( cXML, At("<uf>",cXML)+4, At("</uf>",cXML)-At("<uf>",cXML)-4 )
	cCidade		:= Substr( cXML, At("<cidade>",cXML)+8, At("</cidade>",cXML)-At("<cidade>",cXML)-8 )
	cEnde		:= Substr( cXML, At("<logradouro>",cXML)+12, At("</logradouro>",cXML)-At("<logradouro>",cXML)-12 )
	cBairro		:= Substr( cXML, At("<bairro>",cXML)+8, At("</bairro>",cXML)-At("<bairro>",cXML)-8 )

	IF LEN(cEnde) # 0
	   M->ENDER := cEnde+space(60-len(cEnde))
	endif
	IF LEN(cBairro) # 0
	   M->BAIR  := cBairro+SPACE(50-LEN(Cbairro))
	endif   
	IF LEN(cCidade) # 0
		M->CIDADE:= cCidade+space(50-len(cCidade))
	endif
	IF LEN(cUf) # 0
		M->UF:= cUf+space(02-len(cCidade))
	endif
	return .t.
 	
ENDDO

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 28 Dez 2016 15:28
por Fernando queiroz
Marcos
respondendo a sua indagação se a função é clipper, ela esta funcionando em HARBOUR o parâmetro clipper nela é somente para retornar todas as letras em MAIÚSCULAS E SEM ACENTOS



#include "hbgtinfo.ch" no .PRG

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 28 Dez 2016 18:27
por JoséQuintas
Dividindo em etapas:

Código: Selecionar todos

PROCEDURE Main

   LOCAL cCep := Space(8), cEndereco := Space(40), cBairro := Space(20), cCidade := Space(20), cUF := Space(2)
   CLS
   @ 2, 20 GET cCep PICTURE "99999-999" VALID CepOk( @cCep, @cEndereco, @cBairro, @cCidade, @cUF )
   @ 3, 20 GET cEndereco
   @ 4, 20 GET cBairro
   @ 5, 20 GET cCidade
   @ 6, 20 GET cUF
   READ

   RETURN

FUNCTION CepOk( mCep, mEndereco, mBairro, mCidade, mUf, mPesquisa )

   LOCAL mTexto

   hb_Default( @mPesquisa, .T. )
   IF Val( SoNumeros( mCep ) ) == 0 .OR. ! mPesquisa
      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.

FUNCTION WebCep( cCep )

   LOCAL cTexto

   WSave()
   Mensagem( "Consultando CEP nos correios, ESC abandona" )
   cTexto := DownloadTexto( ;
      "http://www.jpatecnologia.com.br/cep.asp" + ;
      "?cep=" + cCep + ;
      "&usuario=pctoledo"+ ;
      "&empresa=pctoledo" + ;
      "&CLIPPER=1" )
   WRestore()
   cTexto := iif( ValType( cTexto ) == "C", cTexto, "" )

   // Talvez salvar neste ponto

   RETURN cTexto

FUNCTION DownloadTexto( cUrl )

   LOCAL oSoap, cRetorno, aRetorno, nAscii

   cRetorno := ""
   BEGIN SEQUENCE WITH __BreakBlock()
      oSoap := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
      oSoap:Open( "GET", cUrl, .F.)
      oSoap:Send()
      aRetorno := oSoap:ResponseBody()
      IF ValType( aRetorno ) == "C"
         cRetorno := aRetorno
      ELSE
         cRetorno := ""
         FOR EACH nAscii IN aRetorno
            cRetorno += Chr( nAscii )
         NEXT
      ENDIF
   END SEQUENCE

   RETURN cRetorno
As funções extras são do meu aplicativo, mas pelo nome pode fazer equivalente - SE PRECISAR.

SoNumeros() - retorna só os números
WSave(), WRestore() - salva tela/restaura
Mensagem(), MsgExclamation(), etc.... - mensagens
XmlNode() - extrair blocos de XML. Tem na SefazClass a mais nova.

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 28 Dez 2016 18:35
por JoséQuintas
Nota

Está separado porque:

- A rotina de baixar algo da internet serve pra muita coisa, não só pro CEP
- A rotina de consultar CEP pode ser usada em outras formas
- Validar o CEP pra preencher automático, tem a rotina própria

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 08:14
por Marcos
Obrigado a todos pelo retorno, mas não tenho conhecimento suficiente para portar isto tudo para harbour. Alguém teria algo pronto para harbour?

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 08:59
por JoséQuintas
Obrigado a todos pelo retorno, mas não tenho conhecimento suficiente para portar isto tudo para harbour. Alguém teria algo pronto para harbour?
Fiquei confuso, porque a rotina postada já é em Harbour.

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 09:13
por Marcos
JoséQuintas, na verdade sou Eu que fiz confusão, vou testar e reporto o resultado, desculpe a falta de experiência.

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 11:29
por Marcos
JoséQuintas, veja abaixo a rotina feita separadamente, não retornou nenhum resultado, acredito que esta faltando alguma coisa por ser GUI, pode me ajudar ?

Código: Selecionar todos

#include 'minigui.ch'

function Consulta_Cep()
local cCep     := ''
local cEndereco:= ''
local cBairro  := ''
local cCidade  := ''
local cUF      := ''
define window form_cep;
   at 000,000;
   width 500;
   height 305;
   title 'Consultar Cep (online)';
   icon 'ICONEZED';
   modal;
   nosize
   @ 030,005 label lbl_cep;
      of form_cep;
      value 'CEP';
      autosize;
      font 'tahoma' size 010;
      bold;
      fontcolor _preto_001;
      transparent
   @ 030,070 textbox tbox_cep;
      of form_cep;
      height 027;
      width 85;
      value cCep;
      font 'tahoma' size 010;
      backcolor _fundo_get;
      fontcolor _letra_get_1;
      inputmask '99999-999'
   @ 060,005 label lbl_endereco;
      of form_dados;
      value 'Endereço';
      autosize;
      font 'tahoma' size 010;
      bold;
      fontcolor _preto_001;
      transparent
   @ 060,070 textbox tbox_endereco;
      of form_cep;
      height 027;
      width 380;
      value cEndereco;
      font 'tahoma' size 010;
      backcolor _fundo_get;
      fontcolor _letra_get_1
   @ 090,005 label lbl_bairro;
      of form_dados;
      value 'Bairro';
      autosize;
      font 'tahoma' size 010;
      bold;
      fontcolor _preto_001;
      transparent
   @ 090,070 textbox tbox_bairro;
      of form_cep;
      height 027;
      width 280;
      value cBairro;
      font 'tahoma' size 010;
      backcolor _fundo_get;
      fontcolor _letra_get_1
   @ 0120,005 label lbl_cidade;
      of form_dados;
      value 'Cidade';
      autosize;
      font 'tahoma' size 010;
      bold;
      fontcolor _preto_001;
      transparent
   @ 0120,070 textbox tbox_cidade;
      of form_cep;
      height 027;
      width 250;
      value cCidade;
      font 'tahoma' size 010;
      backcolor _fundo_get;
      fontcolor _letra_get_1
   @ 0160,005 label lbl_uf;
      of form_dados;
      value 'UF';
      autosize;
      font 'tahoma' size 010;
      bold;
      fontcolor _preto_001;
      transparent
   @ 0160,070 textbox tbox_uf;
      of form_cep;
      height 027;
      width 30;
      value cUf;
      font 'tahoma' size 010;
      backcolor _fundo_get;
      fontcolor _letra_get_1
   define label linha_rodape
      col 000
      row form_cep.height-090
      value ''
      width form_cep.width
      height 001
      backcolor _preto_001
      transparent .F.
   end label
   *  botões
   define buttonex button_ok
      picture 'IMG_BUSCA'
      col form_cep.width-225
      row form_cep.height-085
      width 120
      height 050
      caption 'Ok, buscar'
      action CepOk( @cCep, @cEndereco, @cBairro, @cCidade, @cUF )
      fontbold .T.
      tooltip 'Buscar online as informações Digitadas'
      flat .F.
      noxpstyle .T.
   end buttonex
   define buttonex button_cancela
      picture 'IMG_VOLTAR'
      col form_cep.width-100
      row form_cep.height-085
      width 090
      height 050
      caption 'Voltar'
      action form_cep.release
      fontbold .T.
      tooltip 'Sair desta tela sem gravar informações'
      flat .F.
      noxpstyle .T.
   end buttonex
end window
form_cep.center
form_cep.activate
return(nil)
*-------------------------------------------------------------------------------
static function CepOk( mCep, mEndereco, mBairro, mCidade, mUf, mPesquisa )
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 ) )
******ACRESCENTEI ESTA PARTE ****
if form_cep.tbox_endereco.Value = mEndereco
   msgstop('Esta aqui', + mEndereco)
else
   msgstop('Esta aqui')
endif
**************************************
RETURN NIL
*-------------------------------------------------------------------------------
FUNCTION WebCep( cCep )
LOCAL cTexto
*Mensagem( "Consultando CEP nos correios, ESC abandona" )
cTexto := DownloadTexto( ;
         "http://www.jpatecnologia.com.br/cep.asp" + ;
	      "?cep=" + cCep + ;
	      "&usuario=pctoledo"+ ;
	      "&empresa=pctoledo" + ;
	      "&CLIPPER=1" )

	   cTexto := iif( ValType( cTexto ) == "C", cTexto, "" )

	   // Talvez salvar neste ponto
RETURN cTexto
*-------------------------------------------------------------------------------
FUNCTION DownloadTexto( cUrl )
LOCAL oSoap, cRetorno, aRetorno, nAscii
cRetorno := ""
BEGIN SEQUENCE WITH __BreakBlock()
   oSoap := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
   oSoap:Open( "GET", cUrl, .F.)
   oSoap:Send()
   aRetorno := oSoap:ResponseBody()
   IF ValType( aRetorno ) == "C"
      cRetorno := aRetorno
   ELSE
      cRetorno := ""
      FOR EACH nAscii IN aRetorno
         cRetorno += Chr( nAscii )
      NEXT
   ENDIF
END SEQUENCE
RETURN cRetorno
*-------------------------------------------------------------------------------
FUNCTION XmlNode( cXml, cNode, lComTag )
LOCAL nInicio, nFim, cResultado := ""
hb_Default( @lComTag, .F. )
nInicio := At( "<" + cNode, cXml )
// a linha abaixo é depois de pegar o início, senão falha
IF " " $ cNode
cNode := Substr( cNode, 1, At( " ", cNode ) - 1 )
ENDIF
IF nInicio != 0
IF ! lComTag
 nInicio := nInicio + Len( cNode ) + 2
 IF nInicio != 1 .AND. Substr( cXml, nInicio - 1, 1 ) != ">" // Quando tem elementos no bloco
   nInicio := hb_At( ">", cXml, nInicio ) + 1
 ENDIF
ENDIF
nFim := hb_At( "</" + cNode + ">", cXml, nInicio )
IF nFim != 0
 nFim -=1
 IF lComTag
   nFim := nFim + Len( cNode ) + 3
 ENDIF
 cResultado := Substr( cXml, nInicio, nFim - nInicio + 1 )
ENDIF
ENDIF
RETURN cResultado

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 12:22
por Toledo
Amigo, tente estas modificações:

Código: Selecionar todos

  @ 030,070 textbox tbox_cep;
	      of form_cep;
	      height 027;
	      width 85;
	      value cCep;
	      font 'tahoma' size 010;
	      backcolor _fundo_get;
	      fontcolor _letra_get_1;
	      inputmask '99999-999';
	      on enter {|| CepOk(StrTran(form_cep.tbox_cep.Value,"-",""))}

Código: Selecionar todos

static function CepOk( mCep )
mTexto := WebCep( mCep )
form_cep.tbox_uf.Value := Pad( XmlNode( mTexto, "uf" ), 2 )
form_cep.tbox_cidade.Value := Pad( XmlNode( mTexto, "cidade" ), 25 )
form_cep.tbox_bairro.Value := Pad( XmlNode( mTexto, "bairro" ), 25 )
form_cep.tbox_endereco.Value := Pad( XmlNode( mTexto, "logradouro" ), 40 )
RETURN NIL
No campo CEP digite o cep e depois pressione ENTER.

Abraços,

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 13:25
por JoséQuintas
A minigui não aceita algo assim?

Código: Selecionar todos

... on enter { || CepOk( @form_cep.tbox_cep.Value, @form_cep.tbox_endereco.Value, @form_cep.tbox_bairro.value, @form_cep.tbox.cidade.value, @form_cep.tbox_uf.value ) }

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 14:59
por Marcos
Mestres Toledo e JoséQuintas não deu certo nenhuma opção, se colocar no evento on enter não acontece nada, se colocar no evento action do botão dá erro.

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 16:53
por Toledo
Amigo, segue em anexo o seu código com as alterações que passei na minha mensagem anterior.

Abraços,

Consultar e Importar Cep da Internet para o Sistema.

Enviado: 30 Dez 2016 21:53
por JoséQuintas
Fugindo um pouco do assunto principal, mas sobre o exemplo postado:
Dá pra gerar a minigui que foi usada nesse exemplo com Harbour 3.4?
Como chegar até ela?

Sei que tem pelo menos 3 versões de minigui, e geralmente com Harbour próprio, então não sei se isso é possível, ou quais os caminhos.