Ir para conteúdo

Alex Pereira

Alunos
  • Total de itens

    573
  • Registro em

  • Última visita

Posts postados por Alex Pereira

  1. 14 minutos atrás, Edson Igari disse:

    Sem wi-fi só se vc comprar um multiplicador de telas. Ai vc abre quatro navegadores e joga um em cada tela.

     

    Multiplicador De Tela Hdmi 4 Portas Splitter Tv Monitor Hd | Parcelamento sem juros (mercadolivre.com.br)

    @Edson Igarisó não sei se o multiplicador de telas resolveria o problema dela que parece que o multiplicador de tela ele duplica a tela, ai teria ver se é possivel o multiplicador tela consegue colocar uma tela para cada tv. Eu sugeri o usb porque parece que nele você consegue fazer essa configuração!

  2. Cleiton, nesse caso, você precisará combinar a coluna "cidade" com a coluna "data" para identificar se houve feriado específico na cidade da unidade de produção. Você pode criar ou utilizar uma tabela que contenha os feriados municipais de cada cidade. Assim, ao verificar a data de produção e a cidade, se ambas coincidirem com um feriado na tabela, você poderá marcar esse dia como feriado para a unidade localizada naquela cidade. Isso garante que cada unidade considere apenas os feriados que afetam sua própria produção.

    obs.: Os dados em ambas tabelas tem que ser iguais!

    Exemplo:

    image.png.c53d190dc6160874df3d5aae5ac31965.png

  3. 37 minutos atrás, Lucas Denker disse:

    Boa tarde pessoal! Todos bem?
    Venho com uma dúvida técnica sobre visualização de dados. Irei lhe passar o contexto do que tenho.

    Contexto.:
    Em meu relatório possuo uma página principal que contém filtros de ano, cliente e estado. 
    Ao clicar em um cliente abre a possibilidade de ir a uma página que faz o drill-trought dos dados. Nesta página possuo um gráfico mensal da quantidade de compras feita pelo cliente filtrado.

    Problema.:
    Meu problema é eu gostaria que em apenas nesse gráfico que tenho o filtro de ano e somente este filtro da página principal não afete este gráfico em específico.
    Como faço para retirar especificamente deste gráfico o filtro do ano da página principal?
    Pesquisei diversas alternativas e nenhuma funcionou.

    Se alguem tiver passado por algo parecido ou sabe como resolver esta situação me ajude por favor!

    Abraços e obrigado pela atenção.

    Você pode resolver isso diretamente nas suas medidas utilizando a função ALL ou REMOVEFILTERS no DAX para ignorar o filtro de ano apenas para aquele visual específico. Assim, o filtro de ano não será aplicado ao gráfico.

    EX:

     

    Medida Sem Filtro de Ano =
    CALCULATE(
        [Sua Medida Original],
        ALL(Tabela[ColunaAno])
    )


    Dessa forma, o filtro de ano que vem da página principal não afetará o gráfico onde essa medida for utilizada, mas continuará funcionando normalmente para os outros visuais da página.
     

  4. 17 horas atrás, Henrique Marsal disse:

    Peguei a aula e tentei adaptar o script que faz a atualização incremental dos dados no mysyql na API Movidesk no tipo oData. mas o script não lida com a alternativa de inserir novas colunas . eu preciso dar um drop no banco e reinserir os dados outra vez. Preciso de algum help para me ajudar o script a lidar com a opção de ao inserir novas colunas ele fazer att full da coluna nova e depois incremental normal. 

    Já tentei umas 200x com GPT mas na hora de rodar o script ele travava.

     

    import requests
    import pandas as pd
    from dotenv import load_dotenv
    import os
    import time
    from sqlalchemy import (
        create_engine,
        MetaData,
        Table,
        Column,
        Integer,
        String,
        DECIMAL,
        DATETIME,
        inspect,
        text,
    )
    from sqlalchemy.exc import IntegrityError
    from datetime import datetime, timedelta
     
    # Carrega as variáveis de ambiente do arquivo .env
    load_dotenv()
     
    # Define a URL base da API Movidesk
     
    # Pega o token do arquivo .env
    token = os.getenv("API_TOKEN")
     
    # Função para chamar a API Movidesk e obter os dados paginados
    def chamar_api_movidesk(token, params=None😞
        lista_dados_todas_paginas = []
        skip = 0  # Controle de paginação, começa com 0
        top = 1000  # Número máximo de resultados por página
     
        # Configura parâmetros fixos
        if params is None:
            params = {}
     
        # Inclui o token e a paginação nos parâmetros
        params.update({"token": token, "$top": top, "$skip": skip})
     
        while True:
            response = requests.get(base_url, params=params)
            response_ajustado_json = response.json()
     
            # Verifica se a resposta contém dados
            if isinstance(response_ajustado_json, list) and response_ajustado_json:
                lista_dados_todas_paginas.extend(response_ajustado_json)
            else:
                # Se a resposta for uma lista vazia, significa que não há mais páginas
                break
     
            # Atualiza o valor de skip para pegar a próxima página
            skip += top
            params["$skip"] = skip
            time.sleep(1)  # Respeita o limite de requisições da API
     
        return lista_dados_todas_paginas
     
    # Função para obter todos os tickets sem filtro
    def chamar_api_inicial_completa():
        # Definindo campos de interesse
        params = {"$select": "id,createdDate,lastUpdate,type,category,urgency,status,ownerTeam,serviceFull,resolvedIn,slaSolutionDate,slaRealResponseDate,slaResponseDate"}
        lista_dados_todas_paginas = chamar_api_movidesk(token, params)
        df = pd.DataFrame(lista_dados_todas_paginas)
        return df
     
    # Função para filtrar tickets criados nos últimos dois dias
    def atualizar_dados_ultimos_dois_dias():
        dois_dias_atras = (datetime.now() - timedelta(days=2)).strftime(
            "%Y-%m-%dT%H:%M:%SZ"
        )
        # Definindo parâmetros com filtro de data
        params = {
            "$select": "id,createdDate,lastUpdate",
            "$filter": f"createdDate ge {dois_dias_atras}",
        }
        lista_dados_todas_paginas = chamar_api_movidesk(token, params)
        df = pd.DataFrame(lista_dados_todas_paginas)
        return df
     
    # Converta as colunas de data para o formato aceito pelo MySQL
    data_columns = ["createdDate", "lastUpdate"]
     
    # Conexão com o banco de dados MySQL - PUXANDO OS DADOS DO ARQUIVO .env
    db_user = os.getenv("DB_USER")  # Nome do usuário no MySQL
    db_password = os.getenv("DB_PASSWORD")  # Senha do MySQL
    db_host = os.getenv("DB_HOST")  # Host do banco de dados
    db_name = os.getenv("DB_NAME")  # Nome do banco de dados
     
    # String de conexão com o banco de dados, passando as variáveis do .env
    engine = create_engine(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")
     
    # Instanciando o objeto MetaData para criar a tabela no banco de dados
    metadata = MetaData()
     
    # Crie a tabela com todas as colunas necessárias e defina a chave primária
    tickets_table = Table(
        "tickets",
        metadata,
        Column("id", String(255), primary_key=True),
        Column("createdDate", DATETIME),
        Column("lastUpdate", DATETIME),
    )
     
    # Verifica se a tabela já existe no banco de dados
    inspector = inspect(engine)
    if "tickets" in inspector.get_table_names():
        with engine.connect() as connection:
            result = connection.execute(text("SELECT COUNT(*) FROM tickets"))
            count = result.fetchone()[0]
            if count > 0:
                # Se a tabela tiver dados, atualiza os últimos dois dias
                df_incremental = atualizar_dados_ultimos_dois_dias()
                if df_incremental.empty:
                    print("Não há dados para atualizar.")
                else:
                    # Converte as colunas de data para o formato correto
                    for col in data_columns:
                        if col in df_incremental.columns:
                            df_incremental[col] = pd.to_datetime(
                                df_incremental[col]
                            ).dt.strftime("%Y-%m-%d %H:%M:%S")
     
                    inseridos_com_sucesso = 0
                    for index, row in df_incremental.iterrows():
                        try:
                            row.to_frame().T.to_sql(
                                "tickets", con=engine, if_exists="append", index=False
                            )
                            inseridos_com_sucesso += 1
                        except IntegrityError:
                            continue  # Ignora duplicações
     
                    print(
                        f"Total de registros inseridos com sucesso: {inseridos_com_sucesso}"
                    )
            else:
                print("Tabela existente mas sem dados, realizando carga inicial completa.")
                df_inicial = chamar_api_inicial_completa()
    else:
        print("Tabela não existe, criando tabela e realizando carga inicial completa.")
        metadata.create_all(engine)  # Cria a tabela
        df_inicial = chamar_api_inicial_completa()
     
    # Verifica se df_inicial foi criado e insere dados no banco
    if "df_inicial" in locals():
        for col in data_columns:
            if col in df_inicial.columns:
                df_inicial[col] = pd.to_datetime(df_inicial[col]).dt.strftime(
                    "%Y-%m-%d %H:%M:%S"
                )
     
        inseridos_com_sucesso = 0
        for index, row in df_inicial.iterrows():
            try:
                row.to_frame().T.to_sql(
                    "tickets", con=engine, if_exists="append", index=False
                )
                inseridos_com_sucesso += 1
            except IntegrityError:
                continue  # Ignora duplicações
     
        print(f"Total de registros inseridos com sucesso: {inseridos_com_sucesso}")

    Para resolver o problema de lidar com a inserção de novas colunas sem precisar fazer um drop na tabela, você pode seguir uma abordagem onde o script verifica quais colunas existem no banco de dados e compara com as colunas da API. Se houver novas colunas, ele faz uma atualização full para essas colunas e continua com o processo incremental. Além disso, caso alguma coluna não venha mais da API, o script emite um alerta.

    Exemplo sugirido pelo nosso amigo GPT:
     

    import requests
    import pandas as pd
    from dotenv import load_dotenv
    import os
    import time
    from sqlalchemy import create_engine, inspect, text
    from sqlalchemy.exc import IntegrityError
    from datetime import datetime, timedelta
    
    # Carrega as variáveis de ambiente do arquivo .env
    load_dotenv()
    
    # Define a URL base da API Movidesk
    base_url = "https://api.movidesk.com/public/v1/tickets/past"
    token = os.getenv("API_TOKEN")
    
    # Função para chamar a API Movidesk e obter os dados paginados
    def chamar_api_movidesk(token, params=None):
        lista_dados_todas_paginas = []
        skip = 0  
        top = 1000  
    
        if params is None:
            params = {}
    
        params.update({"token": token, "$top": top, "$skip": skip})
    
        while True:
            response = requests.get(base_url, params=params)
            response_ajustado_json = response.json()
    
            if isinstance(response_ajustado_json, list) and response_ajustado_json:
                lista_dados_todas_paginas.extend(response_ajustado_json)
            else:
                break
    
            skip += top
            params["$skip"] = skip
            time.sleep(1)
    
        return lista_dados_todas_paginas
    
    # Função para comparar colunas entre o banco de dados e a API
    def verificar_novas_colunas(api_columns, db_columns):
        novas_colunas = [col for col in api_columns if col not in db_columns]
        colunas_faltantes = [col for col in db_columns if col not in api_columns]
    
        return novas_colunas, colunas_faltantes
    
    # Função para obter as colunas atuais da tabela do banco
    def get_db_columns(engine, tabela):
        inspector = inspect(engine)
        return [col["name"] for col in inspector.get_columns(tabela)]
    
    # Função para atualizar os últimos dois dias
    def atualizar_dados_ultimos_dois_dias():
        dois_dias_atras = (datetime.now() - timedelta(days=2)).strftime("%Y-%m-%dT%H:%M:%SZ")
        params = {"$select": "id,createdDate,lastUpdate", "$filter": f"createdDate ge {dois_dias_atras}"}
        lista_dados_todas_paginas = chamar_api_movidesk(token, params)
        return pd.DataFrame(lista_dados_todas_paginas)
    
    # Conexão com o banco de dados MySQL
    db_user = os.getenv("DB_USER")
    db_password = os.getenv("DB_PASSWORD")
    db_host = os.getenv("DB_HOST")
    db_name = os.getenv("DB_NAME")
    
    engine = create_engine(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")
    
    # Pega os dados da API
    df_api = chamar_api_movidesk(token)
    api_columns = df_api.columns.tolist()
    
    # Verifica se a tabela já existe no banco
    if "tickets" in inspect(engine).get_table_names():
        db_columns = get_db_columns(engine, "tickets")
    
        novas_colunas, colunas_faltantes = verificar_novas_colunas(api_columns, db_columns)
    
        if novas_colunas:
            print(f"Novas colunas detectadas: {novas_colunas}. Realizando atualização completa.")
            # Código para lidar com a inserção completa dessas colunas
            df_api[novas_colunas].to_sql('tickets', con=engine, if_exists='replace', index=False)
        else:
            print("Nenhuma nova coluna detectada, realizando atualização incremental.")
            df_incremental = atualizar_dados_ultimos_dois_dias()
            df_incremental.to_sql('tickets', con=engine, if_exists='append', index=False)
    
        if colunas_faltantes:
            print(f"Alerta: As seguintes colunas estão ausentes da API: {colunas_faltantes}")
    
    else:
        print("Tabela 'tickets' não existe, criando e realizando carga completa.")
        df_api.to_sql('tickets', con=engine, if_exists='replace', index=False)

    Espero ter ajudado! 
     

  5. 1 hora atrás, Alex Pereira disse:
     

    Bom dia!

    O problema que você está enfrentando é que algumas operações realizadas no Power Query podem fazer com que a opção de native query (consulta nativa) não esteja disponível. Para evitar esse problema, recomendo que você faça o máximo possível do trabalho diretamente em SQL antes de importar os dados para o Power Query.

    Eu costumo criar a consulta SQL com todos os parâmetros e ajustes necessários desde o início. Isso facilita a chamada e evita problemas com a opção de native query.

    Segue exemplo:
     

    let
        strRangeStart = DateTime.ToText(RangeStart,[Format="yyyy-MM-dd HH:mm:ss", Culture="en-US"]),
        strRangeEnd = DateTime.ToText(RangeEnd,[Format="yyyy-MM-dd HH:mm:ss", Culture="en-US"]),
        Query = "
        SELECT
            sub.sk_ctrc AS sk_ctrc,
            sub.dia_inclusao_ocor,
            sub.usuario_ocor,
            sub.unid_ocor,
            sub.cod_ocor
        FROM dw.fato_ocorrencias sub
        WHERE 
            sub.emissao_ctrc  >= '" & strRangeStart & "' AND sub.emissao_ctrc  < '" & strRangeEnd & "')
        ",
        Fonte = MySQL.Database("SEU IP", "DATABASE", [ReturnSingleDatabase=true, Query=Query])
    in
        Fonte

     

    Como já estou montando as consultas antecipadamente, isso garante que, ao puxar os dados do banco, o processamento será otimizado ao máximo, mesmo que o Direct Query esteja desativado. Enfim, está foi a solução que encontreii!

  6. 8 horas atrás, Henrik Oliveira Paes disse:

    Olá pessoal!

    Estou com problemas ao tentar fazer a atualização incremental em um banco de dados MySQL conectado via ODBC x64 MySQL 8.3 Unicode.


    Acontece que, ao definir o RangeStart e RangeEnd, quando vou aplicar a atualização incremental no Front-end do BI, ele me apresenta a seguinte mensagem: Unable to M query can be folded. incremental refresh can't be suggested for non-foldable queries.

    image.png.75695d53385e67eda6a1da72fd4bbf74.png

    Até encontrei um vídeo no YouTube watch?v=QEFze-LdLqo onde é falado que dependendo das etapas aplicadas no Power Query, pode-se perder a instancia de "View Native Query".  O que poderia explicar essa mensagem acima. Mas praticamente qualquer etapa, seja de mudar tipo de dados, fazer split de coluna ou só duplicar uma coluna já faz sumir essa "View Native Query".

    Segue abaixo o print de uma das tabelas que tenho no Power Query com alguns tratamentos, onde já se "perdeu" essa possibilidade de incrementar dados:

    image.png.e550ac275124d6a2cd0b3da222a6ac0e.png

    Alguém já passou por isso? Porque eu acredito que é quase inviável fazer todas as transformações de dados no Banco SQL antes de trazer os dados para o Power BI.
    Será que não tem uma outra opção de ativar essa atualização incremental e manter as etapas de transformação aplicadas?

    No meu caso, o que acontece: O Power BI apresenta aquela mensagem em amarelo, e quando estou no Power BI Serviço ele simplesmente atualiza o banco todo como se não existisse os parâmetros de RangeStart e RangeEnd.
     

     

    Bom dia!

    O problema que você está enfrentando é que algumas operações realizadas no Power Query podem fazer com que a opção de native query (consulta nativa) não esteja disponível. Para evitar esse problema, recomendo que você faça o máximo possível do trabalho diretamente em SQL antes de importar os dados para o Power Query.

    Eu costumo criar a consulta SQL com todos os parâmetros e ajustes necessários desde o início. Isso facilita a chamada e evita problemas com a opção de native query.

    Segue exemplo:
     

    let
        strRangeStart = DateTime.ToText(RangeStart,[Format="yyyy-MM-dd HH:mm:ss", Culture="en-US"]),
        strRangeEnd = DateTime.ToText(RangeEnd,[Format="yyyy-MM-dd HH:mm:ss", Culture="en-US"]),
        Query = "
        SELECT
            sub.sk_ctrc AS sk_ctrc,
            sub.dia_inclusao_ocor,
            sub.usuario_ocor,
            sub.unid_ocor,
            sub.cod_ocor
        FROM dw.fato_ocorrencias sub
        WHERE 
            sub.emissao_ctrc  >= '" & strRangeStart & "' AND sub.emissao_ctrc  < '" & strRangeEnd & "')
        ",
        Fonte = MySQL.Database("SEU IP", "DATABASE", [ReturnSingleDatabase=true, Query=Query])
    in
        Fonte

     

  7. 1 hora atrás, Maite Aronchi Cruz disse:

    Olá pessoal,

    Quero criar um fluxo no Power automate, para emitir um alerta quando uma coluna de uma planilha de excel, localizada em uma pasta do Sharepoint, é alterada.

    Porém, não encontrei nenhum gatilho específico para que apenas quando a coluna for alterada ele dispare, somente se o arquivo for modificado. Para mim não importa se tiver outras modificações na planilha, somente nesta coluna. 

    Alguém poderia me ajudar?

    Obrigada!

     

     

    Veja esse video:
     

     

    • Thanks 1
  8. 7 horas atrás, Caio Veiga disse:

    pessoal,boa noite.To tentando rodar esse codigo pra criar uma coluna que tenha 4 valores possiveis:"Trimestre Atual","Trimestre passado","Mesmo Trimestre no ano passado" e "Outros"

    o codigo:if [Ano] = List.Max(dCalendario[Ano]) and [Trimestre] = List.Max(dCalendario[Trimestre]) then "Trimestre Atual" else if [Ano] = List.Max(dCalendario[Ano]) and [Trimestre] = List.Max(dCalendario[Trimestre])-1 then "Trimestre Anterior" else if [Ano] = List.Max(dCalendario[Ano])-1 and [Trimestre] = List.Max(dCalendario[Trimestre]) then "T. Ano Passado" else "Outros" O que eu to fazendo de errado pra dar o seguinte erro:Expression.Error: Uma referência cíclica foi encontrada durante a avaliação

    Esse erro de referência cíclica acontece porque você está tentando calcular o valor máximo de dCalendario[Ano] e dCalendario[Trimestre] dentro de uma fórmula que está, ao mesmo tempo, sendo aplicada à própria tabela dCalendario. Você pode tentar colocando em uma variável separada:

     

    let
        AnoMax = List.Max(dCalendario[Ano]),
        TrimestreMax = List.Max(dCalendario[Trimestre]),
        AdicionarColuna = Table.AddColumn(dCalendario, "Período", each 
            if [Ano] = AnoMax and [Trimestre] = TrimestreMax then "Trimestre Atual"
            else if [Ano] = AnoMax and [Trimestre] = TrimestreMax - 1 then "Trimestre Anterior"
            else if [Ano] = AnoMax - 1 and [Trimestre] = TrimestreMax then "T. Ano Passado"
            else "Outros"
        )
    in
        AdicionarColuna



    Obs.: A ooutra solução que dei é mais recomendada! 

  9. Experimente fazer dessa forma comparando com a data de hoje.

     

    let
        DataAtual = DateTime.LocalNow(),
        AnoAtual = Date.Year(DataAtual),
        MesAtual = Date.Month(DataAtual),
        TrimestreAtual = Number.RoundUp(MesAtual / 3),
        
        AdicionarColuna = Table.AddColumn(dCalendario, "Período", each 
            if [Ano] = AnoAtual and [Trimestre] = TrimestreAtual then "Trimestre Atual"
            else if [Ano] = AnoAtual and [Trimestre] = TrimestreAtual - 1 then "Trimestre Anterior"
            else if [Ano] = AnoAtual - 1 and [Trimestre] = TrimestreAtual then "T. Ano Passado"
            else "Outros"
        )
    in
        AdicionarColuna



     

  10. Em 05/09/2024 em 09:14, Edson Igari disse:

    Minha conta é PRO Alex, mas testei também com uma conta free e funcionou do mesmo jeito. O modelo de dados dele tem 537 linhas em uma fato e 47 linhas na outra. Você acha que um modelo desse tamanho geraria tal problema???
    As configurações da máquina utilizada também podem influenciar, como memória RAM, processador, tudo isso influencia, pois do contrário, você poderia instalar o power bi numa máquina com windows home e rodar. 

     

    Com a quantidade real de dados, a medida pode não funcionar tão bem, mas como o exemplo fornecido é apenas uma amostra, o volume de dados é significativamente menor, o que permite que a medida funcione no nosso ambiente. Nesse caso, há vários procedimentos que ele pode seguir para otimizar o desempenho. O ideal seria revisar a lógica da medida DAX e buscar formas de minimizar os cálculos, a fim de reduzir o tempo de processamento.

  11. 13 horas atrás, Henrik Oliveira Paes disse:

    Boa tarde pessoal!

    @Rafael Pereira O fornecedor do sistema havia pedido 700 reais mensais para "liberar a API" e enviar o manual. Então como ficaria inviável, optei por eu mesmo investigar a URL e conectar na API. Respondendo sua pergunta, não tenho manual.

    @Henrique Merola Faria Infelizmente nesse formato não deu certo também, ele apresenta erro no campo de consulta mesmo.

    @Alex Pereira Até consegui fazer funcionar utilizando essa função Uri.EscapeDataString, porém fica muito ruim de colocar depois um RangeStart e RangeEnd ai dentro, pelo menos eu não imaginei uma forma de fazer isso.

    Galera agradeço pelo apoio, mas hoje pela manhã consegui resolver depois de muita insistência com o ChatGPT. Vou colocar a solução abaixo.

    image.png.d2b1229b88436cc8493c8be0500e52d0.png

    Você faz uma concatenação só que no caso deve transformar a data primeiro nesse formato xx/xx/xxxx como fiz exemplo te mostrei. Veja exemplo abaixo:

     

        let
        DataInicio = DateTime.ToText(RangeStart, "dd/MM/yyyy"),
        DataFim = DateTime.ToText(RangeEnd, "dd/MM/yyyy"),
        Body = Json.FromValue(
            [
                page = pageNumber,
                limit = 25,
                filter = "[ 
                    {
                        ""property"":""AnoMes"",
                        ""operator"":""greaterOrEqual"",
                        ""value"":""" & DataInicio & """,
                        ""and"":true
                    },
                    {
                        ""property"":""AnoMes"",
                        ""operator"":""lessOrEqual"",
                        ""value"":""" & DataFim & """,
                        ""and"":true
                    }
                ]"
            ]
        )
    in
        Body
    
    
    
    
    • Like 1
  12. Para criar um bookmark que afete apenas dois visuais que estão no mesmo lugar no Power BI, o processo pode ser feito agrupando os dois visuais. Selecione os dois gráficos que deseja controlar e, no painel de seleção, agrupe-os. Em seguida, oculte esse grupo para controlar sua visibilidade diretamente pelo bookmark.

  13. Bom diaaa! Como o Rafael mencionou, o erro está relacionado à ausência de um gateway instalado. Nesse caso, será necessário instalar o gateway no servidor onde os dados estão hospedados, ou em um ambiente que tenha acesso de rede ao servidor, como na AWS, por exemplo. É possível configurar o acesso à rede através de IPs específicos, restringindo o acesso conforme necessário. Portanto, o gateway não precisa estar no mesmo local que o servidor, mas sim em um ambiente que possua conectividade com ele.
     

    Após obter esse acesso, será necessário configurar o seu gateway de dados, inserindo as conexões necessárias para que ele funcione corretamente. No seu caso específico, você precisará configurar as credenciais de acesso ao servidor. É importante lembrar: utilize o Gateway Enterprise para garantir um desempenho ideal.

    Nesta aula, o mestre ensina como fazer essa configuração: https://app.xperiun.com/aula/1704330688818x596973771367997700?v=1704838860504x652294912539400400
    image.png.60e11a26c2ea8b6f056883b319e81211.png

     

     

    • Like 2
  14. 13 horas atrás, Edson Igari disse:

    @Lucas Denker, não sei se está certo, mas aqui carregou normal. Sua máquina é boa???
    image.png.21e0047f04d5bbd0fe0c462916e15ae5.png

    @Edson Igari, esse erro geralmente ocorre devido ao consumo de memória do Power BI. Pode ser que a conta que você está utilizando tenha uma configuração ou quantidade de recursos diferente da dele, o que faz com que funcione corretamente no seu ambiente, mas não no dele. Por exemplo, ele pode estar utilizando uma conta Pro, enquanto a sua é PPU (Premium Per User), que tem limites de memória mais altos.

    image.png.a9295bcfea67367d7ef172ce8aa60a0c.png

  15. Boooom diaaa

    Geralmente, as APIs possuem um parâmetro no corpo da requisição chamado query ou algo semelhante, que permite passar filtros como os de datas. Abaixo segue um exemplo de como esse filtro pode ser aplicado no body da requisição POST no Power Query utilizando atualização incremental.

     

    let
        ObterToken = () =>
            let
                urlToken = "https://autenticador.secullum.com.br/Token",
                grantType = grant_type_secullum,
                username = username_secullum,
                password = password_secullum,
                clientId = client_id_secullum,
                body = "grant_type=" & Uri.EscapeDataString(grantType) &
                    "&username=" & Uri.EscapeDataString(username) &
                    "&password=" & Uri.EscapeDataString(password) &
                    "&client_id=" & Uri.EscapeDataString(clientId),
                headers = [#"Content-Type" = "application/x-www-form-urlencoded"],
                options = [
                    Headers = headers,
                    Content = Text.ToBinary(body)
                ],
                response = Json.Document(Web.Contents(urlToken, options)),
                accessToken = response[access_token]
            in
                accessToken,
    
        accessToken = ObterToken(),
        urlGet = "https://pontowebintegracaoexterna.secullum.com.br/IntegracaoExterna/Batidas",
        DataInicio = DateTime.ToText(RangeStart, "yyyy-MM-dd"), // Corrigido: use aspas duplas para definir o valor da data
        DataFim = DateTime.ToText(RangeEnd, "yyyy-MM-dd"), // Corrigido: use aspas duplas para definir o valor da data
        body2 = "DataInicio=" & Uri.EscapeDataString(DataInicio) &
            "&DataFim=" & Uri.EscapeDataString(DataFim), // Corrigido: removido espaço em branco
        headersGet = [#"Authorization" = "Bearer " & accessToken],
        optionsGet = [
            Headers = headersGet,
            Query = [
                DataInicio = DataInicio,
                DataFim = DataFim
            ]
        ],
        responseGet = Json.Document(Web.Contents(urlGet, optionsGet))
    in
    	 responseGet


    É importante ressaltar que a forma como as datas precisam ser passadas pode variar dependendo da API. Isso significa que você deve adaptar o formato da data dos parâmetros de atualização incremental para atender às exigências específicas da API que está utilizando.

  16. Esse erro ocorre porque a medida DAX no Power BI está consumindo muitos recursos e excede os limites de capacidade do serviço. Para resolver o problema, você pode começar revisando a lógica da sua medida para garantir que não está realizando cálculos desnecessários ou repetitivos. Utilizar variáveis pode ajudar a melhorar o desempenho ao evitar cálculos repetidos. Além disso, verifique se você está aplicando filtros e agregações apropriados para reduzir o volume de dados processados.

    Também é importante considerar a simplificação do modelo de dados, reduzindo a complexidade das tabelas e dos relacionamentos. O particionamento de tabelas grandes ou o uso de filtros pode ajudar a reduzir a quantidade de dados processados de uma só vez. Se você estiver usando Power BI Premium, ajustar a configuração de recursos pode ser útil. Além disso, utilizar tabelas de agregação pode pré-calcular dados e melhorar o desempenho dessa consulta.

×
×
  • Criar Novo...