Forum Discussion

pawankarki23's avatar
pawankarki23
Frequent Visitor
1 year ago
Solved

Dynamic Data source error in PowerBI Service

Hi Everyone, I am trying to fetch data from ADO Board using Power query using Odata.Feed. I have multiple ADO Boards acrros the organization and would like to make the query as dynamic as possible for reuse....Currently I am using Following 

 

let
// Define Parameters
Org = orgName,
Project = projectName,
TeamName = teamName,
TodayDate = DateTimeZone.FixedUtcNow(),
StartDate = DateTimeZone.ToText(Date.AddDays(DateTimeZone.FixedUtcNow(), -30), "yyyy-MM-dd") & "T00:00:00Z",

// Determine the appropriate board name based on project template
BoardName =
if projectType = "Scrum" then "Backlog items"
else "Stories",

// Encode URL parts
EncodedProject = Uri.EscapeDataString(Project),
EncodedTeamName = Uri.EscapeDataString(TeamName),
EncodedBoardName = Uri.EscapeDataString(BoardName),

// Build OData URL
BaseUrl = "https://analytics.dev.azure.com/" & Org & "/" & EncodedProject & "/_odata/v3.0-preview/WorkItemBoardSnapshot?",
ApplyFilter =
"$apply=filter(" &
"Team/TeamName eq '" & TeamName & "' " &
"and BoardName eq '" & BoardName & "' " &
"and DateValue ge " & StartDate &
")/groupby(" &
"(DateValue,ColumnName,LaneName,State,WorkItemType,AssignedTo/UserName,Area/AreaPath), " &
"aggregate($count as Count)" &
")",

FullUrl = BaseUrl & ApplyFilter,

// Fetch Data
Source = OData.Feed(
FullUrl,
null,
[Implementation = "2.0", OmitValues = ODataOmitValues.Nulls, ODataVersion = 4]
),
#"Filtered Rows" = Table.SelectRows(Source, each true)
in
#"Filtered Rows"

 

Here the parameters are defined as power query parameters,

 

PowerBI Desktop works fine for this query but when I try to schedule a refresh, it gives me Dynamic DataSource error. How can i resolve this issue such that I can reuse the same query for different org, project etc as much as possible. Please guide me. Thank you..

  • jennratten's avatar
    jennratten
    1 year ago

    Hi pawankarki23 - I have confirmed that if I use the same code I posted above in a dataflow gen1 I also get the dynamic data source error.  This was successful for me as a dataflow gen2 CICD.  

8 Replies

  • v-saisrao-msft's avatar
    v-saisrao-msft
    Icon for Community Support rankCommunity Support

    Hi pawankarki23,

    Thank you for reaching out to the Microsoft Fabric Forum Community.

     

    The "Dynamic Data Source" error you're encountering is a known limitation in the Power BI Service, as documented by Microsoft. To overcome this, you should use a static base URL in your query. 

    Please refer the below Document: 

    Dynamic M query parameters in Power BI Desktop - Power BI | Microsoft Learn.

     

    If this post helps, then please give us ‘Kudos’ and consider Accept it as a solution to help the other members find it more quickly.

     

    Thank you. 

  • Hello pawankarki23 - I was able to get this to work by using a dataflow Gen2 and making a few modifications to the code.  I also changed the date parameter to a data offset in number of days and provided some additional examples of how you can further parmeterize this, should you wish to do so.

    let
        // Define Parameters (these should be defined in Power BI as query parameters)
        _Org = orgName,
        _Project = projectName,
        _TeamName = teamName,
        _ProjectType = projectType,
        _DateOffset = startDateOffsetInDays,
    
        // Calculate the start date in DateTimeZone format.
        _StartDate = DateTimeZone.ToText(Date.AddDays(DateTimeZone.FixedUtcNow(), _DateOffset), "yyyy-MM-ddTHH:mm:ssZ"),
    
        // Determine the appropriate board name based on project template
        //BoardName = if _ProjectType = "Scrum" then "Backlog items" else "Stories",
        _BoardName = if _ProjectType = "Scrum" then "Stories" else "Backlog Items",  // I had to use this one to get results for my project
    
        // Encode URL parts
        _EncodedProject = Uri.EscapeDataString(_Project),
        _EncodedTeamName = Uri.EscapeDataString(_TeamName),
        _EncodedBoardName = Uri.EscapeDataString(_BoardName),
    
        // Build OData URL
        Url = "https://analytics.dev.azure.com/" & _Org & "/" & _EncodedProject & "/_odata/v4.0-preview/WorkItemBoardSnapshot?"
            &"$apply=filter( "
                &"Team/TeamName eq '" & _TeamName & "' "
                &"and StartDate lt now() "
                & "and BoardName eq '" & _BoardName & "' "
                &"and DateValue gt " & _StartDate & " "
    // Additional examples that could be included
    //            &"and IsCurrent eq true "
    //            &"and startswith(Area/AreaPath,'" & varAreaPathPrefix & "') "
    //            &"and StateCategory ne '" & varStateCategory_Excl & "' "
    //            &"and DateValue le now()  "
    //            &"and DateValue ge Iteration/StartDate "
    //            &"and DateValue le Iteration/EndDate "
    //            &"and Iteration/StartDate le now()  "
    //            &"and Iteration/EndDate ge now() "
    //            &"and WorkItemType eq 'Task' "
            &") "
                &"/groupby( "
                &"(Team/TeamName,Area/AreaPath,DateValue,ColumnName,LaneName,State,AssignedTo/UserName,WorkItemType),  "
                &"aggregate($count as Count) "
            &") &$orderby=DateValue,State", // additional example
    //        &"&$top=100 ", // additional example
    
        // Result
        data = OData.Feed(Url, null, [Implementation = "2.0", OmitValues = ODataOmitValues.Nulls, ODataVersion = 4]),
        RemoveComplexColumns = Table.RemoveColumns(data, Table.ColumnsOfType(data, {type table, type record, type list, type nullable binary, type binary, type function}))
    in 
        RemoveComplexColumns



     

     

     

    You can also trigger this to run using a data pipeline and let the pipeline hold your list of teams/parameter values and the dataflow can interate through those.  Please let me know if you'd like me to help with that.

     

    • pawankarki23's avatar
      pawankarki23
      Frequent Visitor

      Hi jennratten , Thank you for testing out. I am parametarizing all those variables as power query parameters. Did you try to save the dataflow and set a scheduled refresh in dataflow gen 2 with the query that you have wrriten? I only have access to dataflow gen 1 yet. Please let me know if you could do that so that I can ask for upgrade of our powerbi env to MS Fabric. Thank you again. 

  • pawankarki23's avatar
    pawankarki23
    Frequent Visitor

    Found that we can use dynamic url in odata connection using dataflow gen 2 cicd only. I could schedule refresh and found the dataflow refresh working as well. This is a great way to use dynamic odata URL to pull only data as needed and also avoid "dynamic data source" issue generated at the PowerBI service.