betovsp Posted May 6, 2020 Report Share Posted May 6, 2020 Boa tarde pessoal. Imaginem um arquivo txt contendo o seguinte: [{"empresa":{"documento":"23154532","codEstabelecimento":25,"tipoEstabelecimento":"Supermercados","descricao":"SupermercadoTeste"},"pagamento":{"vFrete":5.5,"vTroco":0,"vProds":44.55,"vPago":50.05,"cupom":"","cupomDescontoPorcentagem":0,"cupomDescontoReal":0,"cupomFreteGratis":false,"descPag":"DEBITO"},"status":[{"descricao":"Aprovado","dataHoraInsert":"2020-24-04T19:19:07"},{"descricao":"Separação","dataHoraInsert":"2020-02-05T19:55:37"}],"cliente":{"nomeUsuario":"XXXXX","documento":"","bairro":"Tropical","cep":"99999999","rua":"XXXXXXXXXX","complemento":"","numero":"999","cidade":"XXX","estado":"XX","pais":"BRA","pontoReferencia":"","email":"xxx@xxx.x.x","telefone":"(99)999999999"},"produtos":[{"codigo":"7898915457469","vTotal":4.99,"vUn":4.99,"qtde":1},{"codigo":"7898930469027","vTotal":5.99,"vUn":5.99,"qtde":1},{"codigo":"7898930469553","vTotal":5.69,"vUn":5.69,"qtde":1},{"codigo":"7898931019245","vTotal":18.9,"vUn":18.9,"qtde":1},{"codigo":"7898939399172","vTotal":2.99,"vUn":2.99,"qtde":1},{"codigo":"7898999850453","vTotal":5.99,"vUn":5.99,"qtde":1}],"codigoTransacao":"NO-CD118980196-24-04-2020","token":"dHNhwcl51ds:APA91bE86A6_7Kd4zB-ZVyK9dMcOfSE7bktfnKReK8KpkNYRMhQOvcl_LMLgmjaGV8KRQKhlSlZ8ZBuX7JEw7j8HQz2oL_kO_qHP9EWuaxrTIE4IITlUYttNdKwxLX4Dt_jKIA28gONA","userUid":"W8mH1VqhrQbo7b7fld87Hi69dko2","dataHoraInsert":"2020-24-04T19:19:07","dataPrevistaEntrega":"2020-24-04T19:58:07"},{"empresa":{"documento":"23154532","codEstabelecimento":25,"tipoEstabelecimento":"Supermercados","descricao":"SupermercadoTeste"},"pagamento":{"vFrete":5.5,"vTroco":0,"vProds":77.53,"vPago":83.03,"cupom":"","cupomDescontoPorcentagem":0,"cupomDescontoReal":0,"cupomFreteGratis":false,"descPag":"DEBITO"},"status":[{"descricao":"Aprovado","dataHoraInsert":"2020-24-04T19:16:26"},{"descricao":"Separação","dataHoraInsert":"2020-23-04T22:33:05"}],"cliente":{"nomeUsuario":"xxxxxxx","documento":"","bairro":"Tropical","cep":"999999999","rua":"xxxxxx","complemento":"","numero":"99","cidade":"xxxxxx","estado":"xx","pais":"BRA","pontoReferencia":"perto do posto","email":"xxxxxxx","telefone":"(99)999999999"},"produtos":[{"codigo":"7896679226840","vTotal":30.76,"vUn":7.69,"qtde":4},{"codigo":"7898943452238","vTotal":6.49,"vUn":6.49,"qtde":1},{"codigo":"7898947389967","vTotal":4.49,"vUn":4.49,"qtde":1},{"codigo":"7898947389998","vTotal":4.99,"vUn":4.99,"qtde":1},{"codigo":"7898948468012","vTotal":11.9,"vUn":11.9,"qtde":1},{"codigo":"7898955272893","vTotal":18.9,"vUn":18.9,"qtde":1}],"codigoTransacao":"NO-CD26270723-24-04-2020","token":"dHNhwcl51ds:APA91bE86A6_7Kd4zB-ZVyK9dMcOfSE7bktfnKReK8KpkNYRMhQOvcl_LMLgmjaGV8KRQKhlSlZ8ZBuX7JEw7j8HQz2oL_kO_qHP9EWuaxrTIE4IITlUYttNdKwxLX4Dt_jKIA28gONA","userUid":"W8mH1VqhrQbo7b7fld87Hi69dko2","dataHoraInsert":"2020-24-04T19:16:26","dataPrevistaEntrega":"2020-24-04T19:55:26"},{"empresa":{"documento":"23154532","codEstabelecimento":25,"tipoEstabelecimento":"Supermercados","descricao":"SupermercadoTeste"},"pagamento":{"vFrete":5.5,"vTroco":0,"vProds":13.26,"vPago":18.76,"cupom":"","cupomDescontoPorcentagem":0,"cupomDescontoReal":0,"cupomFreteGratis":false,"descPag":"CREDITO"},"status":[{"descricao":"Aprovado","dataHoraInsert":"2020-24-04T19:14:29"},{"descricao":"Separação","dataHoraInsert":"2020-23-04T22:32:41"},{"descricao":"Transporte","dataHoraInsert":"2020-23-04T22:32:55"}],"cliente":{"nomeUsuario":"xxxxxx","documento":"","bairro":"Tropical","cep":"99999999","rua":"xxxxx","complemento":"","numero":"999","cidade":"xxxx","estado":"xx","pais":"BRA","pontoReferencia":"","email":"xxxxxxx","telefone":"(99)99999999"},"produtos":[{"codigo":"78936478","vTotal":0.99,"vUn":0.99,"qtde":1},{"codigo":"7898904771767","vTotal":4.5,"vUn":4.5,"qtde":1},{"codigo":"7898915451306","vTotal":7.77,"vUn":2.59,"qtde":3}],"codigoTransacao":"NO-CRED35157811-24-04-2020","token":"dHNhwcl51ds:APA91bE86A6_7Kd4zB-ZVyK9dMcOfSE7bktfnKReK8KpkNYRMhQOvcl_LMLgmjaGV8KRQKhlSlZ8ZBuX7JEw7j8HQz2oL_kO_qHP9EWuaxrTIE4IITlUYttNdKwxLX4Dt_jKIA28gONA","userUid":"W8mH1VqhrQbo7b7fld87Hi69dko2","dataHoraInsert":"2020-24-04T19:14:29","dataPrevistaEntrega":"2020-24-04T19:53:29" Isso é um retorno em json, Uso dessa forma: aRetorno:= hb_hash() hb_jsondecode( cRetorno, @aRetorno ) usando a xbrowse(aRetorno) me mostra tudo certo o array multidimensional, mas preciso pegar as variáveis e não estou conseguindo. Alguém já passou por isso e pode me ajudar? Quote Link to comment Share on other sites More sharing options...
vagner Posted May 7, 2020 Report Share Posted May 7, 2020 Beto, blz ? Seguinte , vc teria que pegar por partes do texto, no caso, primeiramente teria que trocar alguns caracteres, como por exemplo do ,{"codigo":"7898943452238","vTotal":6.49,"vUn":6.49,"qtde":1} onde ": teria que mudar para ",, para não lhe dar problema na conversão e depois pegar o que lhe interessa, como : codigo, vtotal etc Abraços PS: A troca pode ser feita através do StrTran(cTexto,Antigo,Novo) Ex.: cTexto := StrTran(cTexto,[":],[",]) Quote Link to comment Share on other sites More sharing options...
betovsp Posted May 7, 2020 Author Report Share Posted May 7, 2020 Oi Vagner, tudo bem e como você está? Então, vi aqui no forum, no forum do Rochinha, no internacional uma função que poderia resolver esse problema, mas em testes feito com dois servidores diferentes, um retorna o erro (justamente esse que estou precisando) e o outro não dá erro mas não retorna nada na função que é essa: STATIC FUNCTION PesquisaHash( hTable, cTexto ) LOCAL oElement, xValue := "" IF HHasKey( hTable, cTexto ) RETURN hTable[ cTexto ] ENDIF FOR EACH oElement IN hTable IF ValType( oElement ) == "H" xValue := PesquisaHash( oElement, cTexto ) IF ! Empty( xValue ) EXIT ENDIF ENDIF NEXT RETURN xValue Esse é o erro: Path and name: E:\PONTOB32\Source\Infotech\NOVOSCRIPT.EXE (32 bits) Size: 2,118,144 bytes Time from start: 0 hours 0 mins 8 secs Error occurred at: 07/05/2020, 11:02:52 Error description: Error BASE/1123 Argument error: HHASKEY Args: [ 1] = A { ... } [ 2] = C email Você que é o fera, conhece essa função? Obrigado. Quote Link to comment Share on other sites More sharing options...
vagner Posted May 7, 2020 Report Share Posted May 7, 2020 Olá Beto, pelo que sei o Hash é um array dimensional, e não multi-dimensional, não sei se serviria para você nesse caso Abraços Quote Link to comment Share on other sites More sharing options...
betovsp Posted May 7, 2020 Author Report Share Posted May 7, 2020 Então, o Rochinha me passou esse exemplo: cRet := '{"result":[{"1":[{"placa":"ABC1234"},{"datahora":"25\/10\/2016 16:09:35"},{"latitude":"-23.5763034820557"},{"longitude":"-46.8151245117188"},{"velocidade":"0"},{"pos_chave":"0"},{"bloqueio":"0"},{"endereco":"Estrada das Rosas, 1234 OSASCO - SP"}],"2":[{"placa":"ABC1234"},{"datahora":"25\/10\/2016 17:25:45"},{"latitude":"-23.5766792297363"},{"longitude":"-46.8154640197754"},{"velocidade":"0"},{"pos_chave":"0"},{"bloqueio":"0"},{"endereco":"Rua A, 0 OSASCO - SP"}] }]}' hb_JsonDecode( cRet, @hRet ) If Len(hRet) != 0 If HHasKey( hRet, "result" ) For nPos=1 To Len( hRet["result",1] ) cReg := Alltrim(Str(nPos)) If !Empty(hRet['result',1][cReg,3]['latitude']) .And.; !Empty(hRet['result',1][cReg,4]['longitude']) AADD(aARQ,{hRet['result',1][cReg,6]['pos_chave'] ,; // 01 - ignicao hRet['result',1][cReg,5]['velocidade'] ,; // 02 - velocidade hRet['result',1][cReg,3]['latitude'] ,; // 03 - latitude hRet['result',1][cReg,4]['longitude'] ,; // 04 - longitude hRet['result',1][cReg,1]['placa'] ,; // 05 - placa Substr(hRet['result',1][cReg,2]['datahora'],1,10),; // 06 - Data Transmissão Substr(hRet['result',1][cReg,2]['datahora'],12,5)+':00',; // 07 - Hora Transmissão hRet['result',1][cReg,8]['endereco'],; // 08 - Endereco de Leitura .F. } ) // 09 - lido Endif Next Else ALERT('ERRO - RASTREADOR : '+hb_UTF8ToStr(hRet['Message'])) RETURN(.F.) Endif Else ALERT('ERRO - RASTREADOR : Erro no Envio da Chave Return(.F.) EndIf RETURN(.T.) Mas dá o erro justamente no HHasKey, aquele erro que passei anteriormente Quote Link to comment Share on other sites More sharing options...
betovsp Posted May 7, 2020 Author Report Share Posted May 7, 2020 Pessoal Fiz assim, meio arcaico, mas meio resolvido por enquanto: cRetorno := MemoRead( "VENCURL.OUT" ) aRetorno:= hb_hash() hb_jsondecode( cRetorno, @aRetorno ) nLen:= len(aRetorno) FOR i:=1 TO nLen //? aRetorno["status"][1]["descricao"], aRetorno["status"][1]["dataHoraInsert"] //? aRetorno["cliente"]["nomeUsuario"] // Dados do Cliente cNom := ALLTRIM(aRetorno["cliente"]["nomeUsuario"]) cDoc := ALLTRIM(aRetorno["cliente"]["documento"]) cBai := ALLTRIM(aRetorno["cliente"]["bairro"]) cCep := ALLTRIM(aRetorno["cliente"]["cep"]) cRua := ALLTRIM(aRetorno["cliente"]["rua"]) cCom := ALLTRIM(aRetorno["cliente"]["complemento"]) cNum := ALLTRIM(aRetorno["cliente"]["numero"]) cCid := ALLTRIM(aRetorno["cliente"]["cidade"]) cEst := ALLTRIM(aRetorno["cliente"]["estado"]) cPais := ALLTRIM(aRetorno["cliente"]["pais"]) cRef := ALLTRIM(aRetorno["cliente"]["pontoReferencia"]) cEma := ALLTRIM(aRetorno["cliente"]["email"]) cTel := ALLTRIM(aRetorno["cliente"]["telefone"]) // Dados do Produtos nLenPro := len(aRetorno["produtos"]) FOR j:=1 TO nLenPro cCodPro := ALLTRIM(aRetorno["produtos"][j]["codigo"]) nQtdPro := aRetorno["produtos"][j]["qtde"] nVunPro := aRetorno["produtos"][j]["vUn"] nVtoPro := aRetorno["produtos"][j]["vTotal"] NEXT // Dados do Pagamento vFrePag := aRetorno["pagamento"]["vFrete"] vTroPag := aRetorno["pagamento"]["vTroco"] vProPag := aRetorno["pagamento"]["vProds"] vPagPag := aRetorno["pagamento"]["vPago"] vCupPag := ALLTRIM(aRetorno["pagamento"]["cupom"]) vCupPPag := aRetorno["pagamento"]["cupomDescontoPorcentagem"] vCupRPag := aRetorno["pagamento"]["cupomDescontoReal"] vCupFPag := aRetorno["pagamento"]["cupomFreteGratis"] vDesPag := ALLTRIM(aRetorno["pagamento"]["descPag"]) NEXT ***** mas não consigo achar e pegar na matriz a "dataPrevistaEntrega", se alguém tiver uma idéia a partir dessa minha solução vai ser de grande ajuda. Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted May 15, 2020 Report Share Posted May 15, 2020 Eu fiz essa função ha alguns anos: aMEUARRAY := {} nNUMERO := STRZERO(NUMERO08,2) nPOSI := mASCAN(aMEUARRAY, nNUMERO) IF nPOSI > 0 aMEUARRAY[nPOSI,2] += 1 ELSE AADD(aMEUARRAY,{nNUMERO,1}) ENDIF FUNCTION MAscan(aARRAY,WSEARCH,nCOLARRAY) DEFAULT nCOLARRAY := 1 FOR _i = 1 TO LEN(aARRAY) IF aARRAY[_i,nCOLARRAY] == WSEARCH RETURN(_i) ENDIF NEXT RETURN(0) *************************************************************************** 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.