Página 1 de 1

Busca de CEP via net

Enviado: 22 Abr 2015 13:02
por Paulo_CPV
Boa tarde!

Colegas do fórum eu estou adaptando uma função de busca de cep's via net postada na seção Harbour para Minigui Extend, mas não estou conseguindo pois não estou encontrando a função TIPClientHTTP().

Código: Selecionar todos

/*******************************************************************************
 *  Test the use of classes to check the Brazilian postal code (CEP) 
 *  It uses the free service: ViaCEP (http://viacep.com.br)
 *  
 *  It uses the free service "ViaCEP" http://viacep.com.br  
 *  Visit the site to learn more
 * 
 *  Special thanks to Leandro and Franco for offering the free service!
 * 
 *  Thanks to Eric for the idea!
 *
 *
 *  Copyright (c) 2015 - Mario Wan Stadnik (Qatan)
 *  wanstadnik(at)gmail.com
 *
 *  Free to the public domain
 *
 *  
 *  To build:  HBMK2 Test_ViaCEP hbtip.hbc
 *
 */
 
announce HB_GTSYS
request  HB_GT_WVT_DEFAULT
request  HB_CODEPAGE_FRISO
 
PROCEDURE Main( cCEP )

   LOCAL oCep

   hb_cdpSelect( 'FRISO' )
   SETCOLOR( 'G+/N' )
	SETMODE( 25,80)
	SET CONFIRM ON
	
	DO WHILE .T.
	   cCEP := SPACE( 8 )
	   
      @ 00,00 SAY "CEP...:" GET cCEP PICT '@R 99999-999' VALID( LEN( ALLTRIM( cCEP ) ) == 8 )
	   @ MAXROW(),00 SAY "Digite o CEP ou tecle <ESC> para encerrar" COLOR 'R+/N'
	   READ
	   IF LASTKEY() == 27
	      EXIT
	   ENDIF
		   
	   CLS
	   
      oCep := cepWeb( cCEP )
      IF oCep == NIL
         ALERT( "Erro! Tente novamente" )
         LOOP
      ENDIF
      ?   
      ? 'CEP...:', oCep:cCEP
      ? 'IBGE..:', oCep:cIBGE
      ? 'LOGRAD:', oCep:cLogradouro
      ? 'COMPLE:', oCep:cComplemento
      ? 'BAIRRO:', oCep:cBairro
      ? 'CIDADE:', oCep:cLocalidade
      ? 'UF....:', oCep:cUF
      
   ENDDO
	  
RETURN


/*******************************************************************************
 *  This is the function and the class that it uses to work
 *  The engine of this is the contrib 'hbtip'
 *
 *  It uses the free service "ViaCEP" http://viacep.com.br  
 *  Visit the site to learn more
 * 
 *  Special thanks to Leandro and Franco for offering the free service!
 * 
 *  Thanks to Eric for the idea!
 *
 *
 *  Copyright (c) 2015 - Mario Wan Stadnik (Qatan)
 *  wanstadnik(at)gmail.com
 *
 *  Free to the public domain
 *
 */
FUNCTION cepWeb( cCEP)
   LOCAL oCEP := ViaCEP():New( cCEP )
RETURN oCEP


/* 
 *  ViaCEP Class
 */

#include 'hbclass.ch'

CREATE CLASS ViaCEP
   VAR oCep
   VAR cCep         INIT '' 
   VAR cIBGE        INIT '' 
   VAR cLogradouro  INIT '' 
   VAR cComplemento INIT '' 
   VAR cBairro      INIT '' 
   VAR cLocalidade  INIT '' 
   VAR cUF          INIT '' 
   METHOD New( cCEP )
ENDCLASS

   
METHOD New( cCEP )

   oHttp := TIPClientHTTP():new( "http://viacep.com.br/ws/" + cCEP + "/piped/" )

   IF ! oHttp:open()
      RETURN NIL
   ENDIF
   
   cHtml := oHttp:readAll()
   oHttp:close()
  
	cHtml := HB_UTF8TOSTR( cHtml ) 
	aHtml := hb_aTokens( cHtml, '|' )

	IF LEN( aHtml ) < 7
      RETURN NIL
   ENDIF
   
   cCEP         := SUBSTR( aHtml[1], AT( ':', aHtml[1] ) + 1 )
   cLogradouro  := SUBSTR( aHtml[2], AT( ':', aHtml[2] ) + 1 )
   cComplemento := SUBSTR( aHtml[3], AT( ':', aHtml[3] ) + 1 )
   cBairro      := SUBSTR( aHtml[4], AT( ':', aHtml[4] ) + 1 )
   cLocalidade  := SUBSTR( aHtml[5], AT( ':', aHtml[5] ) + 1 )
   cUF          := SUBSTR( aHtml[6], AT( ':', aHtml[6] ) + 1 )
   cIBGE        := SUBSTR( aHtml[7], AT( ':', aHtml[7] ) + 1 )

   ::cCEP         := cCEP
   ::cLogradouro  := cLogradouro
   ::cComplemento := cComplemento
   ::cBairro      := cBairro
   ::cLocalidade  := cLocalidade
   ::cUF          := cUF
   ::cIBGE        := cIBGE
   
RETURN Self
Desde já agradeço a quem possa me dar uma luz de onde eu chamo está função.

Abraços,

Paulo - Jacareí/SP

Busca de CEP via net

Enviado: 22 Abr 2015 14:27
por Toledo
Paulo_CPV escreveu:* To build: HBMK2 Test_ViaCEP hbtip.hbc
Paulo_CPV escreveu: não estou conseguindo pois não estou encontrando a função TIPClientHTTP()
Conforme orientação no código fonte, você tem que incluir na compilação a lib hbtip.

Então, se você estiver compilando com o HBMK2, basta incluir na linha de comando o parâmetro -lhbtip ou incluir este comando no arquivo HBP.

Abraços,

Busca de CEP via net

Enviado: 22 Abr 2015 16:40
por Paulo_CPV
Boa tarde!

Toledo muito obrigado pela sua dica, mas não estou conseguindo compilar ou gerar a lib, pois estou utilizando o Minigui Extend + BCC. O que devo fazer para gerar está lib para Harbour?

Abraços,

Paulo - Jacareí/SP

Busca de CEP via net

Enviado: 22 Abr 2015 17:46
por Toledo
Paulo_CPV escreveu:estou utilizando o Minigui Extend + BCC. O que devo fazer para gerar está lib para Harbour?
Amigo, a lib já vem com o harbour da MiniGui Extended, veja a pasta \MINIGUI\Harbour\Lib e procure pela hbtip.lib.

Bom, como disse na mensagem anterior, você tem que relacionar a lib hbtip na compilação, então para lhe ajudar melhor, você teria que passar como você está compilando este seu programa. Se está usando o HBMK2 ou algum arquivo HBP para compilar!

Abraços,

Busca de CEP via net

Enviado: 27 Abr 2015 15:50
por Paulo_CPV
Boa tarde!

Caro Toledo eu estou compilando o meu sistema da seguinte forma: Fiz um arquivo .Bat com a seguinte linha:

Código: Selecionar todos

G:\minigui\Batch\Compile.Bat sismaincli /Z /M >erro.txt
Eu utilizo o NotePad++ para produção do meu sistema e também uso a IDE do HMG para os formulários.

Abraços,

Paulo - Jacareí/SP

Busca de CEP via net

Enviado: 27 Abr 2015 18:30
por Toledo
Amigo, neste caso digite:

Código: Selecionar todos

G:\minigui\Batch\Compile.Bat sismaincli /L hbtip /Z /M >erro.txt
Abraços,

Busca de CEP via net

Enviado: 27 Abr 2015 22:00
por Paulo_CPV
Boa noite!

Toledo, coloquei a opção L/ hbtip e quando compilo aparece a seguinte mensagem de erro:

Código: Selecionar todos

Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
sismaincli.c:
Turbo Incremental Link 5.60 Copyright (c) 1997-2002 Borland
Error: Unresolved external 'WSAIoctl' referenced from G:\MINIGUI\HARBOUR\LIB\HBRTL.LIB|hbsocket
Error: Unresolved external 'GetAdaptersInfo' referenced from G:\MINIGUI\HARBOUR\LIB\HBRTL.LIB|hbsocket

Link error.

Pressione qualquer tecla para continuar. . . 
Desde já agradeço a ajuda.

Abraços,

Paulo - Jacareí/SP

Busca de CEP via net

Enviado: 28 Abr 2015 08:28
por Toledo
Paulo, para que eu possa lhe ajudar melhor, me responda o seguinte:

1 - Este seu programa (sismaincli) você já compilava ele normalmente antes de tentar colocar a função de busca de CEP?

2 - Este seu programa é modo console (com visual igual ao Clipper) ou é modo gráfico (Windows)?

3 - Você está usando qual versão da MiniGui Extended?

4 - No comando de compilação você está usando /Z (ziparchive.lib) e /M (hbmysql.lib e libmysql.lib), então neste seu programa você está usando funções da ziparchive.lib (criação de arquivos ZIP) e também funções da hbmysql.lib e libmysql.lib para acesso a banco de dados MySQL?

Abraços,

Busca de CEP via net

Enviado: 28 Abr 2015 09:40
por Nascimento
Amigo Paulo veja se esse exemplo lhe serve
os Fontes estao inclusos

esta nessa link a pagina https://sites.google.com/site/hblibs/ex ... webservice

https://sites.google.com/site/hblibs/ex ... ects=0&d=1

feitos pelo nosso amigo, Stanis Luksys,

Busca de CEP via net

Enviado: 28 Abr 2015 11:23
por Paulo_CPV
Bom dia!

Toledo, respondendo as suas questões:

1. O programa compila normalmente sem a função de busca de CEP.
2. A aplicação é em modo Windows.
3. A versão do Minigui Extend que estou usando é a mais recente 2.4.6.
4. Crio arquivos .Zip para backup dos arquivos de dados o sistema e o acesso aos bancos de dados ainda estou utilizando os arquivos .Dbf, mas vou migrá-los para MySql.

Abraços,

Paulo - Jacareí/SP

Busca de CEP via net

Enviado: 28 Abr 2015 15:23
por Toledo
Paulo, incluir também na compilação a lib ws2_32.lib:

Código: Selecionar todos

G:\minigui\Batch\Compile.Bat sismaincli /L hbtip /L ws2_32 /Z /M >erro.txt
Segue em anexo um demo (para compilar veja início do arquivo demo.prg).

Abraços,

Busca de CEP via net

Enviado: 28 Abr 2015 22:32
por Paulo_CPV
Boa noite!

Toledo, fiz as modificações no arquivo de compilação como você propôs, mas ainda está dando erro, mesmo fazendo como exemplo no arquivo de demo, tirando ou deixando a opção /M da compilação está dando o mesmo erro:

Código: Selecionar todos

Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
sismaincli.c:
Turbo Incremental Link 5.60 Copyright (c) 1997-2002 Borland
Error: Unresolved external 'GetAdaptersInfo' referenced from G:\MINIGUI\HARBOUR\LIB\HBRTL.LIB|hbsocket

Link error.

Pressione qualquer tecla para continuar. . . 


Abraços,

Paulo - Jacareí/SP

Busca de CEP via net

Enviado: 29 Abr 2015 04:52
por rochinha
Amiguinhos,

Deixo a minha contribuição.

Arquivo viaCEP.RC:

Código: Selecionar todos

viaCEP DIALOG 28, 62, 267, 206
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "DIALOG_1"
FONT 8, "MS Sans Serif"
{
 EDITTEXT 101, 37, 17, 47, 12
 PUSHBUTTON "Metodo 1", 105, 97, 14, 77, 16
 LTEXT "Nenhuma operação em curso.", 103, 10, 83, 247, 103
 GROUPBOX "Origem", -1, 4, 5, 84, 32, BS_GROUPBOX
 GROUPBOX "Logradouro", -1, 4, 38, 259, 31, BS_GROUPBOX
 GROUPBOX "Mensagem", -1, 4, 73, 259, 119, BS_GROUPBOX
 LTEXT "CEP:", -1, 9, 18, 26, 8
 GROUPBOX "Pesquisar CEP", -1, 92, 5, 171, 32, BS_GROUPBOX
 LTEXT "", 102, 9, 50, 248, 12, WS_BORDER | WS_GROUP
 LTEXT "viaCEP - Fivewin - 5Volution", -1, 167, 195, 95, 8, WS_DISABLED | WS_GROUP
 PUSHBUTTON "Metodo 2", 106, 180, 14, 77, 16
}
Arquivo viaCEP.PRG:

Código: Selecionar todos

#include "fivewin.ch"
//#include "hbcompat.ch"

static xDLL,oGet,oSay

Function Main()
   local oDlg, oFont
   local cCEP:=space(9)
   local cEND:=space(50)
   
   DEFINE FONT oFont NAME "ARIAL" SIZE 00,-12 BOLD
   SET _3DLOOK ON
   DEFINE DIALOG oDlg RESOURCE "viaCEP" TITLE "Correios - CEP"
   
          REDEFINE GET oGet101 VAR cCEP PICTURE "99999-999" ID 101 OF oDlg
          REDEFINE SAY oSay102 VAR cEND ID 102 OF oDlg
          REDEFINE SAY oSay106 MEMO ID 103 OF oDlg COLOR nRGB(255,0,0),getsyscolor(15)
          
          REDEFINE BUTTON ID 105 OF oDlg ACTION Consulta1( cCEP, oSay106, oSay102 )
          REDEFINE BUTTON ID 106 OF oDlg ACTION Consulta2( cCEP, oSay106, oSay102 )

   ACTIVATE DIALOG oDlg CENTERED
   return nil

Function Consulta1( cCepOrigem, oSay, oSay102 )
   local oRs, cRs, ws
   
   /* ****************************************************** */
   oSay:SetText( "Aguarde, consulta em andamento..." )
   cRs := "http://viacep.com.br/ws/" + cCepOrigem + "/xml/"

   oMSXML2 := TOleAuto():New( "MSXML2.ServerXMLHTTP" )
   oRS:= oMSXML2

   oRs:Open( "GET", cRs, .F.)
   oRs:Send()
   
   cRs := oRs:responseText
   
   oSay:SetText( cRs )
   /* ****************************************************** */

   cXMLErros := XMLGet( "logradouro", cRs )
   oSay102:SetText( cXMLErros )

   return nil

Function Consulta2( cCepOrigem, oSay, oSay102 )
   local oRs, cRs, ws
   
   /* ******************************************************
   oSay:SetText( "Aguarde, consulta em andamento..." )
   cRs := "http://viacep.com.br/ws/" + cCepOrigem + "/xml/"
   
   oRs := TdWebService():new()

   cRs := oRs:OpenWS( cRs )
   
   oRs:end()
   oSay:SetText( cRs )
   ****************************************************** */

   cXMLErros := XMLGet( "logradouro", cRs )
   oSay102:SetText( cXMLErros )
   return nil

Function XMLGet( XMLField, XMLFile )
   XMLField    := alltrim( XMLField )
   XMLFieldINI := rat( "<"+XMLField+">", XMLFile ) + len( "<"+XMLField+">" ) 
   XMLFieldEND := rat( "</"+XMLField+">", XMLFile ) - XMLFieldINI
   return substr( XMLFile, XMLFieldINI, XMLFieldEND )

/*
 *
 * Classe WebService
 *
 */
#include "dll.ch"

//static xdll
CLASS TdWebService
     DATA hOpen
     DATA sbuffer HIDDEN
     DATA xDLL HIDDEN

     METHOD New(buffersize) CONSTRUCTOR

     METHOD OpenWS(url)

     METHOD End()
ENDCLASS
*****************************
METHOD New(conexion,buffersize) CLASS TdWebService
DEFAULT buffersize:=64000
   ::sbuffer:=buffersize
   xDll:=LoadLib32("wininet.dll")
   ::hOpen = InternetOpen("TdWebService", 1,,, 0)
RETURN Self
*****************************
METHOD OpenWS(url) CLASS TdWebService
local hFile,ret,xml
   hFile = InternetOpenUrl(::hOpen, url,"",0,,0)
   xml:=space(::sbuffer)
   InternetReadFile(hFile, @xml, ::sbuffer, @Ret)
return subst(alltrim(xml),1,len(alltrim(xml))-5)
*****************************
METHOD End() CLASS TdWebService
   FreeLib32(xDll)
return nil
*****************************

DLL32 FUNCTION InternetOpen( cApp as LPSTR, n1 AS DWORD, n2 AS LPSTR, n3 AS LPSTR,;
                             n4 AS DWORD ) AS LONG PASCAL ;
                             FROM "InternetOpenA" LIB xdll
Dll32 Function InternetReadFile(hFile As 7, @sBuffer As 8, lNumBytesToRead As 7, @lNumberOfBytesRead As 7) As 7 PASCAL Lib xdll
Dll32 Function InternetOpenUrl(hInternetSession As 7, lpszUrl As 8, lpszHeaders As 8, dwHeadersLength As 7, dwFlags As 7, dwContext As 7) As 7 FROM "InternetOpenUrlA" PASCAL Lib xdll
DLL32 FUNCTION InternetCloseHandle( hSession AS LONG ) AS BOOL PASCAL LIB xdll
//DLL32 FUNCTION FtpOpenFile( hFTP AS LONG, cRemoteFile AS LPSTR, n1 AS LONG, n2 AS LONG, n3 AS LONG ) AS LONG PASCAL FROM "FtpOpenFileA" LIB xDll
DLL32 FUNCTION InternetConnect( hInternet AS LONG, cServerName AS LPSTR, nServerPort AS LONG, cUserName AS LPSTR, cPassword AS LPSTR, nService AS LONG, nFlags AS LONG, @nContext AS PTR ) AS LONG PASCAL FROM "InternetConnectA" LIB xDll
DLL32 FUNCTION FTPGetFile( hConnect AS LONG, cRemoteFile AS LPSTR, cNewFile AS LPSTR, nFailIfExists AS LONG, nFlagsAndAttribs AS DWORD, nFlags AS DWORD, @nContext AS PTR ) AS BOOL PASCAL FROM "FtpGetFileA" LIB xDll
DLL32 FUNCTION FTPPutFile( hConnect AS LONG, cLocalFile AS LPSTR, cNewRemoteFile AS LPSTR, nFlags AS DWORD, @nContext AS PTR ) AS BOOL PASCAL FROM "FtpPutFileA" LIB xDll
DLL32 FUNCTION InternetWriteFile( hFile AS LONG, cBuffer AS LPSTR, lSize AS LONG, @nSize AS PTR ) AS BOOL PASCAL LIB xDll
DLL32 FUNCTION InternetSetFilePointer( hFile AS LONG, nDistanceToMove AS LONG, nReserved AS LPSTR, nSeekMethod AS LONG, @nContext AS PTR ) AS BOOL PASCAL LIB xDll
DLL32 FUNCTION FtpFindFirstFile( hFTP AS LONG, cMask AS LPSTR, @cWin32DataInfo AS LPSTR, n1 AS LONG, n2 AS LONG ) AS LONG PASCAL FROM "FtpFindFirstFileA" LIB xDll
DLL32 FUNCTION InternetFindNextFile( hFTPDir AS LONG, @cWin32DataInfo AS LPSTR ) AS BOOL PASCAL FROM "InternetFindNextFileA" LIB xDll
Coloquei dois métodos que uso, mas o segundo não retornou nada. Mais tarde farei mais testes.

Busca de CEP via net

Enviado: 29 Abr 2015 08:07
por Toledo
Paulo_CPV escreveu:Borland C++ 5.6 for Win32 Copyright ( c ) 1993, 2002 Borland
O problema está nesta versão do Borland BCC que você está usando, aqui eu ainda estou na versão 5.5, então não ocorre este problema na compilação. Existe alguma razão de você estar usando a versão 5.6 da Borland BCC?

Bom, como não tenho esta versão da Borland BCC, vou dar um chute aqui para tentar resolver o problema, mude o comando para compilação novamente:

Código: Selecionar todos

G:\minigui\Batch\Compile.Bat sismaincli /L hbtip /L ws2_32 /L iphlpapi /Z /M >erro.txt
Abraços,