I have a canvas app with two galleries. When a user name column is clicked in gallery 1, it sets the visibility of gallery 2 to true and updates the items in the gallery per a complex formula. Since the formula is lengthy, it can take a few seconds to update gallery 2. Therefore I need to add a preloader to gallery 2 but I'm not sure how I would determine when the new data is loaded (old data remains visible while formula executes. There are 2 variables (varDealTableSelUser & varDealTableRole) used in gallery 2 that contribute to the delays in updating gallery 2.
// Gallery 1 - OnSelect (user name)
Set( varDealTableVis, true );
Set( varDealTableSelUser, ThisItem.Assigned_x002d_Full_x002d_Name );
Set( varDealTableRole, "Bid Manager");
// Gallery 2 - Items
Sort(
With(
{
wManagers:
With(
{
wActiveDI:
AddColumns(
ShowColumns(
'Deal-Intake-App',
"Title",
"Close_x002d_Date",
"SFDC_x002d_Opp_x002d_Name",
"SFDC_x002d_Opp_x002d_ID"
),
"Active",
If(
Close_x002d_Date > Today(),
"Yes",
"No"
)
),
wBidMgrs:
ShowColumns(
Filter(
'Assigned-Users',
Role_x002d_Assigned = varDealTableRole
),
"Deal_x002d_Request_x002d_ID",
"Assigned_x002d_Full_x002d_Name",
"Role_x002d_Assigned"
)
},
AddColumns(
ShowColumns(
wBidMgrs,
"Deal_x002d_Request_x002d_ID",
"Assigned_x002d_Full_x002d_Name"
),
"Active",
If(
LookUp(
wActiveDI,
Title = Deal_x002d_Request_x002d_ID,
Close_x002d_Date
) > Today(),
"Yes",
"No"
)
)
)
},
// NEW SECTION [Active="Yes" && Assigned_x002d_Full_x002d_Name = varDealTableSelUser]
AddColumns(
Filter(
wManagers,
If( !toggleView, Active="Yes" && Assigned_x002d_Full_x002d_Name = varDealTableSelUser, Assigned_x002d_Full_x002d_Name = varDealTableSelUser)
//Assigned_x002d_Full_x002d_Name = varDealTableSelUser
),
"daCloseDate", LookUp('Deal-Intake-App', 'DI-ID' = Deal_x002d_Request_x002d_ID, Close_x002d_Date),
"dealName", LookUp('Deal-Intake-App', 'DI-ID' = Deal_x002d_Request_x002d_ID, SFDC_x002d_Opp_x002d_Name),
"oppID", LookUp('Deal-Intake-App', 'DI-ID' = Deal_x002d_Request_x002d_ID, SFDC_x002d_Opp_x002d_ID)
)
), daCloseDate, Ascending)
Gallery 1 (right) displays users and their number of active deals. When a name is clicked in gallery 1, gallery 2 (left) displays the active deals for the selected user (see screen shots below). How can I detect when gallery 2 has been updated/reloaded after the user clicks a name in gallery 1?
@Anonymous
Your Gallery2 Items formula is over-complex and needs not be so much data activity. For example, you are using the ShowColumns function in your formula that will just slow down your formula evaluation. Unless you have a very specific need to only show certain columns (this is not one), then you should avoid it. If you have thought that using ShowColumns would make you app faster because it is only "getting" those columns, this is a misunderstanding. PowerApps will still gather ALL of the columns of a table to then feed to a ShowColumns function to shape the data table to only have those columns. So, you're already getting all the columns and then taking time to remove/show only certain columns. It's not needed.
Also, in your formula, you are performing three lookups on the same 'Deal-Intake-App' data source. This is another area of slow down. What should be done is to gather the record once in the formula and then reference the columns you want. This IS a good place for a ShowColumns (potentially).
To combine the above concepts, your formula can become the following:
Sort(
With(
{wManagers:
With({wActiveDI: AddColumns('Deal-Intake-App', "Active", If(Close_x002d_Date > Today(), "Yes", "No")),
wBidMgrs: Filter('Assigned-Users', Role_x002d_Assigned = varDealTableRole)
},
AddColumns( wBidMgrs, "Active", If(LookUp(wActiveDI, Title = Deal_x002d_Request_x002d_ID, Close_x002d_Date) > Today(), "Yes", "No"))
)
},
// NEW SECTION [Active="Yes" && Assigned_x002d_Full_x002d_Name = varDealTableSelUser]
ForAll(
Filter(
wManagers,
(!toggleView && Active="Yes" && Assigned_x002d_Full_x002d_Name = varDealTableSelUser) ||
(toggleView && Assigned_x002d_Full_x002d_Name = varDealTableSelUser)
//Assigned_x002d_Full_x002d_Name = varDealTableSelUser
) As _item,
Patch(_item, LookUp(ShowColumns('Deal-Intake-App', "Close_x002d_Date", "SFDC_x002d_Opp_x002d_Name", "SFDC_x002d_Opp_x002d_ID", "DI-ID"), 'DI-ID' = _item.Deal_x002d_Request_x002d_ID)
)
),
Close_x002d_Date
)
Note, the three added columns will now be the original column names from the 'Deal-Intake-App' table rather than the names you had. Unless there is a particular reason to rename the columns with the AddColumns you had, I would avoid it as it is only adding more time to your formula and more work for you.
Beyond the performance on the Items filter itself, the only way to make sure the second gallery has all of its information is to provide it all to it.
This would involve looking at your first gallery items property and incorporating the second into the first. This way your second gallery would only be referring to the records associated with the first gallery selection based on the formula above that would be in it.
I hope this is helpful for you.
@RandyHayes - Thanks for the streamlined formula. Unfortunately, it has some errors and I have working code and I need to tackle the gallery preloader issue.
Regarding this suggestion: "Beyond the performance on the Items filter itself, the only way to make sure the second gallery has all of its information is to provide it all to it. This would involve looking at your first gallery items property and incorporating the second into the first. This way your second gallery would only be referring to the records associated with the first gallery selection based on the formula above that would be in it."
I think I need to clarify the issue.
As a result, the data is different between the two galleries. When a user name column is clicked in gallery 1, it sets the visibility of gallery 2 to true and updates the items in the gallery per a complex formula that relies on 2 vars that change each time you click a new name in gallery 1. How would I determine when the new data is loaded (old data remains visible while formula executes)? Perhaps a collection could be updated after a name is selected in gallery 1 but how would I detect that new data has been added to the collection?
@Anonymous
There is no gallery pre-loader, so you need to work out the issues with the formula in it. I suggested how to make it more streamlined for performance, so I would try to figure out the issues with it and correct. Even though you have a working formula, it is causing you issues.
A collection is not going to do anything more than slow down your app even more as you will just be duplicating information you already have.
The solution to resolve this is to gather the information IN the first Gallery. You are doing more "formula" than you need to and it is causing what you are seeing. I would incorporate the entire formula together. You will take a little more of a performance hit in the initial screen load, but your performance with the second gallery will be instantaneous.
You cannot detect the type of things you are thinking about detecting, so the best answer is to have the data already at hand, then there absolutely no delays.
If you can give me more information about the first gallery Items property, perhaps I can suggest some ways to combine this successfully and get you what you need.
Thanks @RandyHayes for the detailed response. I was planning on using a preloader component but as you said there is no way to detect a gallery reload. Here is the code for both galleries. It took a long time with some help from a forum member to get working code so here it is. I'm very interested in your alternate approach to improve performance and loading times.
// Gallery 1 Items
Sort(
With(
{
wManagers:
With(
{
wActiveDI:
AddColumns(
ShowColumns(
'Deal-Intake-App',
"Title",
"Close_x002d_Date",
"SFDC_x002d_Opp_x002d_Name",
"SFDC_x002d_Opp_x002d_ID"
),
"Active",
If(
Close_x002d_Date > Today(),
"Yes",
"No"
)
),
wBidMgrs:
ShowColumns(
Filter(
'Assigned-Users',
Role_x002d_Assigned = "Bid Manager"
),
"Deal_x002d_Request_x002d_ID",
"Assigned_x002d_Full_x002d_Name",
"Role_x002d_Assigned"
)
},
AddColumns(
ShowColumns(
wBidMgrs,
"Deal_x002d_Request_x002d_ID",
"Assigned_x002d_Full_x002d_Name"
),
"Active",
If(
LookUp(
wActiveDI,
Title = Deal_x002d_Request_x002d_ID,
Close_x002d_Date
) > Today(),
"Yes",
"No"
)
)
)
},
AddColumns(
GroupBy(
Filter(
wManagers,
Active="Yes"
),
"Assigned_x002d_Full_x002d_Name",
"OtherData"
),
"BidsDone",
CountRows(OtherData)
)
), Assigned_x002d_Full_x002d_Name, Ascending)
// Gallery 2 Items
Sort(
With(
{
wManagers:
With(
{
wActiveDI:
AddColumns(
ShowColumns(
'Deal-Intake-App',
"Title",
"Close_x002d_Date",
"SFDC_x002d_Opp_x002d_Name",
"SFDC_x002d_Opp_x002d_ID"
),
"Active",
If(
Close_x002d_Date > Today(),
"Yes",
"No"
)
),
wBidMgrs:
ShowColumns(
Filter(
'Assigned-Users',
Role_x002d_Assigned = varDealTableRole
),
"Deal_x002d_Request_x002d_ID",
"Assigned_x002d_Full_x002d_Name",
"Role_x002d_Assigned"
)
},
AddColumns(
ShowColumns(
wBidMgrs,
"Deal_x002d_Request_x002d_ID",
"Assigned_x002d_Full_x002d_Name"
),
"Active",
If(
LookUp(
wActiveDI,
Title = Deal_x002d_Request_x002d_ID,
Close_x002d_Date
) > Today(),
"Yes",
"No"
)
)
)
},
// NEW SECTION [Active="Yes" && Assigned_x002d_Full_x002d_Name = varDealTableSelUser]
AddColumns(
Filter(
wManagers,
If( !toggleView, Active="Yes" && Assigned_x002d_Full_x002d_Name = varDealTableSelUser, Assigned_x002d_Full_x002d_Name = varDealTableSelUser)
//Assigned_x002d_Full_x002d_Name = varDealTableSelUser
),
"daCloseDate", LookUp('Deal-Intake-App', 'DI-ID' = Deal_x002d_Request_x002d_ID, Close_x002d_Date),
"dealName", LookUp('Deal-Intake-App', 'DI-ID' = Deal_x002d_Request_x002d_ID, SFDC_x002d_Opp_x002d_Name),
"oppID", LookUp('Deal-Intake-App', 'DI-ID' = Deal_x002d_Request_x002d_ID, SFDC_x002d_Opp_x002d_ID)
)
), daCloseDate, Ascending)
@Anonymous
As I had kind of imagined from your prior posts. You are Grouping by the same data for Gallery1 and then completely discarding the value of the "OtherData" records.
Essentially what you are doing in these formulas is to create a wActiveDI variable with a shaped record table from 'Deal-Intake-App' and an added column called Active (that is never used anywhere else in your formula).
Then you are shaping the Assigned-Users table records based on a filter by Role assigned into a vBidMgrs variable.
Finally, you are creating a table for vManagers that is the based on a data shape of the vBidMgrs table and adding a column based on the lookup into the wActiveDI table based on the Title to determine if it is active (which you already did once in the wActiveDI and never used).
Finally, you are grouping that data on a filter of the vManagers table where active is yes and are grouping by the Assigned Full Name. All of the Matching records are in the column OtherData - which you never use again except to count the rows for an added column.
THEN - in your Gallery2, you are doing the exact same process over again except refining by the grouped information...you already have it in the OtherData column!!
So, yes, you are taking some very big performance hits doing it this way.
Here is my suggestion:
Gallery1 Items property:
Sort(
AddColumns(
GroupBy(
ForAll(
Filter('Assigned-Users', Role_x002d_Assigned = "Bid Manager") As _item,
Patch(_item,
With(LookUp('Deal-Intake-App', Title = Deal_x002d_Request_x002d_ID),
{daCloseDate: Close_x002d_Date,
dealName: Deal_x002d_Request_x002d_ID, SFDC_x002d_Opp_x002d_Name,
oopID: SFDC_x002d_Opp_x002d_ID,
Active: Close_x002d_Date > Today()
}
)
)
),
"Assigned_x002d_Full_x002d_Name",
"OtherData"
),
"BidsDone", CountRows(OtherData)
),
Assigned_x002d_Full_x002d_Name
)
Gallery1 OnSelect action formula:
Set( varDealTableVis, true);
Really don't need this unless there is a reason to make the gallery visible or not.
Gallery2 Items property:
Filter(Gallery1.Selected.OtherData,
(!toggleView && Active) || toggleView
)
Keep in mind that I have typed all of the above formulas free-hand, so there might be some syntax issues that I am not noticing. But the concept of the above should give you what you want and you will have NO delay in the second gallery.
@RandyHayes - Thanks for the detailed code and explanation. I know I reused a lot of code but I was up against a deadline and needed an immediate solution. Your solution omits one important thing: the bottom table relies on a specific user being present in the query (done by setting a var 'varDealTableSelUser' when a user is selected in the top table) since the bottom table is user-specific. Role is also passed to the bottom table vis the via 'varDealTableRole'. This is because the bottom table has to work for all roles and I am displaying the role above the gallery as a header. Here is what the Resource Dashboard page looks like.
@Anonymous
So the bottom gallery (I assume that is the one we've been calling Gallery 2) is accounted for in the Items of Gallery1.
You are grouping by the Assigned Full Name. So, all the records in the OtherData column will be only pertaining to that user.
Before you were doing another filter of that name in the Gallery2 items. There is no need for that with this formula because the GroupBy has already done that for us in the OtherData column records.
So, the Gallery 2 items just references that selected record and the OtherData column...it is only for that user selected.
As for the Role, you were setting that to "Bid Manager" in your original. This is accounted for in the Gallery1 Items already.
What am I missing?
There are many other roles in the other utilization galleries. I need to pass the role info because the bottom table has to work for all roles and I am displaying the role above the gallery as a header. Does that answer your question?
@Anonymous
Yes, but I guess what I am saying is that, based on the formulas you sent me, the only role filtering you did was for the Bid Manager. So, since I don't know the intricacies of your app, I can only go by what I saw in the formulas.
So, I'm not sure exactly what you're trying to do with the roles. Perhaps we need to explore what you are doing in the other galleries?
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!
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
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.
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