Minha consulta está demorando ou retornando “An error has occurred”, qual o motivo?
4 min
Criado por Thiago Tamanini em 19/10/2021 16:30

Dependendo da consulta que esteja realizando, isso pode ocorrer pois está tentando buscar muitos dados ou aplicando muitos filtros de uma só vez, sobrecarregando o sistema.

Existem alguns métodos para tratar este problema.

Exemplo 1: Tenho a intenção de baixar todos os tickets da base

Esta consulta deve ser realizada em várias etapas. A API, por padrão, retorna 1000 resultados e são ordenados por id. Para realizar a paginação pode-se usar skip, mas pode ser mais performático utilizar filtro por id, sendo o id o último id retornado da consulta anterior.

Outro ponto, também não é performático buscar muitos dados de uma só vez, no $select e no $expand, caso queira buscar muitos dados, deve-se buscar em etapas e no seu software de integração, com os dados em memória fazer a junção das informações.

O campo id do ticket será retornado em todas as etapas para que possa ser usado como referência na lógica para juntar as informações.

Segue exemplo de consultas:

Primeira parte:

https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,type,subject,category,urgency,status,baseStatus,justification,origin,createdDate,originEmailAccount,ownerTeam,serviceFirstLevelId,serviceFirstLevel,serviceSecondLevel,serviceThirdLevel,resolvedIn,reopenedIn,closedIn,lastActionDate,actionCount,lastUpdate,lifeTimeWorkingTime,stoppedTime,slaAgreement,slaAgreementRule,slaSolutionTime,slaResponseTime,slaSolutionChangedByUser,slaSolutionDate,slaSolutionDateIsPaused,slaResponseDate,slaRealResponseDate&$filter=id gt 2044


Segunda parte:

https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id&$filter=id gt 2044&$expand=createdBy($select=id,personType,profileType,businessName,email,phone),clients($select=id,personType,profileType,businessName,email,phone;$expand=organization($select=id,personType,profileType,businessName,email,phone)),parentTickets($select=id,subject)


Terceira parte:

https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id&$filter=id gt 2044&$expand=actions($select=id,type,origin,description,status,justification,createdDate;$expand=createdBy($select=id),timeAppointments($select=id,activity,date,periodStart,periodEnd,workTime,workTypeName;$expand=createdBy($select=id),createdByTeam($select=id)))


Exemplo 2: Preciso de poucas informações dos últimos tickets alterados ou criados

Adicione ranges de data de criação (createdDate) ou alteração (LastUpdate) para aumentar a performance da consulta de no máximo um mês. Se precisar de um período maior, realize mais de uma consulta dividindo em períodos menores.

https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,serviceFull,type,origin,category,subject,baseStatus,urgency,createdDate,slaSolutionDate,lastActionDate,closedIn&$filter=(createdDate ge 2020-04-09T00:00:00.00z and createdDate le 2020-04-10T23:59:59.99z) or ((LastUpdate ge 2020-04-09T00:00:00.00z and LastUpdate le 2020-04-10T23:59:59.99z) and (lastActionDate ge 2020-04-09T00:00:00.00z and lastActionDate le 2020-04-10T23:59:59.99z))&$expand=clients($select=id,businessName),clients($expand=organization($select=id,businessName)),createdBy($select=id,businessName),owner($select=id,businessName)


Exemplo 3: Filtrar por campo customizado

Por se tratar de filtros mais complexos, uma otimização da busca seria dividir a consulta em mais de uma com partes do filtro original e fazer a junção dos dados em memória.

Neste exemplo, deseja-se consultar tickets que possuem um campo customizado A de valor diferente de ‘sim’ ou que possuem um apontamento de horas da atividade 'Atividade'.

Separe as consultas pelo filtro onde existe ‘and’ ou ‘or’.

  • Campo customizado A de valor diferente de ‘sim’
  • Apontamento de horas de atividade ‘Atividade’

Primeiramente, adicione um período de datas e separe as consultas desta forma:

https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,subject,status,justification,type,createdDate&$filter=(createdDate ge 2021-09-01T00:00:00.00z and createdDate le 2021-09-30T23:59:59.00z ) and (customFieldValues/any(a: a/customFieldId eq 99999 and a/items/any(b: b/customFieldItem ne 'Sim')))
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,subject,status,justification,type,createdDate&$filter=(actions/any(e: e/timeAppointments/any(f: f/activity eq 'Atividade'))))


Com os dados em memória, o resultado final são os tickets em qualquer um dos retornos. Se o filtro fosse and, a lista final seriam os tickets que estão em ambos os retornos.

Caso queira buscar mais dados sobre estes tickets já filtrados, pode consultar com base nos ids. Exemplo:

https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,subject,createdDate&$expand=actions($select=origin,id),actions($expand=timeAppointments($expand=createdBy))&$filter=((id eq 17099) or (id eq 23744) or (id eq 28447) or (id eq 34345) or (id eq 34438))
Este artigo foi útil para você?
Últimos artigos visitados