Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

.: Vitrine

Carregando artigos...

Views

Mostrando postagens com marcador Snapshot. Mostrar todas as postagens
Mostrando postagens com marcador Snapshot. Mostrar todas as postagens

Power BI | 📌 Automação via PowerShell: Usando Um Script para enviar Relatório por e-Mail - Automation via PowerShell: Using a Script to Email Reports

Power BI | 📌 Automação via PowerShell: Usando Um Script para enviar Relatório por e-Mail - Automation via PowerShell: Using a Script to Email Reports

Se quer um fluxo automático sem Power Automate, pode usar um script PowerShell para:


  1. Tirar um snapshot do relatório.
  2. Enviar um e-mail automaticamente com a imagem.


Esse método requer acesso à API do Power BI e permissões adequadas.


🔹 Pré-requisitos

  • Ter o Power BI aberto no local desejado.
  • Configurar o envio de e-mails via SMTP (Gmail, Outlook ou Exchange).
  • Executar o PowerShell com permissões de administrador.
  • Instalar o módulo Powershell Imaging para capturar a tela.

📝 Script PowerShell

# Definir caminho para salvar a captura de tela
$ImagemPath = "$env:TEMP\PowerBI_Snapshot.png"

# Função para capturar a tela
Add-Type -TypeDefinition @"
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class ScreenCapture {
    [DllImport("user32.dll")]
    public static extern IntPtr GetDesktopWindow();
    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowDC(IntPtr hWnd);
    [DllImport("gdi32.dll")]
    public static extern int BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSrc, int xSrc, int ySrc, int RasterOp);
    [DllImport("gdi32.dll")]
    public static extern bool DeleteDC(IntPtr hdc);
    [DllImport("gdi32.dll")]
    public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
    [DllImport("gdi32.dll")]
    public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
    [DllImport("gdi32.dll")]
    public static extern IntPtr SelectObject(IntPtr hdc, IntPtr h);
    [DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr ho);
    
    public static void CaptureScreen(string filePath) {
        IntPtr hDesk = GetDesktopWindow();
        IntPtr hSrce = GetWindowDC(hDesk);
        IntPtr hDest = CreateCompatibleDC(hSrce);
        int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
        int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
        IntPtr hBmp = CreateCompatibleBitmap(hSrce, width, height);
        IntPtr hOldBmp = SelectObject(hDest, hBmp);
        BitBlt(hDest, 0, 0, width, height, hSrce, 0, 0, 0x00CC0020);
        Bitmap bmp = Image.FromHbitmap(hBmp);
        bmp.Save(filePath, ImageFormat.Png);
        SelectObject(hDest, hOldBmp);
        DeleteObject(hBmp);
        DeleteDC(hDest);
        DeleteDC(hSrce);
    }
}
"@ -Language CSharp

# Capturar a tela do relatório Power BI
[ScreenCapture]::CaptureScreen($ImagemPath)

# Configurações do e-mail
$SMTPServer = "smtp.office365.com"   # Para Outlook | Use "smtp.gmail.com" para Gmail
$SMTPPort = 587
$EmailFrom = "seuemail@seudominio.com"
$EmailTo = "destinatario@seudominio.com"
$EmailSubject = "Snapshot do Relatório Power BI"
$EmailBody = "Segue em anexo a captura de tela do relatório Power BI."
$SMTPUser = "seuemail@seudominio.com"
$SMTPPassword = "suasenha"

# Criar e enviar o e-mail
Send-MailMessage -From $EmailFrom -To $EmailTo -Subject $EmailSubject -Body $EmailBody `
-Attachments $ImagemPath -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl `
-Credential (New-Object System.Management.Automation.PSCredential ($SMTPUser, (ConvertTo-SecureString $SMTPPassword -AsPlainText -Force)))

Write-Host "E-mail enviado com sucesso!"

🛠 Configurações Necessárias

  1. Troque seuemail@seudominio.com e suasenha pelas suas credenciais.
  2. Se usar Gmail, ative "Permitir aplicativos menos seguros" ou gere uma senha de aplicativo.
  3. Mude o SMTP dependendo do provedor de e-mail:
    • Outlook: smtp.office365.com (porta 587).
    • Gmail: smtp.gmail.com (porta 587).
    • Exchange: smtp.office365.com (para Microsoft 365).

🎯 Como Rodar o Script?

  1. Salve o código como EnviarRelatorio.ps1.
  2. Abra o PowerShell como Administrador.

.\EnviarRelatorio.ps1

3. O script capturará a tela e enviará um e-mail com a imagem anexada. 

 

🔥 Vantagens Desta Abordagem

Automatiza a captura de tela do relatório Power BI.
Envia automaticamente um e-mail com o snapshot.
Funciona sem precisar do Power Automate (economizando licenças).
✅ Adaptável para rodar periodicamente via Agendador de Tarefas do Windows.


👉 Não se esqueça de seguir André Bernardes no Linkedin. Clique aqui e me contate via What's App. 

Comente e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com


 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes

VBA Access - Acessando Dados Externos: Acessando tabelas snapshot em queries de bancos externos - Accessing external data: Import a table snapshot from an external query

Inline image 1



O tempo pode ser o nosso aliado quando o fazemos trabalhar para nós. Mas o contrário leva-nos ao sofrimento certo. 

Imagine-se num cenário pouco incomum onde uma informação altamente relevante depende do processamento de um relatório que demora vários minutos para rodar. Ahhh, quem já passou por isso sabe como é irritante a repetitiva pergunta que sobrevém aos nossos ouvidos ritmadamente: "Está pronto?", "Já tem o relatório", "Já acabou", sim, isso é de enlouquecer.

Talvez agora mesmo esteja passando por isso. Quem sabe um Dashboard, um Scorecard, ou mesmo um Relatório que demore muito para executar porque as queries conectadas a eles são muito pesadas por serem complexas para processar e a conexão com o banco de dados também esteja comprometida por estar na rede e neste momento a rede esteja sobrecarregada com o acesso contínuo de várias pessoas dos inúmeros departamentos da sua empresa. Creiam-me, sei como é isso: E não adianta tentar explicar todas as implicações anteriores à pessoa que espera as informações salivando no seu cangote.

Este transtorno é comum à inúmeras aplicações MS Access projetadas para um propósito inicial simples, que foi sendo ampliado em tantas e inúmeras direções que fica muito difícil pensar em atualizar toda a sua aplicação.

Bem, o código que estou disponibilizando poderá lhe poupar várias horas de espera. Economizará muito tempo do seu usuário. E, se for bem vendido ao seu superior direto, o manterá no seu emprego (Especialmente se conseguir mensurar quanto tempo poupará em um ano). 

Qual é o truque?

Simples

Transformaremos todas as queries em tabelas.

Como? 

Com o uso do código abaixo.

Por quê?

Isso permitirá que os dados sejam processados previamente.

Poderá incluir parâmetros viabilizando a existência de cenários.
Insira índices nos campos mais utilizados pelo relatório

Assim quando você ou o seu usuário rodar o Dashboard, o Scorecard ou o Relatório, que foi processado previamente, terá o resultado RAPIDAMENTE.

Segue o código:

' Importa a tabela como snapshot de uma query externa.
SUB ImportQry (dbPath, extQry, localName As String)
' Faz um Loop através de todas as Tabelas da coleção.
Dim tbl As AccessObject, thisDB As Object
Set thisDB = Application.CurrentData

For Each tbl In thisDB.AllTables
   ' Caso a tabela local já existir...
   If tbl.Name = localName Then
      ' se a tabela estiver aberta...
      If tbl.IsLoaded Then
         '...Fecha a tabela.
         DoCmd.Close acTable, localName, acSaveNo
      End If
   '...deleta a tabela local.
   DoCmd.DeleteObject acTable, localName
   End If
Next tbl

' A tabela Local foi importada.
DoCmd.TransferDatabase acImport, "Microsoft Access", _
dbPath, acTable, extQry, localName
End Sub


Tags: VBA, Access, Accessing, external, data, Import, table, snapshot, query

VBA Access - Exportando relatório para RTF, XLS e Snapshot

HeaderBG-Final07.jpg


Olá a todos...

Como posso exportar dados já formatados em um relatório direcioando-os para o Word, Excel ou outro formato?

A função abaixo explora 2 formas diferentes de fazer isso...

Ao exportar para o MS Excel utiliza o Método TransferSpreadsheet (TransferirPlanilha)

Ao exportar para o MS Word e o padrão Snapshot utilizo o Método OutputTo (SaídaPara)
O método OutpuTo pode exportar informações para os seguintes padrões:


acFormatASP
acFormatDAP acFormatHTML acFormatIIS acFormatRTF acFormatSNP acFormatTXT acFormatXLS


Function ...
If nOption = 6 Then
If Not IsNull(Me.SelecRTF) Then
DoCmd.OutputTo acOutputReport, nReport, acFormatRTF, RptName & ".rtf", True
End If
If Not IsNull(Me.SelecSNP) Then
DoCmd.OutputTo acOutputReport, nReport, acFormatSNP, RptName & ".snp", True
End If
If Not IsNull(Me.SelecXLS) Then
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, nTbl1, RptName & ".xls", False, "ESN"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, nTbl2, RptName & ".xls", False, "Supllier"
End If
End If
End

Perceba que uma importante característica de exportação para a planilha é o fato de fazê-lo a
partir de conteúdos diferentes (tabelas) para a mesma planilha.





Tags: Access, RTF, XLSX, Snapshot, export


André Luiz Bernardes
A&A® - In Any Place.



diHITT - Notícias