betovsp Posted June 29, 2022 Report Share Posted June 29, 2022 Olá amigos, alguém tem a base de cep atualizada pra fornecer? Obrigado. Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted June 29, 2022 Report Share Posted June 29, 2022 Eu também queria, a minha é muito antiga. Quote Link to comment Share on other sites More sharing options...
marcioe Posted June 29, 2022 Report Share Posted June 29, 2022 Olá a Todos. eu uso https://viacep.com.br/ https://viacep.com.br/ws/NUMERO_SEU_CEP_SEM_TRACOS/xml Funciona bem Quote Link to comment Share on other sites More sharing options...
emotta Posted June 29, 2022 Report Share Posted June 29, 2022 22 minutos atrás, marcioe disse: Olá a Todos. eu uso https://viacep.com.br/ https://viacep.com.br/ws/NUMERO_SEU_CEP_SEM_TRACOS/xml Funciona bem sugestão, busque em formato json que é mais pratico para manipular https://viacep.com.br/ws/NUMERO_SEU_CEP_SEM_TRACOS/json Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted June 29, 2022 Report Share Posted June 29, 2022 Segue minha contribuição neste assunto * 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" Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted June 29, 2022 Report Share Posted June 29, 2022 Eu esperava um "dbfzinho" mas os caras deram logo a solução definitiva kkkk Valeu! Quote Link to comment Share on other sites More sharing options...
emotta Posted June 29, 2022 Report Share Posted June 29, 2022 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 Luiz Fernando 1 Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted June 29, 2022 Report Share Posted June 29, 2022 Realmente JSON é mais simples. Mas como eu tive alguns problemas com a função hb_jsondecode() em outro caso, fiquei preocupado e parei de usar. Quote Link to comment Share on other sites More sharing options...
betovsp Posted June 30, 2022 Author Report Share Posted June 30, 2022 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'; Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 5, 2022 Report Share Posted July 5, 2022 Eu acho a solucao do Ariston, excelente! Many thanks. Regards, saludos. Ariston Santos 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.