1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Urgente Tratar retorno Json

Discussão em 'Progress 4GL' iniciado por fnmattos, Março 31, 2017.

  1. Agnaldo

    Agnaldo Membro Ativo

    O correto seria no teu dataset ter um join de tabelas, onde esse CustomerAddress seria outra tabela.
    Depois voce junta tudo numa só.
    @rafael.andrade, voce não conhece de dataset par dar uma orientada nessa parte?
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    @Agnaldo, ainda não fiz nada relacionado, só olhando a documentação mesmo.

    Analisando o que você acabou de falar, faz muito sentido já que no progress não existe esse negócio de "Tabela dentro de Tabela"

    Vou dar uma pesquisada pra ver se consigo fazer um código fácil de compreender.

    Seria bom que o @fnmatos disponibilizasse um link para requisitar esse JSON para teste.
  3. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Consegui fazer um código demonstrativo.

    Obs.1:
    Eu tive que usar Parênteses no lugar da "chave" porque o progress entende como chamada de include, então faço o replace abaixo da atribuição da variável JSONString

    Obs.2:
    Eu não tive tempo de definir uma query para ir navegando no buffer, então eu fui excluindo a medida que foi exibindo na tela.

    Obs.3:
    O Dataset separa os objetos em 2, no caso do exemplo abaixo ele cria um buffer para "Usuarios" e outro buffer separado para "Enderecos", sendo assim perdeu o vínculo de endereço com usuário, não entendi o motivo disso, talvez o @Agnaldo possa dar uma luz.

    Código:
    DEF VAR hDSet AS HANDLE NO-UNDO.
    DEF VAR JSONString AS LONGCHAR.
    DEF VAR JSONValido AS LOGICAL.
    DEF VAR bUsuarios AS HANDLE.
    DEF VAR bEnderecos AS HANDLE.
    
    CREATE DATASET hDSet.
    
    JSONString = "('Usuarios': [" +
                 "  (" +
                 "    'id': 1," +
                 "    'nome': 'Rafael'," +
                 "    'enderecos':[" +
                 "      (" +
                 "       'id':1," +
                 "       'logradouro':'Nome da Rua'," +
                 "       'numero':560," +
                 "       'bairro':'Novo Horizonte'" +
                 "      )," +
                 "      (" +
                 "       'id':2," +
                 "       'logradouro':'Nome da Segunda Rua'," +
                 "       'numero':20," +
                 "       'bairro':'Nova Friburgo'" +
                 "      )" +
                 "     ]" +
                 "  )," +
                 "  (" +
                 "    'id': 2," +
                 "    'nome': 'Fernando'," +
                 "    'Enderecos':[" +
                 "      (" +
                 "       'id':1," +
                 "       'logradouro':'Nome da Rua'," +
                 "       'numero':560," +
                 "       'bairro':'Novo Horizonte'" +
                 "      )," +
                 "      (" +
                 "       'id':2," +
                 "       'logradouro':'Nome da Segunda Rua'," +
                 "       'numero':20," +
                 "       'bairro':'Nova Friburgo'" +
                 "      )" +
                 "     ]" +
                 "  )" +
                 "])".
    
    JSONString = REPLACE(JSONString,"(",CHR(123)).
    JSONString = REPLACE(JSONString,")",CHR(125)).
    JSONString = REPLACE(JSONString,"'","""").
    
    MESSAGE "JSON não formatado: " SKIP STRING(JSONString)
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    /*JSONValido = hDSet:READ-JSON("FILE","C:\Temp\texto.json","EMPTY").*/
    JSONValido = hDSet:READ-JSON("LONGCHAR",JSONString,"EMPTY").
    
    
    IF JSONValido THEN DO:
       bUsuarios = hDSet:GET-BUFFER-HANDLE("Usuarios").
       bUsuarios:FIND-FIRST("",NO-LOCK) NO-ERROR.
       DO WHILE bUsuarios:AVAIL.
          MESSAGE bUsuarios:BUFFER-FIELD("id"):BUFFER-VALUE SKIP
                  bUsuarios:BUFFER-FIELD("nome"):BUFFER-VALUE SKIP
                  VIEW-AS ALERT-BOX INFO BUTTONS OK.
          bEnderecos = hDSet:GET-BUFFER-HANDLE("Enderecos").
          bEnderecos:FIND-FIRST("",NO-LOCK) NO-ERROR.
          DO WHILE bEnderecos:AVAIL.
             MESSAGE bEnderecos:BUFFER-FIELD("id"):BUFFER-VALUE SKIP
                     bEnderecos:BUFFER-FIELD("logradouro"):BUFFER-VALUE SKIP
                     bEnderecos:BUFFER-FIELD("numero"):BUFFER-VALUE SKIP
                     bEnderecos:BUFFER-FIELD("bairro"):BUFFER-VALUE
                     VIEW-AS ALERT-BOX INFO BUTTONS OK.
             bEnderecos:BUFFER-DELETE.
             bEnderecos:FIND-FIRST("",NO-LOCK) NO-ERROR.
          END.
          bUsuarios:BUFFER-DELETE.
          bUsuarios:FIND-FIRST("",NO-LOCK) NO-ERROR.
       END.
    
    END.
    
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    O JSON do exemplo que mostrei anteriormente foi gerado com base no método WRITE-JSON, que grava o nome da Temp-Table no próprio JSON, não sei porque também.

    Código:
    DEFINE VARIABLE cTargetType AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cFile       AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lFormatted  AS LOGICAL   NO-UNDO.
    DEFINE VARIABLE lRetOK      AS LOGICAL   NO-UNDO.
    DEFINE TEMP-TABLE ttCust
                FIELD id AS INTEGER
                FIELD nome AS CHAR.
    
    CREATE ttCust.
    ASSIGN ttCust.id = 1
           ttCust.nome = "Rafael".
    
    CREATE ttCust.
    ASSIGN ttCust.id = 2
           ttCust.nome = "Agnaldo".
    
    ASSIGN cTargetType = "file"
           cFile       = "C:\Temp\texto.json"
           lFormatted  = TRUE.
    
     lRetOK = TEMP-TABLE ttCust:WRITE-JSON(cTargetType, cFile, lFormatted).
    
    
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    A única solução que vejo no READ-JSON é que você deveria gravar o ID do usuário no endereço também pra existir o vínculo, o que você acha @Agnaldo
  6. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Observei que existe um método chamado "ADD-RELATION" mas por causa do tempo não consegui implementar.

Compartilhe esta Página