Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Bug] Devolver Tabela de Registros

Boa noite, pessoal, estou com uma consulta no Power Query utilizando linguagem m. Bom segue o código para replicar:

let
    GetEventsPartition = (ultCodigo as number) => {
        let 
            url = "https://tjgrm.begcloud.com/ws_rest/public/api/eventos?UltCodigo="&Text.From(ultCodigo),
            headers = [#"Content-Type"="application/json", 
                       #"Authorization"="Basic V1NUSjpXUzQ1OFdT",
                       #"X-APP-TRAFEUGS"="9"],
            response = Json.Document(Web.Contents(url, [Headers=headers]))
        in
            response   
    },

    GetEventLastId = (Events as list) => {
         let
           LatestEvent = List.Last(Events, -1),
           EventId = if LatestEvent = -1 then LatestEvent else LatestEvent[id_evento]
        in
           EventId
    },

    GetAllEvents = (utlCod as number, eventList as list) => {
        let
            events = GetEventsPartition(utlCod){0}[eventos],
            eventId = GetEventLastId(events){0},
            eventsAll = if List.IsEmpty(eventList) then events else eventList & List.Skip(events, 1),
            eventsTable = Table.RemoveColumns(Table.FromRecords(eventsAll), {"descricao", "data_cadastro", "latitude",	"longitude",
            "esis_usuario_adicionou", "pess_nome_adicionou", "pess_oras_codigo_adicionou", "pess_oras_codigo_leitura",
            "usua_login_leitura", "pess_nome_leitura", "pess_oras_codigo_supervisao", "usua_login_supervisao", "pess_nome_supervisao"})
        in
            if eventId = -1 then
                eventsTable
            else
                @GetAllEvents(eventId, eventsAll)
    }
in
    GetAllEvents(1, {})

O mesmo irá retornar uma lista de listas, porém gostaria de já retornar uma tabela com todos os dados. Da forma como está hoje tenho que ir navegando e isso não legal pois no futuro pode aumentar o número de registro devolvidos fazendo com que a navegação aumente, é possivel melhorar? Para já devolver algo dessa forma Insira aqui a descrição dessa imagem para ajudar na acessibilidadee não dessa: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

Olá Rafael, tudo bem com você?

Para garantir que o método GetAllEvents retorne uma tabela, você pode usar a função Table.FromRecords e Table.ExpandTableColumn. Fiz algumas alterações no seu código para atingir o objetivo de expansão e deixo a seguir o código e o resultado:

Código:

let
  TabelaResultado = 
    let
      GetEventsPartition = (ultCodigo as number) => {
        let
          url = "https://tjgrm.begcloud.com/ws_rest/public/api/eventos?UltCodigo="
            & Text.From(ultCodigo), 
          headers = [
            #"Content-Type"   = "application/json", 
            #"Authorization"  = "Basic V1NUSjpXUzQ1OFdT", 
            #"X-APP-TRAFEUGS" = "9"
          ], 
          response = Json.Document(Web.Contents(url, [Headers = headers]))
        in
          response
      }, 
      GetAllEvents = (utlCod as number, eventList as list) => {
        let
          events = GetEventsPartition(utlCod){0}[eventos], 
          eventId = if List.IsEmpty(eventList) then - 1 else List.Last(eventList)[id_evento], 
          eventsAll = if List.IsEmpty(eventList) then events else List.Combine({eventList, events}), 
          expandedTable = 
            if List.IsEmpty(eventList) then
              Table.FromRecords(eventsAll)
            else
              Table.ExpandTableColumn(eventList{0}, "eventos", {"id_evento", "outras_colunas"})
        in
          if eventId = - 1 then expandedTable else @GetAllEvents(utlCod, eventsAll)
      }
    in
      GetAllEvents(1, {})
in
  TabelaResultado{0}

Resultado:

Gif que mostra a expansão da tabela automaticamente usando a linguagem M dentro do Power BI

Lembre-se de adaptar para o seu contexto.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Fala Rafa boa noite, Cara gostaria de agradeçer muito por ter me dado essa força, Aparetemente funciona perfeitamente porem a recursividade não está retornando todos os dados. Acredito que o problema esta na verificação inicial:

 expandedTable = 
            if List.IsEmpty(eventList) then
              Table.FromRecords(eventsAll)
            else
              Table.ExpandTableColumn(eventList{0}, "eventos", {"id_evento", "outras_colunas"})

Pois a primeira vez sempre será vazia a lista, porem não estou conseguindo avançar se eu remover a verificação.

solução!

Bom Rafa, so para compartilhar acabei quebrando a cabeça e preferi seguir por uma solução diferente, refiz tudo e fiz sem ser por funções separadas mas sim uma função unica e fazer tudo ali dentro. Bom o resultado foi esse e agora está 100%.

(optional ultCod as number, optional eventList as list) =>

    let
        ultCode = if ultCod = null
        then 1
        else ultCod,
        
        url = "https://tjgrm.begcloud.com/ws_rest/public/api/eventos?UltCodigo=" & Text.From(ultCode), 

        headers = [
            #"Content-Type"   = "application/json", 
            #"Authorization"  = "Basic V1NUSjpXUzQ1OFdT", 
            #"X-APP-TRAFEUGS" = "9"], 
        
        response = Json.Document(Web.Contents(url, [Headers = headers]))[eventos],

        lastId = if List.IsEmpty(response)
        then -1
        else List.Last(response)[id_evento],

        events = if eventList = null
        then response 
        else List.Combine({eventList, response}),

        out = if lastId = -1 
        then Table.FromRecords(events)
        else @fRecursiveEvents(lastId, events)
in 
   out

Agradeço de mais sua ajuda. E se tiver alguma sugestão de melhoria, agradeço. Grande abraço.

Rafael, obrigado por compartilhar sua solução, vi que você usou algumas dicas que te passei na mensagem anterior. Essa troca de conhecimento é muito importante para mostrar outras perspectivas. Fico feliz por ter te ajudado pelo menos 1% hehehe

Grande Abraço, Xará!