Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Anonymous
Not applicable

Recursive functions in dataflows

Hi,

 

Has anyone tried writing recursive functions in dataflows. I was just moving a dataset into a dataflow and what works fine as a dataset complains about cyclic reference being created.

 

Recursive functions are quite handy when dealing with hierarchical data structures so would be a shame if they don't work in data flows.

1 ACCEPTED SOLUTION

I Struggled with this for a while as well.  It seems the solution is as simple as using an @ sign.

This is an example my coworker wrote.

let
  f = (n as number) as number => if n = 0 then 0 else if n = 1 then 1 else @f(n - 2) + @f(n - 1)
in
  f

I've tested it and it works in dataflows.  Note, when you make the recusive call, be sure to reference the name of the function from inside the let.  For example, say the external name for this is 'fib', you need to make the recursive call with @f(..).  I hope this helps!

 

Edit:

This is addressed on page 28 of the reference manual.

https://docs.microsoft.com/en-us/powerquery-m/power-query-m-language-specification

View solution in original post

5 REPLIES 5
luisrh
Responsive Resident
Responsive Resident

Are you doing this in M?    This is a functional language and the issue may be related to tail code optimization that most functional languages do.   I don't know whether the M compiler does that,  but more than likely the answer is somewhere in how this works.     Perhaps you can use functions and external code exposed to do some of this.   We have had to do that in some of our use cases.

 

Good luck.

Anonymous
Not applicable

Hi Yep doing it in M with functions. These are working fine in Power BI desktop and when published to the service as a dataset. But in data flows just no luck. Maybe I need to rewrite the functions.

Thanks!

I Struggled with this for a while as well.  It seems the solution is as simple as using an @ sign.

This is an example my coworker wrote.

let
  f = (n as number) as number => if n = 0 then 0 else if n = 1 then 1 else @f(n - 2) + @f(n - 1)
in
  f

I've tested it and it works in dataflows.  Note, when you make the recusive call, be sure to reference the name of the function from inside the let.  For example, say the external name for this is 'fib', you need to make the recursive call with @f(..).  I hope this helps!

 

Edit:

This is addressed on page 28 of the reference manual.

https://docs.microsoft.com/en-us/powerquery-m/power-query-m-language-specification

Assigning the function to a "variable" in the current "let scope" certainly fixed it for me.  If I use the "@" in the Dataflow editor, it throws a warning, which disapears and everything works fine in the editor, if I remove the "@".  But, then the refresh fails.  Adding the "@" back in and ignoring the warning in the editor fixed the problem.

Anonymous
Not applicable

Thanks for that. Very handy. I shall go and have a look at the reference manual and find out what the @ sign is all about. Not comes across that before.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors
Top Kudoed Authors