Hi all,
In my application, users store a long list of data among some of which are price, "Proposal Status (Template, Active, Closed-Won, Closed-Lost), Due-Date etc.
Each user sees only the data that he/she has provided by using the User().Email function.
I am trying to find a way to showcase a variety of graphs:
1. A graph that shows 3 things
1) Projects With "Active" as proposal Status AND 1 Day Due Date
2) Projects With "Active" as proposal Status AND Exceeded Due Date
3) Projects With "Active" as proposal Status AND OTHERS
2. Numerical and dollars term value of
1) Projects with "Closed - Won"
2) Projects with "Closed - Lost"
Among others.
I would like to ask you experts whether this is even possible in PowerApps?
Initially I wanted to do this through Power BI, however, due to the many users and the costs connected with a premium version it is unfortunately not possible.
Solved! Go to Solution.
Hi @Anonymous! What you are proposing is definitely possible, though the charts in Power Apps can be a bit basic. If you are used to something like Power BI or Excel, you may find that the customization and design are pretty limited. That said, there are creative things you can do using other types of controls. @WonderLaura posted a blog that details one method of using a gallery to do this. (She also covers the Power BI and built-in charts as well.) You could also use shapes outside of a gallery or SVGs to do similar things. Here is a nice SVG example.
To create a simple column chart using the built-in column chart, you would want to create a collection of the categories you want and the totals of said categories. This can be done fairly easily if you have a simple way to count and define the items. From what you describe, it sounds like this might be one way you could approach it:
/* Note: This could go in the OnVisible property of the screen these charts are on or a loading screen, etc. */
/* Set a global variable for today's date so the Today() function doesn't have to run but once */
Set(TodaysDate, Today());
/* Collect a table for the chart containing the category titles and counts of items that align with those categories */
ClearCollect(
colActiveStatusChart,
{ID: 1, Title: "1 Day Due Date", Amount: CountIf(DataList, ProposalStatus = "Active" && (DateDiff(Due-Date, TodaysDate, Days) = 1)},
{ID: 2, Title: "Exceeded Due Date", Amount: CountIf(DataList, ProposalStatus = "Active" && DateDiff(Due-Date, TodaysDate, Days) >= 0)},
{ID: 3, Title: "Others", Amount: CountIf(DataList, ProposalStatus = "Active" && DateDiff(Due-Date, TodaysDate, Days) < 1)}
)
In the column chart, you would set the Items property to colActiveStatusChart and then set the Labels value to Title and the Series1 value to Amount. This specific approach will probably need to be modified but, hopefully, it gives a reasonable view of how to start.
Some notes: I always add an ID field as a way to give a custom sorting method. In the Items section of the column chart control, you can put
/* Sort the chart Items by ID */
Sort(
colActiveStatusChart,
ID,
Ascending
)
(or something similar), which along with changing the IDs as needed will make the categories appear as you want them to. Also, having short titles is best as the only control you have over the axis titles is font size and the angle they sit at.
As far as the numerical and dollars term values mentioned, you can use a text label and the CountIf or Sum functions along with some filtering to produce what you need. Maybe something like:
/* Count of projects with Closed - Won proposal status */
CountIf(
DataList,
ProposalStatus = "Closed - Won"
)
/* Sum of dollar term values for projects with Closed - Won proposal status */
Sum(
Filter(
colData,
Proposal = "Closed - Won"
),
DollarTermValue
)
Along with some clever formatting, you can make these items look quite nice and add some conditional formatting to them (like having the text for the counts and sums above turn red if they hit a certain amount and green if they hit another using the Color property).
I hope that gets you going in a good direction but if I can elaborate more or help with specific details, feel free to let me know!
Regarding the chart, I think you will need to set the SeriesAxisMin property to 0. The charts default to a blank/auto setting, which scales it on its own.
On the date filtering and summations, great job figuring out the date filter! Regarding the blank labels, I would suspect that the issue could be that the date pickers are blank or that there is a delegation issue. I primarily work with SQL, so I'm not super strong on the specifics of SharePoint delegation but after a quick look at the documentation it appears that dates aren't delegable, so a collection would be the best way to circumvent that. Another possible method is to add a column where the date is in a number format like "yyyymmdd". So today would be 20200213. You can then treat the dates like numbers, which is much easier on the sorting side. Of course, you then have to write both the date and the numerical version of the date each time a date is changed/written. I use this method fairly often because dates aren't delegable in SQL either. If you would like more info on that, let me know.
If you use a collection, you would probably want to only filter by the user and Outcome so that the maximum number of items are pulled in. If the number of filtered items is 500 or less per user, this shouldn't cause any issues. If you anticipate it being higher, you can go into the Advanced settings (File -> Settings -> Advanced settings) and set the "Data row limit for non-delegable queries" to a higher number. It can go as high as 2000. You also may want to try sorting so that the most recent items are first (in case older data isn't necessary or optional). Here are some examples with and without the sorting:
/* With sorting */
ClearCollect(
colBorusanMainTable,
Filter(
Sort(
'Borusan Main Table',
'Teklifin Son Gecerlilik Tarihi',
Descending
),
'Creator Email'=VarUser.Email,
Outcome = "Won"
)
)
/* Without sorting */
ClearCollect(
colBorusanMainTable,
Filter(
'Borusan Main Table',
'Creator Email'=VarUser.Email,
Outcome = "Won"
)
)
One note on this: the order of filtering and sorting does matter. Inner functions run before outer functions, so in the case of the one with the sort, it will sort the list first and then filter it. If you filter and then sort, there may be newer items missing if they are outside of the 500 item limit (or whatever limit you set). Just something to keep in mind. Also, in general, I like to use collections as they give a pretty good performance boost when doing things like dynamic filters. Rather than fetching from SharePoint every time the user changes the filter, it fetches locally. Definitely test and see what works best for you though.
On to the next part! If the date pickers are blank, the filter looks for a literal blank date so a little trickery is in order. The best way I have found is to check if the date picker has a value and, if it does, filter by the selected date. If it doesn't, return a true value to bypass that part of the filter. Here is what that might look like:
/* Using the collection above */
Sum(
Filter(
colBorusanMainTable,
'Teklifin Son Gecerlilik Tarihi' >= StartDateGraph.SelectedDate || StartDateGraph.SelectedDate = Blank(),
'Teklifin Son Gecerlilik Tarihi' <= EndDateGraph.SelectedDate || EndDateGraph.SelectedDate = Blank()
),
'Toptan Satis Fiyati'
)
And one thought on the collection you showed: while the date picker issue might be a factor in it being blank, another issue you will have to contend with is that the collection will need to be re-collected when the user changes the date range. Otherwise, the data will remain the same. This is an issue with collections in general, so if your data has a high change rate you may need to directly pull the data or have a way for the user to update the data. If the data doesn't change much, collecting once and filtering the collection would work.
Let me know if these suggestions help or not!
*Edit: I removed the non-collection version of the code due to dates not being delegable. It wouldn't work!*
*Another edit for forgotten words. I think I got them all this time! 😁*
Hi @Anonymous! What you are proposing is definitely possible, though the charts in Power Apps can be a bit basic. If you are used to something like Power BI or Excel, you may find that the customization and design are pretty limited. That said, there are creative things you can do using other types of controls. @WonderLaura posted a blog that details one method of using a gallery to do this. (She also covers the Power BI and built-in charts as well.) You could also use shapes outside of a gallery or SVGs to do similar things. Here is a nice SVG example.
To create a simple column chart using the built-in column chart, you would want to create a collection of the categories you want and the totals of said categories. This can be done fairly easily if you have a simple way to count and define the items. From what you describe, it sounds like this might be one way you could approach it:
/* Note: This could go in the OnVisible property of the screen these charts are on or a loading screen, etc. */
/* Set a global variable for today's date so the Today() function doesn't have to run but once */
Set(TodaysDate, Today());
/* Collect a table for the chart containing the category titles and counts of items that align with those categories */
ClearCollect(
colActiveStatusChart,
{ID: 1, Title: "1 Day Due Date", Amount: CountIf(DataList, ProposalStatus = "Active" && (DateDiff(Due-Date, TodaysDate, Days) = 1)},
{ID: 2, Title: "Exceeded Due Date", Amount: CountIf(DataList, ProposalStatus = "Active" && DateDiff(Due-Date, TodaysDate, Days) >= 0)},
{ID: 3, Title: "Others", Amount: CountIf(DataList, ProposalStatus = "Active" && DateDiff(Due-Date, TodaysDate, Days) < 1)}
)
In the column chart, you would set the Items property to colActiveStatusChart and then set the Labels value to Title and the Series1 value to Amount. This specific approach will probably need to be modified but, hopefully, it gives a reasonable view of how to start.
Some notes: I always add an ID field as a way to give a custom sorting method. In the Items section of the column chart control, you can put
/* Sort the chart Items by ID */
Sort(
colActiveStatusChart,
ID,
Ascending
)
(or something similar), which along with changing the IDs as needed will make the categories appear as you want them to. Also, having short titles is best as the only control you have over the axis titles is font size and the angle they sit at.
As far as the numerical and dollars term values mentioned, you can use a text label and the CountIf or Sum functions along with some filtering to produce what you need. Maybe something like:
/* Count of projects with Closed - Won proposal status */
CountIf(
DataList,
ProposalStatus = "Closed - Won"
)
/* Sum of dollar term values for projects with Closed - Won proposal status */
Sum(
Filter(
colData,
Proposal = "Closed - Won"
),
DollarTermValue
)
Along with some clever formatting, you can make these items look quite nice and add some conditional formatting to them (like having the text for the counts and sums above turn red if they hit a certain amount and green if they hit another using the Color property).
I hope that gets you going in a good direction but if I can elaborate more or help with specific details, feel free to let me know!
Thank you very much for this very detailed post. I have a lot to get started with. If I could give me than a single up-vote I would. Allow me to keep this thread open as I will probably have some questions once I get into the technicalities.
Hi Wyotim,
with your excellent guide, I am already able to create a few different graphs. Now I have a question. I have been trying to change the visuals of this graph. Unfortunately, the way this graph is portrayed is slightly misleading as the difference between 7 and 8 seems way larger, is there a way to change this?
I figured out how to filter by date 🙂
I am, however, struggling with the Sum() function. I cannot seem to connect the data with graphs nor labels. I have tried the approach you suggested with setting up a label like this:
Sum(Filter('Borusan Main Table',('Creator Email'=VarUser.Email),(Outcome = "Won"), (('Teklifin Son Gecerlilik Tarihi' >= StartDateGraph.SelectedDate) && ('Teklifin Son Gecerlilik Tarihi' <= EndDateGraph.SelectedDate))),'Toptan Satis Fiyati')
So in the filter I want to only see the revenue where projects are filtered by: "Won", within the time period chosen between two datepickers.
But this brings me a blank label. It also seems to be delegable, is there any way to get around this using SharePoint? I guess not?
I have also tried making a collection:
ClearCollect(
colWonAndLostSum,
{ID: 1, Title: "Won", Amount: Sum(Filter('Borusan Main Table',('Creator Email'=VarUser.Email),(Outcome = "Won"), (('Teklifin Son Gecerlilik Tarihi' >= StartDateGraph.SelectedDate) && ('Teklifin Son Gecerlilik Tarihi' <= EndDateGraph.SelectedDate))),'Toptan Satis Fiyati')},
{ID: 2, Title: "Lost", Amount: Sum(Filter('Borusan Main Table',('Creator Email'=VarUser.Email),(Outcome = "Won"), (('Teklifin Son Gecerlilik Tarihi' >= StartDateGraph.SelectedDate) && ('Teklifin Son Gecerlilik Tarihi' <= EndDateGraph.SelectedDate))),'Toptan Satis Fiyati')}
)
Same filtering method as above, with both the Won and Lost revenue.
Regarding the chart, I think you will need to set the SeriesAxisMin property to 0. The charts default to a blank/auto setting, which scales it on its own.
On the date filtering and summations, great job figuring out the date filter! Regarding the blank labels, I would suspect that the issue could be that the date pickers are blank or that there is a delegation issue. I primarily work with SQL, so I'm not super strong on the specifics of SharePoint delegation but after a quick look at the documentation it appears that dates aren't delegable, so a collection would be the best way to circumvent that. Another possible method is to add a column where the date is in a number format like "yyyymmdd". So today would be 20200213. You can then treat the dates like numbers, which is much easier on the sorting side. Of course, you then have to write both the date and the numerical version of the date each time a date is changed/written. I use this method fairly often because dates aren't delegable in SQL either. If you would like more info on that, let me know.
If you use a collection, you would probably want to only filter by the user and Outcome so that the maximum number of items are pulled in. If the number of filtered items is 500 or less per user, this shouldn't cause any issues. If you anticipate it being higher, you can go into the Advanced settings (File -> Settings -> Advanced settings) and set the "Data row limit for non-delegable queries" to a higher number. It can go as high as 2000. You also may want to try sorting so that the most recent items are first (in case older data isn't necessary or optional). Here are some examples with and without the sorting:
/* With sorting */
ClearCollect(
colBorusanMainTable,
Filter(
Sort(
'Borusan Main Table',
'Teklifin Son Gecerlilik Tarihi',
Descending
),
'Creator Email'=VarUser.Email,
Outcome = "Won"
)
)
/* Without sorting */
ClearCollect(
colBorusanMainTable,
Filter(
'Borusan Main Table',
'Creator Email'=VarUser.Email,
Outcome = "Won"
)
)
One note on this: the order of filtering and sorting does matter. Inner functions run before outer functions, so in the case of the one with the sort, it will sort the list first and then filter it. If you filter and then sort, there may be newer items missing if they are outside of the 500 item limit (or whatever limit you set). Just something to keep in mind. Also, in general, I like to use collections as they give a pretty good performance boost when doing things like dynamic filters. Rather than fetching from SharePoint every time the user changes the filter, it fetches locally. Definitely test and see what works best for you though.
On to the next part! If the date pickers are blank, the filter looks for a literal blank date so a little trickery is in order. The best way I have found is to check if the date picker has a value and, if it does, filter by the selected date. If it doesn't, return a true value to bypass that part of the filter. Here is what that might look like:
/* Using the collection above */
Sum(
Filter(
colBorusanMainTable,
'Teklifin Son Gecerlilik Tarihi' >= StartDateGraph.SelectedDate || StartDateGraph.SelectedDate = Blank(),
'Teklifin Son Gecerlilik Tarihi' <= EndDateGraph.SelectedDate || EndDateGraph.SelectedDate = Blank()
),
'Toptan Satis Fiyati'
)
And one thought on the collection you showed: while the date picker issue might be a factor in it being blank, another issue you will have to contend with is that the collection will need to be re-collected when the user changes the date range. Otherwise, the data will remain the same. This is an issue with collections in general, so if your data has a high change rate you may need to directly pull the data or have a way for the user to update the data. If the data doesn't change much, collecting once and filtering the collection would work.
Let me know if these suggestions help or not!
*Edit: I removed the non-collection version of the code due to dates not being delegable. It wouldn't work!*
*Another edit for forgotten words. I think I got them all this time! 😁*
Thank you very much for the extremely detailed responses and help during this thread.
If I could give more than an upvote and "Accept as Solution" I certainly would. Hopefully this thread can be a help to other people standing with the same challenge as I did.
Everything is simmingly working as intended now. Hopefully it will stay that way 🙂
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