简体   繁体   中英

PowerBI API Clone Report and Dataset changing the datasource

I am developing an application in .NET6 using the PoweBI Client for managing workspaces, reports, datasets, etc.

The idea is that the application will be able to create client workspaces and will inherit reports and datasets from a main workspace. In the main workspace there will be reports published from PowerBI Desktop and therefore the respective dataset will be also there.

At the moment of the clone datasource database, user and password should be changed accordantly to match the workspace customer context. Using the following code I can list the reports on the main workspace (workspace_from_id) and I can create them on customer workspace (workspace_towa_id)

var reports_from = pbiClient.Reports.GetReports(workspace_from_id);
foreach (Report report_from in reports_from.Value)
{
    Guid report_from_id = report_from.Id;
    CloneReportRequest cloneReportRequest = new();
    cloneReportRequest.TargetWorkspaceId = workspace_towa_id;
    cloneReportRequest.TargetModelId = dataset_towa.Id;
    cloneReportRequest.Name = report_from.Name;
    Report report_towa = pbiClient.Reports.CloneReport(workspace_from_id, report_from_id, cloneReportRequest);
}

The problem of the above code is that the dataset is not cloned and the source dataset is used as shared dataset for both workspaces. I tried already to copy the dataset details and create a new one with different database using the following code:

CreateDatasetRequest createDatasetRequest = new();
createDatasetRequest.Name = dataset_from.Name;
createDatasetRequest.Datasources = new List<Datasource>();
createDatasetRequest.Tables = new List<Table>();

Datasources datasources_from = pbiClient.Datasets.GetDatasources(workspace_from_id, dataset_from_id);
foreach (Datasource datasource_from in datasources_from.Value)
{
    //FOREACH DATASOURCE IN DATASET
    Datasource datasource_towa = new ();
    datasource_towa.Name = datasource_from.Name;
    datasource_towa.DatasourceType = datasource_from.DatasourceType;
    //CHANGE DATASOURCE CONNECTION DETAILS
    DatasourceConnectionDetails datasourceConnectiondetails = datasource_from.ConnectionDetails;
    datasourceConnectiondetails.Database = $"{Variables.reporting_db}_{group_towa.Name.ToLower()}";
    datasource_towa.ConnectionDetails = datasourceConnectiondetails;
    datasource_towa.ConnectionString = datasource_from.ConnectionString;
    datasource_towa.GatewayId = datasource_from.GatewayId;
    //ADD DATASOURCE INTO DATASET
    createDatasetRequest.Datasources.Add(datasource_towa);
}

Tables tables_from = pbiClient.Datasets.GetTables(workspace_from_id, dataset_from_id); //WORKS FOR PUSH DATASET
foreach (Table table_from in tables_from.Value)
{
    //FOREACH TABLE IN DATASET
    Table table_towa = new ();
    table_towa.Name = table_from.Name;
    table_towa.Source = table_from.Source;
    table_towa.Columns = table_from.Columns;
    table_towa.Rows = table_from.Rows;
    table_towa.Description = table_from.Description;
    //ADD TABLE INTO DATASET
    createDatasetRequest.Tables.Add(table_from);
}

The problem with the above code is that the pbiClient.Datasets.GetTables function is not working for normal datasets but is used only for push datasets. Finally without beeing able to get the Tables the following code is failing:

var dataset_towa = pbiClient.Datasets.PostDataset(workspace_towa_id, createDatasetRequest);

Finally discovered that also the pbiClient.Datasets.PostDataset method is used to post push dataset as described here: https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post-dataset

=======UPDATE 13/01/2023=======

Tried already a few other ways to clone the report and dataset like to create a datasource but for that we need a data gateway. In that case when the reports are already into a cloud like Azure for PostgreSQL we do need a gateway. On the other side I tried to create a Virtual Gateway in order to create datasource into this Gateway, but =Virtual Gateway is not supported by PowerBI Api and is only supported in premium capacities.

So seems that I cannot clone report together with a dataset and change the datasource.

Any ideas?

After a lot of hours researching I managed to download report from main workspace and upload them into customer workpaces by changing the datasource details.

Steps to perform:

  1. Export report with PowerBI API /Export as stream into memory
  2. Import report with PowerBI API /Imports as stream from memory (needs special treat to be sure that you read the whole stream from the HTTP Content / using SDK is not working)
  3. Update report ConnectionDetails with PowerBI Client SDK /pbiClient.Datasets.UpdateDatasourcesInGroup (needs special treat to change only the server and database attribute without putting new instance of object)
  4. Update datasource of the dataset with PowerBI Client SDK /pbiClient.Gateways.UpdateDatasource (needs special treat to give credentials as JSON)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM