I am encountering a new blocking problem that I can’t seem to get over. I have searched the Community Site and any other sources I can find and can’t seem to find a clear reference to this situation anywhere. There are lots of special cases but nothing that addresses this basic behavior.
I am stumped trying to change column values in both Global and Context Variables that contain a single Record with multiple Columns inside it. I have successfully used the Set(), UpdateContext() and Patch() functions in different scenarios individually but now when I try to combine the Patch within either the Set() or UpdateContext() functions as referenced in the documentation (Set() & UpdateContext())
I am loading the contents of the record selected from the gallery below into both one Global and one Context variable that are otherwise identical. As illustrated below, when the record is selected, the values are loaded properly and displayed into the regular display labels on the right.
When I put new data into the data inputs on the lower right, and hit each of the buttons (Update Global and Update Context), I would expect that the values in the labels in the upper right to change accordingly based on the code below but that isn’t happening. I am receiving no error messages or conditions and it just seems to be ignoring the button pushes.
Here is code on the button I am using to select the record from the gallery (the black and red below). It seems to be working as it is supposed to.
icoSelectOrder from galOrders
Set(
selectedOrderHeader,
galOrders.Selected
);
UpdateContext({selectedOrderHeaderContext: galOrders.Selected})
Here is the screen after I select a record from the gallery but before I enter the new value I want to use to update the column values.
Here is the code that executes on each of the Update buttons.
OnSelect on btnUpdateGlobal
Set(
selectedOrderHeader,
Patch(
selectedOrderHeader,
{
'SoldTo Name': txtSoldtoName.Text,
'ShipTo Name': txtShipToName.Text,
'ShipTo Number': txtShipToNumber.Text,
'SoldTo Number': txtSoldToNumber.Text
}
)
)
OnSelect on btnUpdateContext
UpdateContext(
{selectedOrderHeaderContext:
Patch(selectedOrderHeaderContext
,
{
'SoldTo Name': txtSoldtoName.Text,
'ShipTo Name': txtShipToName.Text,
'ShipTo Number': txtShipToNumber.Text,
'SoldTo Number': txtSoldToNumber.Text
}
)
}
)
Here is the unexpected behavior (or lack thereof) when I hit either button.
When I hit either the UpdateGlobal or UpdateContext, I do not get the expected behavior where the column values in each of these Record variables is set to the new values I have entered in the txt input fields.
Clearly something is wrong but I can’t figure it out as the commands are both passing the syntax checker and I have checked it against any the syntax examples (above) I can find in the online documentation for both the Set() and UpdateContext() functions along with Patch().
For reference, here is the CDS entity Sales Order Header that I am using to populate the galOrders. This whole thing cropped up as I have been collecting new values that I will then use to patch the selected record but I haven’t gotten to that step yet. I have successfully patched records in other CDS entities so I think I have a handle on that step. We will see after I solve this one.
Can anyone provide any insight on what I am doing wrong to cause this blocking problems (or if there is some underlying problem lurking in the tool)?
Thanks,
Mark
man, you saved my life...
I encountered this same issue and was able to rectify it by wrapping the Patch in an IfError function, with the fallback being an empty record, i.e. {}.
Two years later, same problem. Patch eventually seems to change the nature of the record which gives "incompatible with the types of values in other places in your app" error, even if it works for awhile initially
Fair warning. While this solution worked in my simple, sample example, when I tried to apply it in real-life to a larger, more complicated application it has failed spectacularly. It failed at the point when I try to call the Set() function a second time a few steps later to update two additional columns in the same Record variable. When I call the function the first time with two column value updates, it works perfectly. When I call the function a second time with one column value update, it works perfectly. When I try to call the function a second time with two column variable updates, it never gets to the syntax parser without blowing up every other location that uses, calls or manipulates the Record variable.
I have wasted hours on this trying different variations but it is completely repeatable both with Set() and with UpdateContext(). I am going with a different approach until I figure out whether I am doing something wrong or there is a problem with the tools.
My examples include some sensitive client data that I don't want to post out on the Community but I am happy to review it with anyone interested over a Teams session.
Thanks, @Greg Lindhorst for taking a look at this for me.
No worries. Thanks for your help. This one was gnarly. Even though this Solution worked well in the trial I set up, I am still struggling with what appears to be inconsistent behavior in the actual application I am building that is much more complicated.
I will Post again if I learn any more on this topic.
Fair Warning - While this solution worked in my simple example, I am having issues using it in real life. See my follow-up post.
so we have a solution thanks to @yshariff and gocollectiv.com.
It turns out that this is something of a hole in the PowerApps parser and a lack of documentation as to the proper way to use the Patch command when referring to Variables (both Global and Context) that are instantiated from a CDS Entity template. At a minimum the documentation should be updated.
The answer is that, rather than use the user-friendly column names like 'SoldTo Name' or 'ShipTo Number', in the body of a Patch() function, you have to reference the column directly using, as an example, the more obtuse but totally qualified and unique 'cr66a_soldtoname' or 'cr66ashiptonumber' from the base CDS entity. Apparently the variable either "set" or "updatecontext"ed inherits the exact structure of the "parent" entity including all names. One other note, I accidentally had a type mismatch in my command (number column was being fed a text) which was not caught by the syntax checker until I changed the column names to the correct ones. Then it wouldn't let me through the syntax checker until I fixed that.
So the proper code for the Update Global and Context buttons is:
OnSelect for Update Global Button
Set(
selectedOrderHeader,
Patch(
selectedOrderHeader,
{
cr66a_shiptoname: txtShipToName.Text,
cr66a_soldtoname: txtSoldtoName.Text,
cr66a_soldtonumber: Value(txtSoldToNumber.Text),
cr66a_shiptonumber: Value(txtShipToNumber.Text)
}
)
)
OnSelect for Update Context button
UpdateContext(
{
selectedOrderHeaderContext: Patch(
selectedOrderHeaderContext,
{
cr66a_shiptoname: txtShipToName.Text,
cr66a_soldtoname: txtSoldtoName.Text,
cr66a_soldtonumber: Value(txtSoldToNumber.Text),
cr66a_shiptonumber: Value(txtShipToNumber.Text)
}
)
}
)
We troubleshot this by using the View>Variable and drilling down on the record until we got to this level:
This worked but it was clunky and the column widths can't be adjusted on these column names which is a challenge for all but the shortest column names. But now that I know, I can always go back to the CDS Entity and get the right answer from the first column of data after the ellipsis.
Anyway a little updated documentation would have save a few hours but now that I know, life is grand.
Thanks again, @yshariff
I have purposely included the place in the documentation where it says you can do exactly what I am trying to do. If it doesn't actually work that way then Microsoft should update the documentation. I have a specific reason for wanting to change the value of a column in an in-memory record variable (either Global or Context). I am sure I can find another way to do what I need to do but I shouldn't have to if the documentation is correct.
I have considered putting the record into a collection and then doing the Patch on that using a Lookup function of some kind but that seems like "going around the block to get next door" if I don't have to.
MS.Ragavendar
32
Michael E. Gernaey
19
Super User 2025 Season 1
Rajkumar_M
16
Super User 2025 Season 1