Cómo hacer una revisión de código de un conjunto de datos de Power BI antes de publicar

Un usuario Pregunto ✅

sau001

Hola a todos,

Considere el siguiente escenario

  • 2 empleados trabajando de forma remota
  • trabajando en el mismo conjunto de datos que consulta en vistas SQL en modo de importación
  • haciendo cambios iterativos
  • Publicar en línea para la empresa en general
  • El conjunto de datos no incluye ninguna visualización. Las visualizaciones están en diferentes informes que invocan directamente el conjunto de datos en línea de Power BI que se publicó en los pasos anteriores.

Desafío

  • Employee1 agrega un campo calculado (como ejemplo)
  • Employee1 cambia el formato DateTime de un campo a Date
  • ¿Cómo revisa el Empleado 2 los cambios en el modelo?
  • ¿Cómo se compara el Empleado 2 con la versión anterior y descubre qué ha cambiado en el modelo?
  • ¿Cómo detecta el Empleado 2 los cambios involuntarios o no deseados en el modelo de informe (por ejemplo, relación rota)?

¿Alguna mejor práctica?

¿Es factible exportar una plantilla fuera del PBIX -> cambiar el nombre a PBIT a ZIP -> y luego hacer una comparación GIT en el archivo ‘DataModelSchema’?

Gracias,

Sau

sau001

Hola @lbendlin,

Versión ligeramente modificada de su script PS

  • Estoy usando Expandir-Archivar
  • Las rutas son relativas porque tengo el archivo PBIT y el PS bajo control de Git

Jerarquía de carpetas de Visual Studio

sau001_0-1614690017650.png

Secuencia de comandos de PowerShell: ExtractPbitTemplate.ps1

Set-StrictMode -Version "2.0"
$ErrorActionPreference="Stop"
cls

$scriptFolder=$PSScriptRoot
"Current folder is $scriptFolder"

$pathToPowerBiTemplateFile=Join-Path -Path $scriptFolder -ChildPath "..MssqlParticipants.pbit"
if ((Test-Path -Path $pathToPowerBiTemplateFile) -eq $false)
{
    Write-Error "Could not find file $pathToPowerBiTemplateFile"
}

$now=get-date
$tempSubFolder=("PowerBI-{0}" -f $now.tostring("dd-MMM-YYYY-HH-mm-ss"))
$tempWorkingFolder=Join-Path -Path $env:TEMP -ChildPath $tempSubFolder

if (Test-Path $tempWorkingFolder) 
{
    Write-Error ("The temp folder already  exists {0}" -f $tempWorkingFolder)
}
else
{
    New-Item -Path $tempWorkingFolder -ItemType Directory
    "Temp folder $tempWorkingFolder was created"
}


#
#Copy PBIT with a ZIP extension and extract all contents
#
$newPbitFile=Join-Path -Path $tempWorkingFolder -ChildPath "NewPbit.zip"
Copy-Item -Path $pathToPowerBiTemplateFile -Destination $newPbitFile
$folderForTemplateExtraction=Join-Path -Path $tempWorkingFolder -ChildPath "TemplateContents"
Expand-Archive -Path $newPbitFile -DestinationPath $folderForTemplateExtraction
#
#Read the content of the Model and save as a readable text
#

$contentsOfDataModelSchema=Get-Content -Path "$folderForTemplateExtractionDataModelSchema" -Encoding Unicode

$folderVsNetTemplateContents=Join-Path -Path $scriptFolder -ChildPath "..CorlifeMssql"
$fullPathToVsNetTemplate=Join-Path -Path $folderVsNetTemplateContents -ChildPath "DataModelSchema"
[System.IO.File]::WriteAllLines($fullPathToVsNetTemplate, $contentsOfDataModelSchema)

lbendlin

Le recomiendo encarecidamente que consulte el kit de herramientas de ALM. Pero incluso entonces tu mejor arma es la comunicación.

Su enfoque basado en git definitivamente no hace daño (por cierto, puede exportar a PBIT directamente).

Aquí hay un pequeño script que uso para extraer el contenido de PBIT en una versión compatible con git:

# Alias for 7-zip 
if (-not (test-path "$env:ProgramFiles7-Zip7z.exe")) {throw "$env:ProgramFiles7-Zip7z.exe needed"} 
set-alias sz "$env:ProgramFiles7-Zip7z.exe" 
# set location
Set-Location -Path C:UsersxxxDocumentsGitHubyyy
# get .pbit files
$files = Get-ChildItem -Recurse -Include *.pbit | Select Name,FullName,LastWriteTime
for ($i = 0; $i -lt $files.Count; $i++) {
    if($files[$i].LastWriteTime -gt (Get-Date).AddDays(-2)) {
        Write-Host $files[$i].Name
        $p = $files[$i].FullName
        $e = $p.LastIndexOf(".")
        #target folder
        $d = $p.Substring(0,$e)
        #Write-Host $d
        # remove entire folder, so we don't have to care about removing individual items
        Remove-Item -LiteralPath $d -Recurse -Force 
        # 7Zip doesn't need the renaming
        sz x "$p" -o"$d" -aoa | Out-Null
        Rename-Item -LiteralPath ($d + "ReportLayout") -NewName "Layout.json" -Force -ErrorAction Ignore
        Rename-Item -LiteralPath ($d + "Connections") -NewName "Connections.json" -Force -ErrorAction Ignore
        Rename-Item -LiteralPath ($d + "DiagramLayout") -NewName "DiagramLayout.json" -Force -ErrorAction Ignore
        Rename-Item -LiteralPath ($d + "DiagramState") -NewName "DiagramState.json" -Force -ErrorAction Ignore
        #extract DataMashup
        #sz x "$dDataMashup" -o"$dMashup" -aoa | Out-Null
        #clean up DataModelSchema
        $DMS =  Get-Content -Raw -Path ($d + "DataModelSchema") -Encoding Unicode  | ConvertFrom-Json
        #new meta format doesn't have datasources. Now $DMS.model.tables
        if($DMS.compatibilityLevel -lt 1520) {
            $DMS.model.dataSources | ForEach-Object -Process { 
                #find mashup part of connectionString
                $c1 = $_.connectionString.IndexOf("Mashup=", [StringComparison]"CurrentCultureIgnoreCase")
                #no mashup for direct query
                if( $c1 -gt 1 ) {
                    $c2 = $_.connectionString.LastIndexOf("Location=", [StringComparison]"CurrentCultureIgnoreCase")
                    $m = $_.connectionString.Substring($c1 + 7,$c2-$c1-8)
                    #remove quotes if needed
                    $m = $m -replace '"',""
                    #$m.Length
                    $_.connectionString = $_.connectionString.Substring(0,$c1 + 7) + "..." + $_.connectionString.Substring($c2-1,$_.connectionString.Length - $c2 +1)
                    #$_.name 
                    # write connection zip file - Base64 encoded mashup string
                    #$bytes = [Convert]::FromBase64String($m) 
                    #[IO.File]::WriteAllBytes($d + "" + $_.name + ".zip", $bytes)
                }
            }
        }
        # write corrected Json
        $DMS | ConvertTo-Json -Depth 3 | Add-Content -LiteralPath ($d + "DataModelSchema.json")
    }
}

Tenga en cuenta que el formato PBIX / PBIT cambia constantemente, por lo que debe tener en cuenta el mantenimiento del código.

sau001

En respuesta a lbendlin

Gracias @lbendlin. Estoy probando tu idea de PowerShell. Parece que es un enfoque sólido, con las limitaciones actuales.

Todavía estoy experimentando.

Por cierto, pude usar Expand-Archive en lugar de 7z.exe

Salud,

Sau

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *