cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anonymous
Not applicable

Common Data Model entity with Lookup Field

I have two entities, Site and Phase. Both have a "Number Sequence" field with a prefix that is configured as the "Title" field. The Phase entity has a Lookup field called ParentSite that is linked to the Site entity.

 

In my PowerApp I have a connection to my CDM and the two entities detailed above. I have a Gallery control that has it's Items property set to  the "Site" entity and another Gallery control with the following formula on Items Filter(Phase, SiteGallery.Selected.SiteId = ParentSite.SiteId)

 

The = operator and the ParentSite.SiteId are underlined in blue with the following messsage.

 

Suggestion: Part of this filter formula cannot be evaluated due to service limitations. The local evaluation may produce suboptimal or partial results. If possible, please simplify the formula. For more information, please see the Filter function documentation.

 

What would be the better suggested way of doing this?

1 ACCEPTED SOLUTION

Accepted Solutions

@rgruian is correct. If you bring down Filter to one condition, it will compute.

 

However, it will still have scrolling dots at the top for every instance of those filters--which can tax you to 10GB of RAM usage as I have encountered when migrating. 

 

I have a crazy work around, but it gets the job done. Some of it is detailed here, but it is outdated since I have reworked some of its code.

 

Here's the gist of it:

  1. Knowing that PA can only return 500 records at a time from a Filter, create a column in your entity that identifies which block of 500 each record belongs to (1st 500, 2nd 500, 3rd 500, etc.). Set the type to Number.

  2. Use a repeating Timer to Collect the nth block of 500 records each time the timer ends. From here you will operate on a temporary collection rather than the original datasource--this could be a deal breaker in many situations.
  3. When writing back to the datasource, you will need to write to the temporary collection as well.

 

 

This code is based on @hpkeong's repeating timer idea.

How to pull in temporary data:

Screen.OnVisible: 

UpdateContext({getdata: true, iter: 0})

 

Timer.OnTimerEnd:
If(getdata, If(!IsEmpty(Filter(MyDataSource,n=iter+1)), UpdateContext({iter: iter+1}); Collect(MyTemporaryCollection, Filter(MyDataSource, n=Value(iter))), UpdateContext({getdata: false}) )

 

 

How to write new data:

Button.OnSelect:

UpdateContext({temp:
Patch(MyDataSource,Defaults(MyDataSource),
{[your columns here, except n]})
});

Collect(MyDataSource_1,
Patch(MyDataSource,temp,
{n: RoundDown(Value(Right(temp.Title,10))/500,0)+1})
)

How to update existing data

Button.OnSelect:

UpdateContext({temp:
Patch(MyDataSource,First(Filter(MyDataSource,[conditions to recall existing record])),
{[your columns here, except n]})
});

UpdateIf(MyDataSource_1, Title=temp.Title,
Patch(MyDataSource,temp,
{n: RoundDown(Value(Right(temp.Title,10))/500,0)+1})

 

 

Here I use MyDataSource_1 just to remind myself that it's my temporary collection of the original. Once CDM can handle more conditions in its filter or once it can handle more than 500 records, then reverting is just a matter of deleting "_1." Switching is just a matter of adding "_1," so it's not too bad.

 

You will notice that Patching to the datasource happens twice every time. This is because you need to figure out the Title value before you can calculate which block of 500 it belongs to (n).

 

The only thing I haven't done is how to Remove a record since I have not needed it. 

 

So how long does loading take? 20-30s for 5 databases. I have a loading screen and I use buttons with rounded corners as a loading bar. This does not include the time it takes to open up PA, login, and wait for the splash screen to go away. As long as the app works, it works.

 

Edit:

Here's some more. Since you are working with temporary collections, you don't get the most up-to-date live data. You will need to build in Refresh. However, Refreshing changes to your temporary collection requires code, which you don't want to repeat everywhere since you would need to re-edit every spot. It is better to have the refresh code in one spot, then trigger it when needed.

 

My solution to this is to make the Timer mentioned above be able to start remotely. A Toggle on one screen can trigger things on another screen even if the Screen is not Active or Visible. 

  1. The Button makes Toggle1 true, then false (both are on the same screen).
  2. Toggle1 is detected by Toggle2, which activates the Timer to recollect.
Buton2.OnSelect: 
UpdateContext({resetdata: !resetdata});
UpdateContext({resetdata: !resetdata})

Toggle1.Reset: resetdata
Toggle1.Default: resetdata

Toggle2.Reset: Toggle1
Toggle2.Default: Toggle1
Toggle2.OnCheck:
Refresh(MyDataSource);
Clear(MyDataSource_1);
UpdateContext({getdata: true, iter: 0}) Timer.AutoStart: getdata Timer.Repeat: getdata Timer.Start: getdata

 

 

I am sharing this solution because I am dissatisfied with it. I am hoping someone could help shorten it or share a better one Please! 🙂

Microsoft Employee
@8bitclassroom

View solution in original post

4 REPLIES 4
rgruian
Power Apps
Power Apps

What that info message is saying is that your query cannot be evaluated on the server (where the CDM data lives) because it's making use of possibly-changing local app context (SiteGallery.Selected) at each evaluated row. It is also saying that due to this situation, the formula will be evaluated locally instead, which is nothing to worry about if your data is small. Large data, however, is capped at 500 rows, so a Filter operation will operate on that reduced set, and that is something to keep in mind.

 

If your app needs to operate on data that is >500 rows, you will need to rewrite the formula to make query delegation to the back end possible. That generally means simplifying the predicate in a Filter operation so that it does not draw values from entities that are subject to continuous dataflow -- controls, dynamic data sources such as Location or Acceleration, etc.

Radu Gruian [MSFT] ** PowerApps Staff

@rgruian is correct. If you bring down Filter to one condition, it will compute.

 

However, it will still have scrolling dots at the top for every instance of those filters--which can tax you to 10GB of RAM usage as I have encountered when migrating. 

 

I have a crazy work around, but it gets the job done. Some of it is detailed here, but it is outdated since I have reworked some of its code.

 

Here's the gist of it:

  1. Knowing that PA can only return 500 records at a time from a Filter, create a column in your entity that identifies which block of 500 each record belongs to (1st 500, 2nd 500, 3rd 500, etc.). Set the type to Number.

  2. Use a repeating Timer to Collect the nth block of 500 records each time the timer ends. From here you will operate on a temporary collection rather than the original datasource--this could be a deal breaker in many situations.
  3. When writing back to the datasource, you will need to write to the temporary collection as well.

 

 

This code is based on @hpkeong's repeating timer idea.

How to pull in temporary data:

Screen.OnVisible: 

UpdateContext({getdata: true, iter: 0})

 

Timer.OnTimerEnd:
If(getdata, If(!IsEmpty(Filter(MyDataSource,n=iter+1)), UpdateContext({iter: iter+1}); Collect(MyTemporaryCollection, Filter(MyDataSource, n=Value(iter))), UpdateContext({getdata: false}) )

 

 

How to write new data:

Button.OnSelect:

UpdateContext({temp:
Patch(MyDataSource,Defaults(MyDataSource),
{[your columns here, except n]})
});

Collect(MyDataSource_1,
Patch(MyDataSource,temp,
{n: RoundDown(Value(Right(temp.Title,10))/500,0)+1})
)

How to update existing data

Button.OnSelect:

UpdateContext({temp:
Patch(MyDataSource,First(Filter(MyDataSource,[conditions to recall existing record])),
{[your columns here, except n]})
});

UpdateIf(MyDataSource_1, Title=temp.Title,
Patch(MyDataSource,temp,
{n: RoundDown(Value(Right(temp.Title,10))/500,0)+1})

 

 

Here I use MyDataSource_1 just to remind myself that it's my temporary collection of the original. Once CDM can handle more conditions in its filter or once it can handle more than 500 records, then reverting is just a matter of deleting "_1." Switching is just a matter of adding "_1," so it's not too bad.

 

You will notice that Patching to the datasource happens twice every time. This is because you need to figure out the Title value before you can calculate which block of 500 it belongs to (n).

 

The only thing I haven't done is how to Remove a record since I have not needed it. 

 

So how long does loading take? 20-30s for 5 databases. I have a loading screen and I use buttons with rounded corners as a loading bar. This does not include the time it takes to open up PA, login, and wait for the splash screen to go away. As long as the app works, it works.

 

Edit:

Here's some more. Since you are working with temporary collections, you don't get the most up-to-date live data. You will need to build in Refresh. However, Refreshing changes to your temporary collection requires code, which you don't want to repeat everywhere since you would need to re-edit every spot. It is better to have the refresh code in one spot, then trigger it when needed.

 

My solution to this is to make the Timer mentioned above be able to start remotely. A Toggle on one screen can trigger things on another screen even if the Screen is not Active or Visible. 

  1. The Button makes Toggle1 true, then false (both are on the same screen).
  2. Toggle1 is detected by Toggle2, which activates the Timer to recollect.
Buton2.OnSelect: 
UpdateContext({resetdata: !resetdata});
UpdateContext({resetdata: !resetdata})

Toggle1.Reset: resetdata
Toggle1.Default: resetdata

Toggle2.Reset: Toggle1
Toggle2.Default: Toggle1
Toggle2.OnCheck:
Refresh(MyDataSource);
Clear(MyDataSource_1);
UpdateContext({getdata: true, iter: 0}) Timer.AutoStart: getdata Timer.Repeat: getdata Timer.Start: getdata

 

 

I am sharing this solution because I am dissatisfied with it. I am hoping someone could help shorten it or share a better one Please! 🙂

Microsoft Employee
@8bitclassroom

Hi Dang:

 

Congratulations for getting over the hurdle of 500 limitation, at least before PG remove the condition.

I will keep it for my ownself to achive the same thing.

 

Thanks a lot.

hpkeong
Anonymous
Not applicable

Thanks. Don't think we'll ever hot that limitation, but it's good to know there is a workaround.

Helpful resources

Announcements

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results | Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!   This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions in the Forums to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersNumber of SolutionsSuper UsersNumber of Solutions @anandm08  23 @WarrenBelz  31 @DBO_DV  10 @Amik  19 AmínAA 6 @mmbr1606  12 @rzuber  4 @happyume  7 @Giraldoj  3@ANB 6 (tie)   @SpongYe  6 (tie)     Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersSolutionsSuper UsersSolutions @anandm08  10@WarrenBelz 25 @DBO_DV  6@mmbr1606 14 @AmínAA 4 @Amik  12 @royg  3 @ANB  10 @AllanDeCastro  2 @SunilPashikanti  5 @Michaelfp  2 @FLMike  5 @eduardo_izzo  2   Meekou 2   @rzuber  2   @Velegandla  2     @PowerPlatform-P  2   @Micaiah  2     Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 3:Community MembersSolutionsSuper UsersSolutionsPower Apps anandm0861WarrenBelz86DBO_DV25Amik66Michaelfp13mmbr160647Giraldoj13FLMike31AmínAA13SpongYe27     Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 4:Community MembersSolutionsSuper UsersSolutionsPower Apps DBO-DV21WarranBelz26Giraldoj7mmbr160618Muzammmil_0695067Amik14samfawzi_acml6FLMike12tzuber6ANB8   SunilPashikanti8

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages