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
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