Ir para conteúdo
  • 0

DataFlows - API Inconsistente


Henrique Marsal

Pergunta

  • Alunos
Postado (editado)

Olá pessoal, bom dia. 

Estou usando o seguinte script em Power BI Data Flows. É uma API Paginada do Movidesk, usando Skip e Top com loop. Sò que as vezes estou tendo inconsistência nas atualizações. As vezes ela falha, as vezes carrega somente 2024, as vezes tento atualizar novamente e ela carrega toda a base novamente. Atualmente tenho um limite de 100 requisições por minuto e com o limite de invokeafther respeita 60 por minuto. Mesmo assim tenho esses problemas. Não fiz atualização incremental ainda, pois parece ser necessário passar alguns parâmetros direto na URL. Alguem consegue me ajudar ?

Oque eu não sei é se é alguma limitação de recursos do próprio dataflow, porque as vezes quando carrego direto no Power BI esse problema parece não acontecer. Embora eu precisa que seja no DataFlow, porqu eu referencio as tabelas e para que não haja atualizações da fonte de dados repetidas vezes, eu uso o dataflow.

 

let
    fn = (p) =>
 
    let
        url = "https://api.movidesk.com/public/v1",
        endpoint = "/tickets/past",
 
        request =
            Json.Document(
                Web.Contents(
                    url,
                    [
                        RelativePath = endpoint,
                        Query = [
                            token = "",
                            #"$select" = "id, lastupdate",
                            #"$expand"="actions($select=timeAppointments,id,description;$expand=timeAppointments($select=id,date,accountedTime,workTypeName);$filter=timeappointments/any(t: t/worktypename ne 'Normal' and t/worktypename ne 'Extra')),clients($select=organization,businessName;$expand=organization($select=businessName))",
                            #"$top" = "1000",
                            #"$skip" = Text.From(p)
                        ]
                    ]
                )
            ),
 
        resultado = if List.IsEmpty(request) then null else request,
        #"Convertido em tabela" = Table.FromList(resultado, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
    in
        #"Convertido em tabela",
 
    loop = List.Generate(
        () => [Result = try fn(0) otherwise null, Page = 0],
        each [Result] <> null,
        each [Result = try fn([Page] + 1000) otherwise null, Page = [Page] + 1000],
        each [Result]
    ),
 
    #"Convertido em tabela" = Table.FromList(loop, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    TempoEspera = #duration(0, 0, 0, 1), // 1 segundo
    NovaFonte = Function.InvokeAfter(() => #"Convertido em tabela", TempoEspera),
 
    #"Coluna Column1 expandida" = Table.ExpandTableColumn(NovaFonte, "Column1", {"Column1"}, {"Column1.1"}),
    #"Coluna Column1.1 expandida" = Table.ExpandRecordColumn(#"Coluna Column1 expandida", "Column1.1", {"id", "lastUpdate","clients", "actions"}, {"id", "lastUpdate","clients", "actions"}),
    #"Coluna clients expandida" = Table.ExpandListColumn(#"Coluna Column1.1 expandida", "clients"),
    #"Coluna clients expandida 1" = Table.ExpandRecordColumn(#"Coluna clients expandida", "clients", {"businessName", "organization"}, {"businessName", "organization"}),
    #"Coluna organization expandida" = Table.ExpandRecordColumn(#"Coluna clients expandida 1", "organization", {"businessName"}, {"businessName.1"}),
    #"Coluna actions expandida" = Table.ExpandListColumn(#"Coluna organization expandida", "actions"),
    #"Linhas filtradas 1" = Table.SelectRows(#"Coluna actions expandida", each [actions] <> null and [actions] <> ""),
    #"Coluna actions expandida 1" = Table.ExpandRecordColumn(#"Linhas filtradas 1", "actions", {"description", "id", "timeAppointments"}, {"description", "id.1", "timeAppointments"}),
    #"Coluna timeAppointments expandida" = Table.ExpandListColumn(#"Coluna actions expandida 1", "timeAppointments"),
    #"Coluna timeAppointments expandida 1" = Table.ExpandRecordColumn(#"Coluna timeAppointments expandida", "timeAppointments", {"workTypeName", "accountedTime", "date", "id"}, {"workTypeName", "accountedTime", "date", "id.2"}),
    #"Duplicatas Removidas" = Table.Distinct(#"Coluna timeAppointments expandida 1", {"id.2"}),
    #"Texto antes do delimitador extraído" = Table.TransformColumns(#"Duplicatas Removidas", {{"date", each Text.BeforeDelimiter(Text.From(_), "T", 0), type text}}),
    #"Texto antes do delimitador extraído 1" = Table.TransformColumns(#"Texto antes do delimitador extraído", {{"date", each Text.BeforeDelimiter(Text.From(_), "-", {0, RelativePosition.FromEnd}), type text}}),
    #"Tipo Alterado" = Table.TransformColumnTypes(#"Texto antes do delimitador extraído 1", {{"id", Int64.Type}, {"businessName", type text}, {"businessName.1", type text}, {"description", type text}, {"id.1", Int64.Type}, {"workTypeName", type text}, {"accountedTime", type number}, {"date", type date}, {"id.2", Int64.Type}}),
    #"Personalizado adicionado" = Table.AddColumn(#"Tipo Alterado", "Cliente", each if [businessName.1] = null then [businessName] else [businessName.1], type text),
    #"Texto cortado" = Table.TransformColumns(#"Personalizado adicionado", {{"Cliente", each Text.Trim(_), type text}}),
    #"Escolher colunas" = Table.SelectColumns(#"Texto cortado", {"id", "description", "id.1", "workTypeName", "accountedTime", "date", "Cliente"}),
    #"Colunas com nome mudado" = Table.RenameColumns(#"Escolher colunas", {{"id", "Ticket"}, {"id.1", "Ação Nº"}, {"description", "Ação_DESC"}, {"workTypeName", "Tipo de Hora"}, {"accountedTime", "Apontamento"}, {"date", "Data"}}),
    #"Texto aparado" = Table.TransformColumns(#"Colunas com nome mudado", {{"Cliente", each Text.Trim(_), type text}, {"Tipo de Hora", each Text.Trim(_), type nullable text}}),
    #"Linhas Filtradas" = Table.SelectRows(#"Texto aparado", each ([Tipo de Hora] <> null)),
    #"Linhas ordenadas" = Table.Sort(#"Linhas Filtradas", {{"Data", Order.Ascending}})
in
    #"Linhas ordenadas"
Editado por Henrique Marsal
Incrementação de informações
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
4 horas atrás, Henrique Marsal disse:

Olá pessoal, bom dia. 

Estou usando o seguinte script em Power BI Data Flows. É uma API Paginada do Movidesk, usando Skip e Top com loop. Sò que as vezes estou tendo inconsistência nas atualizações. As vezes ela falha, as vezes carrega somente 2024, as vezes tento atualizar novamente e ela carrega toda a base novamente. Atualmente tenho um limite de 100 requisições por minuto e com o limite de invokeafther respeita 60 por minuto. Mesmo assim tenho esses problemas. Não fiz atualização incremental ainda, pois parece ser necessário passar alguns parâmetros direto na URL. Alguem consegue me ajudar ?

Oque eu não sei é se é alguma limitação de recursos do próprio dataflow, porque as vezes quando carrego direto no Power BI esse problema parece não acontecer. Embora eu precisa que seja no DataFlow, porqu eu referencio as tabelas e para que não haja atualizações da fonte de dados repetidas vezes, eu uso o dataflow.

 

let
    fn = (p) =>
 
    let
        url = "https://api.movidesk.com/public/v1",
        endpoint = "/tickets/past",
 
        request =
            Json.Document(
                Web.Contents(
                    url,
                    [
                        RelativePath = endpoint,
                        Query = [
                            token = "",
                            #"$select" = "id, lastupdate",
                            #"$expand"="actions($select=timeAppointments,id,description;$expand=timeAppointments($select=id,date,accountedTime,workTypeName);$filter=timeappointments/any(t: t/worktypename ne 'Normal' and t/worktypename ne 'Extra')),clients($select=organization,businessName;$expand=organization($select=businessName))",
                            #"$top" = "1000",
                            #"$skip" = Text.From(p)
                        ]
                    ]
                )
            ),
 
        resultado = if List.IsEmpty(request) then null else request,
        #"Convertido em tabela" = Table.FromList(resultado, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
    in
        #"Convertido em tabela",
 
    loop = List.Generate(
        () => [Result = try fn(0) otherwise null, Page = 0],
        each [Result] <> null,
        each [Result = try fn([Page] + 1000) otherwise null, Page = [Page] + 1000],
        each [Result]
    ),
 
    #"Convertido em tabela" = Table.FromList(loop, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    TempoEspera = #duration(0, 0, 0, 1), // 1 segundo
    NovaFonte = Function.InvokeAfter(() => #"Convertido em tabela", TempoEspera),
 
    #"Coluna Column1 expandida" = Table.ExpandTableColumn(NovaFonte, "Column1", {"Column1"}, {"Column1.1"}),
    #"Coluna Column1.1 expandida" = Table.ExpandRecordColumn(#"Coluna Column1 expandida", "Column1.1", {"id", "lastUpdate","clients", "actions"}, {"id", "lastUpdate","clients", "actions"}),
    #"Coluna clients expandida" = Table.ExpandListColumn(#"Coluna Column1.1 expandida", "clients"),
    #"Coluna clients expandida 1" = Table.ExpandRecordColumn(#"Coluna clients expandida", "clients", {"businessName", "organization"}, {"businessName", "organization"}),
    #"Coluna organization expandida" = Table.ExpandRecordColumn(#"Coluna clients expandida 1", "organization", {"businessName"}, {"businessName.1"}),
    #"Coluna actions expandida" = Table.ExpandListColumn(#"Coluna organization expandida", "actions"),
    #"Linhas filtradas 1" = Table.SelectRows(#"Coluna actions expandida", each [actions] <> null and [actions] <> ""),
    #"Coluna actions expandida 1" = Table.ExpandRecordColumn(#"Linhas filtradas 1", "actions", {"description", "id", "timeAppointments"}, {"description", "id.1", "timeAppointments"}),
    #"Coluna timeAppointments expandida" = Table.ExpandListColumn(#"Coluna actions expandida 1", "timeAppointments"),
    #"Coluna timeAppointments expandida 1" = Table.ExpandRecordColumn(#"Coluna timeAppointments expandida", "timeAppointments", {"workTypeName", "accountedTime", "date", "id"}, {"workTypeName", "accountedTime", "date", "id.2"}),
    #"Duplicatas Removidas" = Table.Distinct(#"Coluna timeAppointments expandida 1", {"id.2"}),
    #"Texto antes do delimitador extraído" = Table.TransformColumns(#"Duplicatas Removidas", {{"date", each Text.BeforeDelimiter(Text.From(_), "T", 0), type text}}),
    #"Texto antes do delimitador extraído 1" = Table.TransformColumns(#"Texto antes do delimitador extraído", {{"date", each Text.BeforeDelimiter(Text.From(_), "-", {0, RelativePosition.FromEnd}), type text}}),
    #"Tipo Alterado" = Table.TransformColumnTypes(#"Texto antes do delimitador extraído 1", {{"id", Int64.Type}, {"businessName", type text}, {"businessName.1", type text}, {"description", type text}, {"id.1", Int64.Type}, {"workTypeName", type text}, {"accountedTime", type number}, {"date", type date}, {"id.2", Int64.Type}}),
    #"Personalizado adicionado" = Table.AddColumn(#"Tipo Alterado", "Cliente", each if [businessName.1] = null then [businessName] else [businessName.1], type text),
    #"Texto cortado" = Table.TransformColumns(#"Personalizado adicionado", {{"Cliente", each Text.Trim(_), type text}}),
    #"Escolher colunas" = Table.SelectColumns(#"Texto cortado", {"id", "description", "id.1", "workTypeName", "accountedTime", "date", "Cliente"}),
    #"Colunas com nome mudado" = Table.RenameColumns(#"Escolher colunas", {{"id", "Ticket"}, {"id.1", "Ação Nº"}, {"description", "Ação_DESC"}, {"workTypeName", "Tipo de Hora"}, {"accountedTime", "Apontamento"}, {"date", "Data"}}),
    #"Texto aparado" = Table.TransformColumns(#"Colunas com nome mudado", {{"Cliente", each Text.Trim(_), type text}, {"Tipo de Hora", each Text.Trim(_), type nullable text}}),
    #"Linhas Filtradas" = Table.SelectRows(#"Texto aparado", each ([Tipo de Hora] <> null)),
    #"Linhas ordenadas" = Table.Sort(#"Linhas Filtradas", {{"Data", Order.Ascending}})
in
    #"Linhas ordenadas"

Bom Diaaaa, poderia fornecer mais informações sobre a API?

- Existe documentação?


- Qual erro você está tendo no dataflow?

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Postado (editado)

Essa é a documentação da API

https://atendimento.movidesk.com/kb/article/256/movidesk-ticket-api

E referente ao DataFlow, não é um erro em si, são atualizações inconsistentes. Hora ele carrega dados de 2017 até 2024, horas só tem 2024, em testes com outra API do Tiny, ele tras erros em algumas consultas erro do memória ou algo assim do dataflow. Nao sei se é alguma configuração ou relacionado ao dataflow. As vezes eu trago para o power bi e não tem erro.

Editado por Henrique Marsal
Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...