Forum Discussion

Brice_LE-LANN's avatar
Brice_LE-LANN
Regular Visitor
6 years ago

Formula.Firewall: Please rebuild this data combination.

Hi all,

 

I have a table contains some values and I need to do a API call for each item with some conditions.

I have trouble with this error:

"Formula.Firewall: Query references other queries or steps, so it may not directly access a data source. Please rebuild this data combination."

 

I have read this https://insightsquest.com/2017/10/19/data-source-staging-queries/ and this https://www.excelguru.ca/blog/2015/03/11/power-query-errors-please-rebuild-this-data-combination/ but I'm still stuck. I have also tried to ignore privacy settings but it worked only on Power BI desktop. I have still the errors when refreshing online.

 

I hope someone can help me.

Here is my code. I have kind of anonymised it, I hope there is no typo. But it is working fine if I replace the query with a fixed list or if I ignore the privacy setting.

listingItems query:

let
    myTable = Table.Distinct( Table.SelectColumns(otherTable, { "key", "filteringValue"})),
    filteredSource = Table.SelectRows(myTable , each ([filteringValue] = "KEYWORD")),
    myList = filteredSource[key]
in
    myList 

 

apiCall query:

let
    //calling a another query instead of creating the list here:
    myItemList = listingItems 
   
	// function to do one call per item
    FnGetOneItem = (itemId) as table =>
		let
			myKey = "xxx",
			pageLimit = 2,          
			myPageSize= 2,
			order = "-modificationDate",
			
			HTTPHeader = [RelativePath = itemId & "/query", Query = [pageSize = Number.ToText(myPageSize), page = Number.ToText(pageId), sort = order], Headers = [#"Ocp-Apim-Subscription-Key" = apimKey ]],
			Source = Json.Document(Web.Contents("https://url.com", HTTPHeader)),
			values = try Source[values] otherwise null,
			results = [Values=values]
		in
			results,

        data = List.Generate(
            () => [pageId=1, result = FnGetOnePage(pageId)],
            each [pageId]<= pageLimit and [result][Values] <> {},
            each [pageId=[pageId]+1, url=urlroot & Number.ToText(pageId), result = [result] & FnGetOnePage(pageId) ]
        ),

        output = Table.FromRecords(data)
    in output,

    Source = List.Generate(
        () => [position=0, storeId = myItemList{position}, outputTable = FnGetOneItem(myItemList{position})],
        each [position] < List.Count(myItemList),
        each [position=[position]+1, storeId = myItemList{position}, outputTable = FnGetOneItem(myItemList{position})]
    ),

    Final = Table.FromRecords(Source)
in
    Final 

 

Thank you in advance for any help.

Brice

9 Replies

  • camargos88's avatar
    camargos88
    Community Champion

    Hi Brice_LE-LANN ,

     

    Try writing the code in only one query. I had the same problem few weeks ago and it worked for me.

    You can create a function to call the API, but handle the tables together.

     

    Avoid code like:

    myTable = Table.Distinct( Table.SelectColumns(otherTable, { "key", "filteringValue"})),

    or

     

     myItemList = listingItems 

    It's passing the tables/list from others queries, write them together. 

    • Brice_LE-LANN's avatar
      Brice_LE-LANN
      Regular Visitor

      Hi camargos88 

       

      thanks for the reply, much appreciated.

      I have tried to put it in one query but it gave me the same output.

      let
          //creating my list in one query:
          myItemList = Table.SelectRows(Table.Distinct( Table.SelectColumns(otherTable, { "key", "filteringValue"})), each ([filteringValue] = "KEYWORD"))[key], 
         
      	// function to do one call per item
          FnGetOneItem = (itemId) as table =>
      		let
      			myKey = "xxx",
      			pageLimit = 2,          
      			myPageSize= 2,
      			order = "-modificationDate",
      			
      			HTTPHeader = [RelativePath = itemId & "/query", Query = [pageSize = Number.ToText(myPageSize), page = Number.ToText(pageId), sort = order], Headers = [#"Ocp-Apim-Subscription-Key" = apimKey ]],
      			Source = Json.Document(Web.Contents("https://url.com", HTTPHeader)),
      			values = try Source[values] otherwise null,
      			results = [Values=values]
      		in
      			results,
      
              data = List.Generate(
                  () => [pageId=1, result = FnGetOnePage(pageId)],
                  each [pageId]<= pageLimit and [result][Values] <> {},
                  each [pageId=[pageId]+1, url=urlroot & Number.ToText(pageId), result = [result] & FnGetOnePage(pageId) ]
              ),
      
              output = Table.FromRecords(data)
          in output,
      
          Source = List.Generate(
              () => [position=0, storeId = myItemList{position}, outputTable = FnGetOneItem(myItemList{position})],
              each [position] < List.Count(myItemList),
              each [position=[position]+1, storeId = myItemList{position}, outputTable = FnGetOneItem(myItemList{position})]
          ),
      
          Final = Table.FromRecords(Source)
      in
          Final 

      Thank you again, and if you have any idea, I'll take it

      • camargos88's avatar
        camargos88
        Community Champion

        Brice_LE-LANN ,

         

        Try changing this part:

         

         myItemList = Table.SelectRows(Table.Distinct( Table.SelectColumns(otherTable, { "key", "filteringValue"})), each ([filteringValue] = "KEYWORD"))[key], 

         

        It receives other table "otherTable", try querying this table in the same query as well.