5.4 KiB
5.4 KiB
Report Operations
Get Report Info
# Check exists
fab exists "ws.Workspace/Report.Report"
# Get properties
fab get "ws.Workspace/Report.Report"
# Get ID
fab get "ws.Workspace/Report.Report" -q "id"
Get Report Definition
# Full definition
fab get "ws.Workspace/Report.Report" -q "definition"
# Save to file
fab get "ws.Workspace/Report.Report" -q "definition" -o /tmp/report-def.json
# Specific parts
fab get "ws.Workspace/Report.Report" -q "definition.parts[?path=='definition/report.json'].payload | [0]"
Get Connected Model
# Get model reference from definition.pbir
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path, 'definition.pbir')].payload | [0]"
Output shows byConnection.connectionString with semanticmodelid.
Export Report
- Export to local directory:
fab export "ws.Workspace/Report.Report" -o /tmp/exports -f
- Creates structure:
Report.Report/
├── .platform
├── definition.pbir
└── definition/
├── report.json
├── version.json
└── pages/
└── {page-id}/
├── page.json
└── visuals/{visual-id}/visual.json
Import Report
- Import from local PBIP:
fab import "ws.Workspace/Report.Report" -i /tmp/exports/Report.Report -f
- Import with new name:
fab import "ws.Workspace/NewName.Report" -i /tmp/exports/Report.Report -f
Copy Report Between Workspaces
fab cp "dev.Workspace/Report.Report" "prod.Workspace" -f
Create Blank Report
- Get model ID:
fab get "ws.Workspace/Model.SemanticModel" -q "id"
- Create report via API:
WS_ID=$(fab get "ws.Workspace" -q "id" | tr -d '"')
fab api -X post "workspaces/$WS_ID/reports" -i '{
"displayName": "New Report",
"datasetId": "<model-id>"
}'
Update Report Properties
# Rename
fab set "ws.Workspace/Report.Report" -q displayName -i "New Name"
# Update description
fab set "ws.Workspace/Report.Report" -q description -i "Description text"
Rebind to Different Model
- Get new model ID:
fab get "ws.Workspace/NewModel.SemanticModel" -q "id"
- Rebind:
fab set "ws.Workspace/Report.Report" -q semanticModelId -i "<new-model-id>"
Delete Report
fab rm "ws.Workspace/Report.Report" -f
List Pages
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path, 'page.json')].path"
List Visuals
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path, '/visuals/')].path"
Count Visuals by Type
- Export visuals:
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path,'/visuals/')]" > /tmp/visuals.json
- Count by type:
jq -r '.[] | .payload.visual.visualType' < /tmp/visuals.json | sort | uniq -c | sort -rn
Extract Fields Used in Report
- Export visuals (if not done):
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path,'/visuals/')]" > /tmp/visuals.json
- List unique fields:
jq -r '[.[] | (.payload.visual.query.queryState // {} | to_entries[] | .value.projections[]? | if .field.Column then "\(.field.Column.Expression.SourceRef.Entity).\(.field.Column.Property)" elif .field.Measure then "\(.field.Measure.Expression.SourceRef.Entity).\(.field.Measure.Property)" else empty end)] | unique | sort | .[]' < /tmp/visuals.json
Validate Fields Against Model
- Export report:
fab export "ws.Workspace/Report.Report" -o /tmp/report -f
- Extract field references:
find /tmp/report -name "visual.json" -exec grep -B2 '"Property":' {} \; | \
grep -E '"Entity":|"Property":' | paste -d' ' - - | \
sed 's/.*"Entity": "\([^"]*\)".*"Property": "\([^"]*\)".*/\1.\2/' | sort -u
- Compare against model definition to find missing fields.
Report Permissions
- Get IDs:
WS_ID=$(fab get "ws.Workspace" -q "id" | tr -d '"')
REPORT_ID=$(fab get "ws.Workspace/Report.Report" -q "id" | tr -d '"')
- List users:
fab api -A powerbi "groups/$WS_ID/reports/$REPORT_ID/users"
- Add user:
fab api -A powerbi "groups/$WS_ID/reports/$REPORT_ID/users" -X post -i '{
"emailAddress": "user@domain.com",
"reportUserAccessRight": "View"
}'
Deploy Report (Dev to Prod)
- Export from dev:
fab export "dev.Workspace/Report.Report" -o /tmp/deploy -f
- Import to prod:
fab import "prod.Workspace/Report.Report" -i /tmp/deploy/Report.Report -f
- Verify:
fab exists "prod.Workspace/Report.Report"
Clone Report with Different Model
- Export source:
fab export "ws.Workspace/Template.Report" -o /tmp/clone -f
-
Edit
/tmp/clone/Template.Report/definition.pbirto updatesemanticmodelid -
Import as new report:
fab import "ws.Workspace/NewReport.Report" -i /tmp/clone/Template.Report -f
Troubleshooting
Report Not Found
fab exists "ws.Workspace"
fab ls "ws.Workspace" | grep -i report
Model Binding Issues
# Check current binding
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path, 'definition.pbir')].payload | [0]"
# Rebind
fab set "ws.Workspace/Report.Report" -q semanticModelId -i "<model-id>"
Import Fails
# Verify structure
ls -R /tmp/exports/Report.Report/
# Check definition is valid JSON
fab get "ws.Workspace/Report.Report" -q "definition" | jq . > /dev/null && echo "Valid"