Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Existe alguma maneira de incorporar relatórios e painéis do power bi no aplicativo de desktop vb.net ou C # com o banco de dados sql server 2008?


Sim absolutamente! Como @David Browne disse em sua resposta, é apenas uma questão de carregar algo em um navegador da web. Geralmente, não importa quais são suas fontes de dados - SQL Server ou arquivos simples, é tudo a mesma coisa. Você pode ver como fica no Power BI Embedded Playground.

Você tem duas maneiras de incorporar relatórios do Power BI (ou painéis ou blocos, é essencialmente o mesmo):

  1. Use o Servidor de Relatórios do Power BI instalado no local. Para incorporar um relatório, basta adicionar um iframe em uma página da web e defina sua origem para o URL do relatório, mas adicione ?rs:embed=true para isso. No entanto, o Power BI Reporting Server é bastante caro. Você precisa de uma licença para SQL Server Enterprise com garantia de software ou assinaturas do Power BI Premium. A vantagem neste caso pode ser o fato de que os dados são mantidos no local, porque em alguns casos a publicação de dados na nuvem pode ser proibida ou difícil de certificar e garantir a privacidade dos dados.

  2. Publique seus relatórios no Power BI Service (ou seja, online no site do Power BI). A vantagem deste cenário é o seu preço. Você pode implementar soluções com uma única conta do Power BI Pro, ou seja, US$ 10 por mês. A desvantagem pode ser que seus dados devem estar acessíveis para o Serviço do Power BI (ou seja, fora de sua rede interna) e é um pouco mais complexo de incorporar.

Quando você insere o Power BI em seu aplicativo, há dois cenários para escolher - dados de propriedade do usuário e dados de propriedade do aplicativo. Com o primeiro, cada usuário precisa de sua própria conta do Power BI Pro e a usa para ver o relatório inserido. Com o segundo cenário, você precisa apenas de uma conta "mestre" do Power BI Pro (também é possível incorporá-la autenticando com a entidade de serviço, mas vamos simplificar por enquanto).

Você não mencionou é seu aplicativo da web ou desktop do aplicativo vb.net. Aqui está uma demonstração muito boa de como incorporar o Power BI no aplicativo WPF e aqui estão os exemplos oficiais da Microsoft de como fazer isso em um aplicativo Web.

Vou explicar com mais detalhes como incorporá-lo em um aplicativo de desktop, mas com aplicativos da Web essencialmente é o mesmo.

Primeiro, você precisa publicar seu relatório no Serviço do Power BI. Será melhor usar um espaço de trabalho dedicado para isso. Certifique-se de que a conta Pro, que você usará como conta "mestre" em seu aplicativo, tenha direitos para este espaço de trabalho. Não é uma boa ideia usar sua conta (provavelmente de administrador), porque ela tem muito mais privilégios do que o necessário. Você pode, mas se $ 10/mês não for um problema, gaste-os em uma conta dedicada (ou use o principal de serviço).

Então você precisa registrar um aplicativo. Digite um nome de aplicativo descritivo, defina o tipo de aplicativo como aplicativo nativo. Selecione as permissões que serão necessárias para seu aplicativo, ou seja, se for apenas ler dados, não conceda permissões de "leitura e gravação" a ele. Ou conceder-lhes todos. A decisão é tua. Registre o aplicativo e copie o guid que você receberá. É chamado de "id do aplicativo" ou "id do cliente". Você precisará disso mais tarde.

A próxima etapa é autenticar seu aplicativo no Azure AD. Use as Bibliotecas de Autenticação do Azure Active Directory (ADAL) para isso. Adicione ADAL ao seu progect (por exemplo, usando NuGet) e use o código a seguir para adquirir um token de acesso (o código está em C#, porque eu não escrevi em vb por muitos anos, mas você não deve ter problemas para traduzi-lo), mas atribua o guid que você tem para clientId e forneça valores para masterAccountName e masterAccountPassword :
using Microsoft.IdentityModel.Clients.ActiveDirectory;

private static string redirectUri = "https://login.live.com/oauth20_desktop.srf";
private static string resourceUri = "https://analysis.windows.net/powerbi/api";
private static string authorityUri = "https://login.windows.net/common/oauth2/authorize";
private static string clientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

private static AuthenticationContext authContext = new AuthenticationContext(authorityUri, new TokenCache());

// First check is there token in the cache
try
{
    authenticationResult = authContext.AcquireTokenSilentAsync(resourceUri, clientId).Result;
}
catch (AggregateException ex)
{
    AdalException ex2 = ex.InnerException as AdalException;
    if ((ex2 == null) || (ex2 != null && ex2.ErrorCode != "failed_to_acquire_token_silently"))
    {
        throw new ApplicationException(ex.Message);
    }
}

if (authenticationResult == null)
{
    var uc = new UserPasswordCredential(masterAccountName, masterAccountPassword);
    authenticationResult = authContext.AcquireTokenAsync(resourceUri, clientId, uc).Result;
}

No final authenticationResult.AccessToken conterá o token de acesso que você precisará. Se você está curioso sobre o que está dentro dele, acesse https://jwt.io/ e cole-o para decodificá-lo.

Chame Get Report In Group Power BI REST API para obter o embedUrl do relatório . Use um código como este (ele usa Newtonsoft.Json), fornecendo groupId real (workspaceId), reportId (você pode obtê-los a partir do URL do seu relatório, quando ele é exibido em um navegador da web) e accessToken :
string powerBIDatasetsApiUrl = $"https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}";

var request = WebRequest.Create(powerBIDatasetsApiUrl) as HttpWebRequest;
request.KeepAlive = true;
request.Method = "GET";
request.ContentLength = 0;
request.ContentType = "application/json";

request.Headers.Add("Authorization", $"Bearer {accessToken}");

using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
{
    using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
    {
        string responseContent = reader.ReadToEnd();
        var responseJson = JsonConvert.DeserializeObject<dynamic>(responseContent);
        return responseJson["embedUrl"];
    }
}

Aqui vem a parte complicada. Você precisa do cliente JavaScript do Power BI para usar o URL obtido com o código acima. A maneira mais fácil é obter ReportLoader.html , ReportLoader.js e powerbi.js do exemplo WPF acima. Você pode ler detalhes sobre esses arquivos aqui, mas em geral o arquivo HTML contém um <div> vazio , onde o relatório será carregado e você chama o código em ReportLoader.js , passando alguns parâmetros (qual relatório, token de acesso, tipo de token de acesso etc.), e ele chamará o cliente JavaScript do Power BI para fazer o trabalho pesado para você.

Os parâmetros, que você passará para o código do carregador, com código assim:
var parameters = new object[] { embedUrl, accessToken, reportId, "report" /* or "dashboard" or "tile"*/, 0 /* 0 - AAD, 1 - Embed */, string.Empty };
webBrowser.Document.InvokeScript("LoadEmbeddedObject", parameters);

webBrowser é um componente do navegador da Web, no qual você carrega ReportLoader.html . embedUrl e accessToken são os valores, que você adquiriu antes, o ID do relatório, tipo de elemento incorporado (é relatório, bloco ou painel), tipo de token de acesso (é AAD, que usamos neste caso, ou incorporado) e por enquanto deixe o último vazio (para obter mais detalhes sobre isso, consulte Detalhes da configuração de incorporação). A diferença entre AAD e Embed tokens é que os tokens incorporados são válidos para um elemento específico (por exemplo, relatório), enquanto os tokens AAD podem ser usados ​​para se autenticar em muitas chamadas diferentes. Isso significa que é mais seguro usar tokens de incorporação, porque eles podem ser usados ​​apenas para incorporar esse relatório específico e não podem ser usados ​​para executar outras chamadas de API REST. Lembre-se de que esse token de acesso é visível no lado do cliente (está no código JavaScript). Se você quiser usar tokens de incorporação, use o token AAD no lado do servidor para chamar GenerateTokenInGroup, mas isso requer uma capacidade dedicada atribuída a este espaço de trabalho (ou seja, Power BI Premium ou Power BI Embedded) e sem capacidade, sua conta Pro foi limitada número de tokens, que você pode usar apenas para desenvolvimento.

Depois disso, seu relatório deve ser carregado com sucesso no webBrowser .

Também recomendo que você assista a este vídeo Usando autenticação somente de aplicativo com incorporação do Power BI com Ted Pattison.