Jump to content
Fivewin Brasil

Buscar dados de Array Multidimensional (Resolvido)


betovsp

Recommended Posts

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?


 

Link to comment
Share on other sites

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,[":],[",])

 

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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)
***************************************************************************

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...