I feel like I'd solved this already. I had an app, there was something fundamentally wrong with it as no patches of columns from the gallery would work. I could patch a literal value, but was unable to patch any of the gallery fields which absolutely had data in them.
When I'd click a button on the page with the gallery to do the patch, if I examined any of the fields I was attempting to patch they were null within that gallery and I know this because I put them in a variable and they were null. So again, it would patch a literal value like "Hello there" to say a single line text field but it would not patch txtInputNotes which was the field name in the gallery. Nor txtInputNotes.Text nor txtInputNotes.Value. I tried every way possible but it wouldn't text anything but a literal in quotes.
I cut it down so bare that I finally gave up and thought I'd have to build a new gallery. duplicated the page, built new gallery from scratch (well it's a groupby situation so I built 2). I don't know if I can patch yet, just trying to finish the gallery to the point I had it before. Now this new gallery is not hiding the nested gallery items when the parent is not selected. I'm trying EVERYTHING. I checked a video to recall if I did something wrong and in the video the child gallery was hidden simply by putting an IsSelected in the Visible property. Sadly this isn't working for me either. I don't want to pound on this for days and days if there's something fundamentally wrong with this new set of galleries I'm creating. And since I never give up, I will waste days and days until I finally just give up and try again.
ANY suggestions are welcome I'm at wits end and working on my vacation time. very sad.
Solved! Go to Solution.
You don't need an UnGroup() to reference controls in the gallery.
If you notice, I don't prefix the control name with the gallery name. My gallery is Gallery1, Gallery1 has InputNotes text input control. I'm not getting the value with Gallery1.InputNotes.Text, this won't work. I'm using ForAll() to make a list of ALL the gallery controls and their ID's, and the doing a LookUp() on this list.
When I use
Collect(getAllKids,{cID: ThisItem.ID});
I get the ID in that collection and I'm able to iterate through those to do LookUps.
I've tried putting both the Status field in that record and the notes field (adding both of those values) but when I went to do the loop and patch, the cID column had the ID numbers of the rows I needed to patch but both other fields are null) the values in the nested gallery seem to only exist there and are not addressable or something.
There's a better way to do this. I've written a demo with a collection that tracks the changes in the form. When the text input is changed, this is reflected into a collection. The collection contains the ID and the Text.
The OnChange code of the text input:
// See if we already have a change record for this item
If( IsBlank( LookUp( GalleryChanges, ID = ThisItem.ID)),
// If we don't, create a record
Collect( GalleryChanges, {
ID: ThisItem.ID,
Note: Self.Text
}),
// If a record exists, update it with this change
Patch( GalleryChanges,
LookUp( GalleryChanges, ID = ThisItem.ID),
{
Note: Self.Text
}
);
)
Remember to clear the changes collection on page visible.
Once you've got this, you can use the fast Patch() method to merge the changes:
Patch( MyDataSource, GalleryChanges);
I appreciate your help,
Yeah I tried that and it didn't work for me. in my scenario Self.Text is null.
I have no doubt something like this will work with a regular nested gallery. The problem lies in a GroupBy nested gallery where the data source of the nested gallery is something like ThisItem.DATA where DATA comes from the GroupBy command. (it's the final parameter). So unless your tests are using GroupBy you will not re-create my scenario.
Also, In what limited experience I have with the Patch(DataSource, Collection) is a DOG in terms of processing. It touches every field of every row of the datasource and on sufficiently large datasources it is unbearably slow.
ok so here are some facts. Your gallery does not know if it's nested or not. It doesn't know if it's data source is grouped or not. It's simply a list of records. There is no difference between a 'regular' nested gallery and a 'grouped' nested gallery. There is only 'gallery'. Self.Text on an input control is never wrong.
To prove this, here's my demo but now I have 2 galleries and I'm grouping by date in the same way you are.
I couldn't get the nested look up to work (although if I spent more time I see no reason why I couldn't), but without any modification, the changes table still works, using the exact same OnChange code as above. I actually copy & pasted it from this thread to make sure it was exactly as I'd quoted.
From my experience, Patch( DataSource, Collection) is huuuuuuugely faster. I've only had data sets of <10k rows though, maybe it slows down with larger data sets but to bulk add 100 or so records is a couple of seconds rather than a couple of minutes using Patch( ForAll()).
Regardless, Patch( ForAll()) should still work for you if you prefer it.
Not sure why you're still getting null values. Suggest you use the OnChange code above and put a table in to see what that's producing?
Chris, I appreciate all your help, but a GroupBy nested gallery is different than a regular nested gallery. If you've never done one and then patched from it you won't know what I'm talking about. The values are null beyond the gallery. When I attempt to collect them along with the ID they are null.
If you are doing regular nested galleries, what are your two data sources? Are they a collection? The same collection?
With a GroupBy the nested gallery is in a structure that you name on the GroupBy command. GroupBy( Table, ColumnName1 [, ColumnName2, ... ], GroupColumnName )
The GroupColumnName field names the nested data source. So you are not dealing directly with a datasource you are dealing with an obscured datasource. So if your GroupColumnName is "DATA" then your datasource on the nested gallery is ThisItem.DATA which doesn't really exist. How many regular nested galleries have you dealt with having this data source.
If you've never done it with a GroupBy, then you've never done it. I am not able to find ONE example of a groupby nested editable grid gallery. Not one.
Just for fun, let's say there is zero difference between the two types of nested galleries. Then you should be able to take any nested gallery that isn't done using a GroupBy and convert it and it should work fine, right?
Can you find me one example that 1. Uses GroupBy and also patches from changes made to the nested gallery. All I need is one working example. But I find none.
I've asked on the GroupBy videos on YouTube... nothing that also patches. You get GroupBy nested galleries that don't have an example using patch or you get regular nested galleries, which I have no problem patching from.
So in my limited experience it does matter.
If what you say is true, why haven't you shown me an example that actually uses GroupBy? Just one is all I need.
I'm beginning to think it's not possible but that makes no sense. But it also makes no sense that I cannot find one example of this in action. Not in the doc, the forums nor youTube. And when I tried to collect one of the other fields along with the ID it is null. they all are. If you can do a GroupBy and get around that null problem and actually patch from the nested gallery, I will sing your praises on high, I will buy you a beer or five... In all my searching and forum interaction. Not one true example. I wonder why?
Hi Amy, thanks for the reply I thought you might have given up 😉
I'm aware of how GroupBy() works and am very familiar with nested data structures but thanks for the explanation.
In my example above...
Gallery1.Items:
GroupBy(
Sort(
AddColumns(
Penguins,
"CountDate", DateValue( $"{Coalesce(day, 1)}/{Coalesce(month, 1)}/{year}"),
"CountDateText", $"{Left( Text( Coalesce(month, 1), "mmmm"), 3)}-{year}"
),
CountDate, SortOrder.Descending
),
"CountDateText",
"Data"
)
Gallery2.Items (nested inside Gallery1) exactly as you say:
ThisItem.Data
InputNotes.OnChange inside Gallery2 (my text input control):
// See if we already have a change record for this item
If( IsBlank( LookUp( GalleryChanges, ID = ThisItem.ID)),
// If we don't, create a record
Collect( GalleryChanges, {
ID: ThisItem.ID,
Note: Self.Text
}),
// If a record exists, update it with this change
Patch( GalleryChanges,
LookUp( GalleryChanges, ID = ThisItem.ID),
{
Note: Self.Text
}
);
)
This produces the list of changes displayed in my data table above. You should simply be able to patch from this as I said:
Patch( DataSource, CollectionOfChanges);
Just for fun, I added a button and did (almost) exactly this and hey presto, my list is patched.
I would suggest that you can't find an example because you are looking for a 'GroupBy gallery' which isn't a thing.
Anyway, since I have provided a working example you can PM me to arrange the beers 😉
Chris!!! Let's make arrangements for beer!!! Thank you for sticking with me. I was attempting to collect ThisItem.Status.Selected.Value, that didn't work but when I changed it to Self.Status.Selected.Value of course it didn't work either but when I finally landed on Self.Selected.Value it worked. I still don't understand why I can get the row id using ThisItem but need Self for the data .... is it that ThisItem refers to the row and Self refers to the cell itself? This is the problem I've been having all along. I need to understand this better but you sir, who did not give up on me, lead me to the answer even when I couldn't see it so #1 THANK YOU SO MUCH. #2 You should make a video, I can tell by the thumbs up on my questions on youtube that it would get a lot of hits. Anyway I'm accepting your last as the solution because you drilled it into my head such that i could translate it to my code.... eternally grateful and owe you BEER!!!
No problem, glad you got it working 🙂
ThisItem - inside a gallery, this is the record for that row.
ThisItem.Column - the value of the column for that row.
Self - on a control is a reference to itself.
Self.Selected - on a control like a dropdown is the current selected item
Self.Selected.Value - on a dropdown created from a list of single values is the value of that item
Does that make sense?
YouTube? No thanks haha!
Well again, sir, thanks. I do have one more followup question, more of an algorithm one. Originally one one of my other screens, I simply collected the IDs, then I did a distinct on them because I knew if it was in there that I just had to force a status of "Approved" or whatever.
Now, I've got 2 possible fields that may be updated. So now I end up with a list of IDs and changes that look like this:
cID cStatus cNotes cTimestamp (there will be more fields ultimately) and the records look like this:
2 Approved 9/12/2023 11:05:33
2 These are my notes 9/12/2023 11:05: 42
2 <blank> 9/12/2023 11:05:47
2 Waitlisted 9/12/2023 11:05:51
This series of changes shows a change to status from blank to Approved
a change in notes from blank to "These are my notes"
a change in Status from Approved to Blank (maybe a mistake)
a change in Status from blank to "Waitlisted"
What I really want is the ending state of both of these fields prior to hitting the button that performs the patch.
Can you suggest a scheme for collecting this information and refining it? I didn't think this far since I was blocked with the other problem. So I'm just wondering if you have any suggestions for a "best practice" for collecting this data and executing it? I need to loop through it because the changes are relatively small and the data set is very large and wide and the Patch(myDataSource, myCollection) is way too "expensive" and seems to touch every record in the datasource whether changed or not, but truly shouldn't and also when I tested this before... even though I was patching just a few things, each record had a new Modified date.
Either I'm doing something wrong (what are the odds?) or that is the behavior and it really isn't a good choice for large data sets?
If you'd like me to start a new thread, I'm happy to. wanna get you your kudos. But any suggestions in that regard would be helpful -- do you know of a source for "best practices" that might involve this?
I don't want to dry your well, so much beer IS available if needed 😄
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