Jump to content
Fivewin Brasil

CEP - Resolvido


betovsp

Recommended Posts

Segue minha contribuição neste assunto :wub:

* Função de busca de Endereço pelo CEP Utilizando WebService de CEP da republicavirtual.com.br
function BuscaCEP( cep, _cUF, cCidade, cEnde, cBairro, cCompl, _oDlg )
   LOCAL xmlhttp_resultado := "", cXML := ""
   DEFAULT cep := "", _cUF := "", cCidade := "", cEnde := "", cBairro := "", cCompl := ""
   if empty(cep) ; return .t. ; endif

   nOpc := Alert("Buscar CEP via", {"ViaCEP", "Rep.Virtual"}, "Escolha uma opção")
   IF nOpc = 1
      cLink := "https://viacep.com.br/ws/"+ALLTRIM(cep)+"/xml/?callback=meu_callback"
      cXML := Emt_GetHtml( cLink )
   	DeleteUrlCacheEntry(cLink) // Lipar Cache

      IF Empty(cXML) ; RETURN .F. ; ENDIF
      IF "<erro>true</erro>" $ cXML
         SysRefresh() ; MsgAlert("CEP não encontrado.", "Atenção!")
         RETURN .F.
      ENDIF

      cCodMun := MySubstr(cXML, '<ibge>', '<')
      _cUF    := MySubstr(cXML, '<uf>', '<')
      aCidUf  := DTBGetCid(cCodMun)
      cCidade := aCidUf[1]
      cEnde   := Upper(TiraAcentos(UnicodeToStr(MySubstr(cXML, '<logradouro>', '<'), .t.)))
      cCompl  := LEFT(Upper(TiraAcentos(UnicodeToStr(MySubstr(cXML, '<complemento>', '<'), .t.)))+SPACE(255), 255)
      cBairro := LEFT(Upper(TiraAcentos(UnicodeToStr(MySubstr(cXML, '<bairro>', '<'), .t.)))+SPACE(30),30)
   ELSEIF nOpc = 2
      url := "http://cep.republicavirtual.com.br/web_cep.php?cep="+ALLTRIM(cep)+"&formato=jsonp" // +"&formato=query_string"
      try
   		oUrl:=TUrl():New( url ) // From tip.lib
   		oHttp := TipClientHttp():New( oUrl , .f. ) // From tip.lib
      catch oErr
         SysRefresh() ; MsgAlert("Houve um erro: "+oErr:Description, "Atenção!")
      	return .f.
      end try

   	Try
   		oHttp:Open()
   		cXML := oHttp:ReadAll() // Baixa todo o conteúdo do site.
   	Catch oErr
         SysRefresh() ; MsgAlert("Houve um erro: "+oErr:Description, "Atenção!")
   		RETURN .f.
   	End
   	oHttp:Close()
   	DeleteUrlCacheEntry(url) // Lipar Cache

      cXML := "["+TiraAcentos(UnicodeToStr(cXML, .f.))+"]"
      cRes    := ""
      cResTxt := ""
      cTipo   := ""
   	hJson := {}
   	nLength := hb_JSONDecode( cXML, @hJson )
   	for nCep := 1 to len(hJson)
   		Li := hJson[nCep]
   		if len(Li) > 0
   	      try ; cRes    := LEFT(UPPER(Li["resultado"])+SPACE(50),50) ; catch ; end try && Para republicavirtual
   			try ; cResTxt := LEFT(UPPER(Li["resultado_txt"])+SPACE(50),50) ; catch ; end try
   			try ; _cUF    := LEFT(UPPER(Li["uf"])+SPACE(02),02) ; catch ; end try
   			try ; cCidade := LEFT(UPPER(Li["cidade"])+SPACE(30),30) ; catch ; end try
   			try ; cTipo   := LEFT(UPPER(Li["tipo_logradouro"])+SPACE(50),50) ; catch ; end try
   			try ; cEnde   := LEFT(UPPER(Li["tipo_logradouro"]) + " " + UPPER(Li["logradouro"])+SPACE(50),50) ; catch ; end try
   			try ; cBairro := LEFT(UPPER(Li["bairro"])+SPACE(30),30) ; catch ; end try
   		endif
   	next
   ENDIF

	if _oDlg == nil ; XBrowse(hJson,"Retorno") ; endif
	if _oDlg <> nil ; _oDlg:Update() ; endif
return .t.

FUNCTION MySubstr(cString, cStrtAt, cFnshAt)
   cRes := ""
   nIni := At(cStrtAt,  cString) + LEN(cStrtAt)
   if nIni > 0
      cSub := SubStr(cString, nIni)
      nFim := At(cFnshAt, cSub) - 1
      if nFim > 0
         cRes := SUBSTR(cSub, 1, nFim)
      endif
   endif
RETURN cRes

FUNCTION DTBGetCid(cCodMun)
   * Crie um script para obter o nome do municipio aqui
RETURN ""

FUNCTION UnicodeToStr(_cStr, lTiraAcento)
   LOCAL _cNewStr := _cStr
   LOCAL aConvert := {}
   AADD(aConvert, {"á", "\u00e1"})
   AADD(aConvert, {"à", "\u00e0"})
   AADD(aConvert, {"â", "\u00e2"})
   AADD(aConvert, {"ã", "\u00e3"})
   AADD(aConvert, {"ä", "\u00e4"})
   AADD(aConvert, {"Á", "\u00c1"})
   AADD(aConvert, {"À", "\u00c0"})
   AADD(aConvert, {"Â", "\u00c2"})
   AADD(aConvert, {"Ã", "\u00c3"})
   AADD(aConvert, {"Ä", "\u00c4"})
   AADD(aConvert, {"é", "\u00e9"})
   AADD(aConvert, {"è", "\u00e8"})
   AADD(aConvert, {"ê", "\u00ea"})
   AADD(aConvert, {"ê", "\u00ea"})
   AADD(aConvert, {"É", "\u00c9"})
   AADD(aConvert, {"È", "\u00c8"})
   AADD(aConvert, {"Ê", "\u00ca"})
   AADD(aConvert, {"Ë", "\u00cb"})
   AADD(aConvert, {"í", "\u00ed"})
   AADD(aConvert, {"ì", "\u00ec"})
   AADD(aConvert, {"î", "\u00ee"})
   AADD(aConvert, {"ï", "\u00ef"})
   AADD(aConvert, {"Í", "\u00cd"})
   AADD(aConvert, {"Ì", "\u00cc"})
   AADD(aConvert, {"Î", "\u00ce"})
   AADD(aConvert, {"Ï", "\u00cf"})
   AADD(aConvert, {"ó", "\u00f3"})
   AADD(aConvert, {"ò", "\u00f2"})
   AADD(aConvert, {"ô", "\u00f4"})
   AADD(aConvert, {"õ", "\u00f5"})
   AADD(aConvert, {"ö", "\u00f6"})
   AADD(aConvert, {"Ó", "\u00d3"})
   AADD(aConvert, {"Ò", "\u00d2"})
   AADD(aConvert, {"Ô", "\u00d4"})
   AADD(aConvert, {"Õ", "\u00d5"})
   AADD(aConvert, {"Ö", "\u00d6"})
   AADD(aConvert, {"ú", "\u00fa"})
   AADD(aConvert, {"ù", "\u00f9"})
   AADD(aConvert, {"û", "\u00fb"})
   AADD(aConvert, {"ü", "\u00fc"})
   AADD(aConvert, {"Ú", "\u00da"})
   AADD(aConvert, {"Ù", "\u00d9"})
   AADD(aConvert, {"Û", "\u00db"})
   AADD(aConvert, {"ç", "\u00e7"})
   AADD(aConvert, {"Ç", "\u00c7"})
   AADD(aConvert, {"ñ", "\u00f1"})
   AADD(aConvert, {"Ñ", "\u00d1"})
   AADD(aConvert, {"&", "\u0026"})
   AADD(aConvert, {"'", "\u0027"})
   FOR nX := 1 TO LEN(aConvert)
      IF aConvert[nX,2] $ _cNewStr
         _cNewStr := STRTRAN(_cNewStr, aConvert[nX,2], aConvert[nX,1])
      ENDIF
   NEXT
RETURN(IIF(lTiraAcento,TiraAcentos(_cNewStr),_cNewStr))

FUNCTION TiraAcentos(cStr)
   LOCAL cStrNew := "", nX, aAcento, aLetras
   aAcento := {"ã","Ã","Æ","Â"," ","µ","…","·","‚","","ˆ","Ò","¡","Ö","¢","à","ä","å","“","â","£","š","á","Á","à","À","é","É","ê","Ê","í","Í","ó","Ó","õ","Õ","ô","Ô","ú","Ú","ü","Ü","ù","ç","‡","Ç","€","§","¦","º","°","ª","ƒ"}
   aLetras := {"a","A","a","A","a","A","a","A","e","E","e","E","i","I","o","O","o","O","o","O","u","U","a","A","a","A","e","E","e","E","i","I","o","O","o","O","o","O","u","U","u","U"," ","c","c","C","C",".",".",".",".",".", ""}
   FOR nX := 1 TO LEN(aAcento)
       cStrNew := STRTRAN(cStr,aAcento[nX],aLetras[nX])
       cStr := cStrNew
   NEXT
   IF EMPTY(cStrNew) ; cStrNew := cStr ; ENDIF
RETURN(cStrNew)

* Clear browser cache
DLL Function DeleteUrlCacheEntry(lpszUrlName AS STRING) AS LONG PASCAL FROM "DeleteUrlCacheEntryA" LIB "wininet.dll"

 

Link to comment
Share on other sites

Ariston, muito legal, mas ler XML quando tem a possibilidade de ler JSON é furada, deixa o código mais complexo... Veja como fica mais simples ler o Json

 

Static function ConsultaCep()
Local cCep := "13380003"
Local cLink := "https://viacep.com.br/ws/" + cCep + "/json"
Local hCep := Hash()
 
cJson_Cep := Emt_GetHtml(cLink)
cJson_Cep := SemAcento(cJson_Cep)
 
hb_jsondecode(cJson_Cep,@hCep)
 
Try
    ? hCep['bairro']
    ? hCep['logradouro']
    ? hCep['localidade']
    ? hCep['uf']
Catch
    ? 'erro ao buscar cep'
End
 
Return
 
Static Function Emt_GetHtml(cLink)
Local oOle
Local cHtml := ""
 
Try
    oOle := CreateObject( "Microsoft.XMLHTTP" )
    oOle:Open( "GET", cLink, .f. )
    oOle:Send()
    cHtml := oOle:ResponseBody
    oOle := nil
Catch
End
 
Return cHtml
Link to comment
Share on other sites

Bom dia.

Consegui com um amigo, vou repassar a quem precisar blz, está em sql, base postgree, mas para os crânios aqui do forum isso é fichinha né rsrsrsrs.

 

https://mega.nz/file/8tRESRpB#7VGAiW-lEMpjvseGERdampYI_vX4G-dFfbPp69uAxbI



CREATE DATABASE cep
   WITH OWNER = postgres
        ENCODING = 'UTF8'
        TABLESPACE = pg_default
        LC_COLLATE = 'Portuguese_Brazil.1252'
        LC_CTYPE = 'Portuguese_Brazil.1252'
        CONNECTION LIMIT = -1;


-- Table: ceptable

-- DROP TABLE ceptable;

CREATE TABLE ceptable
(
   cep character varying NOT NULL,
   logradouro character varying,
   bairro character varying,
   cidade character varying,
   estado character varying,
   complemento character varying,
   exist_no_ws character varying, -- CEP exist no WS do correio?
   data_consulta timestamp(0) without time zone,
   nome_unidade character varying, -- NOme da Unidade/predio
   tipo_cep character varying, -- Tipo de cep, 5=Unidade(predio), 2=Rua,
1=Cidade
   CONSTRAINT ceptable_pk PRIMARY KEY (cep)
)
WITH (
   OIDS=FALSE
);
ALTER TABLE ceptable
   OWNER TO postgres;
COMMENT ON COLUMN ceptable.exist_no_ws IS 'CEP exist no WS do correio?';
COMMENT ON COLUMN ceptable.nome_unidade IS 'NOme da Unidade/predio';
COMMENT ON COLUMN ceptable.tipo_cep IS 'Tipo de cep, 5=Unidade(predio),
2=Rua, 1=Cidade';

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...