Skip to main content
Solved

Power BI --> Pipefy


luckas-stephanio

Quando tentei fazer a integração com Power BI, consegui trazer os campos para a plataforma. Porém, existe um campo que eu consigo extrair no relatório que é quando faço a conexão entre pipes e trago o ID do pipe de solicitação. Quando eu tento puxar para o Power BI, ele traz esse campo como “list”.
Gostaria de saber como consigo trazer esse campo com o número do ID desse Pipe.

Best answer by tsartori

Claro, @Bruno Costa OMB 

import requests
import json
import pandas as pd
import numpy as np
import pyodbc
import urllib.parse


#Filtro de dados sobre quais realmente precisam subir para o SQL
colunapermitida=['Título da Solicitação', 'Tipo da solicitação', 'Data de início da solicitação', 'Prioridade']

#Onde o scrip fará o request
url = "https://api.pipefy.com/graphql"

#Os parametros de autorização
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer ****",
    "Content-Type": "application/json"
}


#Qual querry o script pede
allCards = {"query": """{
  allCards(pipeId:***) { 
    edges { node { id fields { name value }done finished_at createdAt}
  } pageInfo {endCursor startCursor}}
}"""}


allCards2 = """
query($passador:String!) {
  allCards(pipeId: ****, after:$passador) { 
    edges { node { id fields { name value }done finished_at createdAt}
  } pageInfo {endCursor startCursor}}
}"""



def solicitar(querry):
    response = requests.request("POST", url, json=querry, headers=headers)
    dados = json.loads(response.text)

    return(dados)

#funcao para solicitar o proximo bloco de cards
def solicitarvar(querry, variables):
    response = requests.request("POST", url, json={'query': querry, 'variables': variables}, headers=headers)
    dados = json.loads(response.text)
    #print(response)
    return(dados)


def openquerry(objeto): #Função para formatação da tabela
    #print(objeto)
    menu = objeto['data']
    allCards=menu['allCards']
    hashes=allCards['pageInfo']
    ultimo = hashes['endCursor']
    edges=allCards['edges']
    allCardsDataDicts = [] #Abre um dicionário que servirá de base para a DF
    dcriacao = [] #Abre um dicionário para receber dados em hierarquias diferente
    dfinalizacao = []
    thisCardDataDict={}

    for i in range(len(edges)): #percorre todos os cards
        thisCardDataDict = {
        "id": edges[i]['node']['id'] #Usa o id do card como chave para o dicionário e index da tabela 
            }

        fields = edges[i]['node']['fields'] 
        for field in fields: #percorrer todos os campos dentro de cada card e armazena em um dicionário especifico 
                fieldname = field['name']
                if fieldname in colunapermitida:
                    thisCardDataDict[field['name']] = field['value'] #usa o nome do campo como nome da coluna e insere os valores com o mesmo nome de campo dentro
        datac = edges[i]['node']['createdAt']
        dataf = edges[i]['node']['finished_at']
        thisCardDataDict['dCriacao'] = datac #usa o nome do campo como nome da coluna e insere os valores com o mesmo nome de campo dentro
        thisCardDataDict['dFinalizacao'] = dataf


        #allCardsDataDicts.append()
        allCardsDataDicts.append(thisCardDataDict) #insere na base os campos já preenchidos
    return (allCardsDataDicts, ultimo) #pegar um ultimo hash como parametro da função



def datas(objeto): #Função para formatação da tabela
    #print(objeto)
    menu = objeto['data']
    allCards=menu['allCards']
    hashes=allCards['pageInfo']
    ultimo = hashes['endCursor']
    edges=allCards['edges']
    allCardsDataDicts = []
    diasc=[]
    diasf=[]

    for i in range(len(edges)): #percorre todos os cards
        thisCardDataDict = {
        "id": edges[i]['node']['id'] #Usa o id do card como chave para o dicionário e index da tabela 
            }
        datac = edges[i]['node']['createdAt']
        dataf = edges[i]['node']['finished_at']
        #datacDict['dCriacao'] = datac #usa o nome do campo como nome da coluna e insere os valores com o mesmo nome de campo dentro
        #datafDict['dFinalizacao'] = dataf
        diasc.append(datac)
        diasf.append(dataf)

    return (diasc, diasf) #pegar um ultimo hash como parametro da função


    #formatacao de tabela
dados = solicitar(allCards)
bloco = openquerry(dados)
dados = datas(dados)
dados0 = dados[0]
dados1 = dados[1]
kiwi = pd.DataFrame(dados0)
limao = pd.DataFrame(dados1)
limao = pd.concat([kiwi, limao], axis=1)
tMarketing= pd.DataFrame(bloco[0])
#listacriacao = bloco[2]
#listafinalizacao = bloco[3]
tMarketing = tMarketing.rename(columns={'Título da solicitação': 'titulo', 'Tipo da solicitação':'Tipo', 'Prazo de entrega estimado:':'prazo', 'Data de início da solicitação':'Inicio'})
tabeladef = pd.DataFrame()
tabeladef = tabeladef.append(tMarketing)

marcador = bloco[1]
#print(marcador)

variables ={
    'passador': marcador
        }
t=0
datas =[]
#laco de importacao e acomodacao na tabela
while marcador != None:
    t+= 1
    dados1 = solicitarvar(allCards2, variables)
    bloco1 = openquerry(dados1)
    marcador = bloco1[1]
    variables ={
    'passador': marcador
            }    
    if marcador == None:
        print('Processo concluido')
    else:
        tabela=pd.DataFrame(bloco1[0])
        tabela = tabela.rename(columns={'Título da solicitação': 'titulo', 'Tipo da solicitação':'Tipo', 'Prazo de entrega estimado:':'prazo', 'Data de início da solicitação':'Inicio'})
        tabela.replace([np.inf, -np.inf], np.nan, inplace = True)
        tabela = tabela.fillna(0)
        tabeladef = tabeladef.append(tabela)

 

View original
Did this topic help you find an answer to your question?

9 replies

Juliana Spinardi
Pipefy Staff
Forum|alt.badge.img+8
luckas-stephanio wrote:

Quando tentei fazer a integração com Power BI, consegui trazer os campos para a plataforma. Porém, existe um campo que eu consigo extrair no relatório que é quando faço a conexão entre pipes e trago o ID do pipe de solicitação. Quando eu tento puxar para o Power BI, ele traz esse campo como “list”.
Gostaria de saber como consigo trazer esse campo com o número do ID desse Pipe.

Olá, Luckas. Tudo bem com você? 
Não damos suporte, ainda, ao Power BI. Os conectores que os users utilizam são terceirizados então não temos como fazer um troubleshooting mesmo. 

 


tsartori
Forum|alt.badge.img+4
  • Superuser
  • 157 replies
  • August 6, 2021

Oi Lucas tudo deboa?

Eu já tive esse mesmo problema, não sei o quanto de code que tu sabe, mas fiz um script de python para fazer o request diretamente pela API, se tiver interesse podemos conversar


luckas-stephanio
tsartori wrote:

Oi Lucas tudo deboa?

Eu já tive esse mesmo problema, não sei o quanto de code que tu sabe, mas fiz um script de python para fazer o request diretamente pela API, se tiver interesse podemos conversar

Bom dia, estou disponível sim.
Por onde podemos conversar?

 


tsartori
Forum|alt.badge.img+4
  • Superuser
  • 157 replies
  • August 9, 2021

Oi @luckas-stephanio

Me manda um email para: sartoritobias14@gmail.com.

Mas na prática é uma função do python que tu pode adaptar para solicitar pelo PBI.


Bruno Costa OMB
tsartori wrote:

Oi @luckas-stephanio

Me manda um email para: sartoritobias14@gmail.com.

Mas na prática é uma função do python que tu pode adaptar para solicitar pelo PBI.

@tsartori Olá! Tudo bem?
Estou com um problema parecido com o do @luckas-stephanio e acabei caindo nesse tópico. Fiquei interessado nessa função em Python que criou. Poderíamos conversar sobre ou me disponibilizar o que criou, por gentileza? Quem sabe será a luz que estou precisando, rs Grato!
Meu e-mail: bruno.costa@ombadvocacia.com.br


tsartori
Forum|alt.badge.img+4
  • Superuser
  • 157 replies
  • October 29, 2021

Ola @Bruno Costa OMB, como posso te ajudar?


Bruno Costa OMB

@tsartori Bom dia!
Seria possível disponibilizar o script em python que desenvolveu para fazer o request pela API, por gentileza?


tsartori
Forum|alt.badge.img+4
  • Superuser
  • 157 replies
  • Answer
  • November 3, 2021

Claro, @Bruno Costa OMB 

import requests
import json
import pandas as pd
import numpy as np
import pyodbc
import urllib.parse


#Filtro de dados sobre quais realmente precisam subir para o SQL
colunapermitida=['Título da Solicitação', 'Tipo da solicitação', 'Data de início da solicitação', 'Prioridade']

#Onde o scrip fará o request
url = "https://api.pipefy.com/graphql"

#Os parametros de autorização
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer ****",
    "Content-Type": "application/json"
}


#Qual querry o script pede
allCards = {"query": """{
  allCards(pipeId:***) { 
    edges { node { id fields { name value }done finished_at createdAt}
  } pageInfo {endCursor startCursor}}
}"""}


allCards2 = """
query($passador:String!) {
  allCards(pipeId: ****, after:$passador) { 
    edges { node { id fields { name value }done finished_at createdAt}
  } pageInfo {endCursor startCursor}}
}"""



def solicitar(querry):
    response = requests.request("POST", url, json=querry, headers=headers)
    dados = json.loads(response.text)

    return(dados)

#funcao para solicitar o proximo bloco de cards
def solicitarvar(querry, variables):
    response = requests.request("POST", url, json={'query': querry, 'variables': variables}, headers=headers)
    dados = json.loads(response.text)
    #print(response)
    return(dados)


def openquerry(objeto): #Função para formatação da tabela
    #print(objeto)
    menu = objeto['data']
    allCards=menu['allCards']
    hashes=allCards['pageInfo']
    ultimo = hashes['endCursor']
    edges=allCards['edges']
    allCardsDataDicts = [] #Abre um dicionário que servirá de base para a DF
    dcriacao = [] #Abre um dicionário para receber dados em hierarquias diferente
    dfinalizacao = []
    thisCardDataDict={}

    for i in range(len(edges)): #percorre todos os cards
        thisCardDataDict = {
        "id": edges[i]['node']['id'] #Usa o id do card como chave para o dicionário e index da tabela 
            }

        fields = edges[i]['node']['fields'] 
        for field in fields: #percorrer todos os campos dentro de cada card e armazena em um dicionário especifico 
                fieldname = field['name']
                if fieldname in colunapermitida:
                    thisCardDataDict[field['name']] = field['value'] #usa o nome do campo como nome da coluna e insere os valores com o mesmo nome de campo dentro
        datac = edges[i]['node']['createdAt']
        dataf = edges[i]['node']['finished_at']
        thisCardDataDict['dCriacao'] = datac #usa o nome do campo como nome da coluna e insere os valores com o mesmo nome de campo dentro
        thisCardDataDict['dFinalizacao'] = dataf


        #allCardsDataDicts.append()
        allCardsDataDicts.append(thisCardDataDict) #insere na base os campos já preenchidos
    return (allCardsDataDicts, ultimo) #pegar um ultimo hash como parametro da função



def datas(objeto): #Função para formatação da tabela
    #print(objeto)
    menu = objeto['data']
    allCards=menu['allCards']
    hashes=allCards['pageInfo']
    ultimo = hashes['endCursor']
    edges=allCards['edges']
    allCardsDataDicts = []
    diasc=[]
    diasf=[]

    for i in range(len(edges)): #percorre todos os cards
        thisCardDataDict = {
        "id": edges[i]['node']['id'] #Usa o id do card como chave para o dicionário e index da tabela 
            }
        datac = edges[i]['node']['createdAt']
        dataf = edges[i]['node']['finished_at']
        #datacDict['dCriacao'] = datac #usa o nome do campo como nome da coluna e insere os valores com o mesmo nome de campo dentro
        #datafDict['dFinalizacao'] = dataf
        diasc.append(datac)
        diasf.append(dataf)

    return (diasc, diasf) #pegar um ultimo hash como parametro da função


    #formatacao de tabela
dados = solicitar(allCards)
bloco = openquerry(dados)
dados = datas(dados)
dados0 = dados[0]
dados1 = dados[1]
kiwi = pd.DataFrame(dados0)
limao = pd.DataFrame(dados1)
limao = pd.concat([kiwi, limao], axis=1)
tMarketing= pd.DataFrame(bloco[0])
#listacriacao = bloco[2]
#listafinalizacao = bloco[3]
tMarketing = tMarketing.rename(columns={'Título da solicitação': 'titulo', 'Tipo da solicitação':'Tipo', 'Prazo de entrega estimado:':'prazo', 'Data de início da solicitação':'Inicio'})
tabeladef = pd.DataFrame()
tabeladef = tabeladef.append(tMarketing)

marcador = bloco[1]
#print(marcador)

variables ={
    'passador': marcador
        }
t=0
datas =[]
#laco de importacao e acomodacao na tabela
while marcador != None:
    t+= 1
    dados1 = solicitarvar(allCards2, variables)
    bloco1 = openquerry(dados1)
    marcador = bloco1[1]
    variables ={
    'passador': marcador
            }    
    if marcador == None:
        print('Processo concluido')
    else:
        tabela=pd.DataFrame(bloco1[0])
        tabela = tabela.rename(columns={'Título da solicitação': 'titulo', 'Tipo da solicitação':'Tipo', 'Prazo de entrega estimado:':'prazo', 'Data de início da solicitação':'Inicio'})
        tabela.replace([np.inf, -np.inf], np.nan, inplace = True)
        tabela = tabela.fillna(0)
        tabeladef = tabeladef.append(tabela)

 


Bruno Costa OMB

@tsartori Agradeço demais! Vou alinhar minha necessidade com base na sua solução. Estou com problemas com o conector que a equipe do Pipefy me disponibilizou na implantação e acredito que seu script irá me ajudar.
Abraço!


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings