cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Baltner
Resolver I
Resolver I

Saving unmapped form fields to the data source

Greetings. I am fairly new to Power Apps, having spent many years developing business process apps using SharePoint and Nintex forms and workflows. One of the first most significant differences I've encountered between these two platforms is in persisting "unmapped" form data. (By "unmapped" I mean data in form controls that are not explicitly connected to a table or list column.) Nintex does this out-of-the-box by creating an XML snippet containing all the unmapped fields and their values and saving this to a special multi-line column in a SharePoint list called "FormData." I did not find this capability in Power Apps so I made up my own version of it (see below). However, although it works it is, admittedly, a hack and I was hoping that someone in this Community may have found a better way to do this, or that there is indeed a way to do it out-of-the-box but I may have missed it.

 

The  workaround that I came up with, in a nutshell, is this:

  • Create a multi-line text field in the SharePoint list. I called it PA_FormData.
  • Put all of the "unmapped" field controls and their labels into one or more custom data cards in the form that is being submitted. There can be as many of these fields as needed. Some of my forms have dozens of such fields, of many different types.
  • Add a (hidden) button to the screen, outside of the form and set the OnSelect property of the button to do two things: a) create a collection containing all of the unmapped fields and their values. The names of the columns are arbitrary but will be referenced in a later step when the data is retrieved; and b) create a JSON string of the resulting single-row table. This string will be saved to SharePoint in a later step.
  • Set the default values of all of the unmapped field controls to be the value extracted from the PA_FormData field, for example, for a text input field it might look like this: 

 

 

If(
    Form1.Mode = FormMode.New,
    Blank(),
    Text(First(Table(ParseJSON(PA_FormDataField.Text))).Value.TextInput1)
)​

 

 

where TestInput1 is the name I gave to the column for this field in the collection. This is how the field value is retrieved from the persisted JSON string. The formula will be slightly different for different data types, but the idea is the same.

 

Saving the data involves three steps executed by the "Submit" control:

  • Selecting the hidden button that creates the JSON
  • Submitting the form (saves the mapped fields to their respective list columns, including the prior PA_FormData, if any) 
  • Using Patch to update the PA_FormData column with the contents of the JSON string created by selecting the button

In practice, I found that I had to add a short delay with a timer control to allow the button to finish updating the JSON, so the last two steps are actually executed in the OnTimerEnd formula of the timer control. Also, some conditional logic is needed for Patching new vs. existing records, but the idea is basically that the PA_FormData field is updated in a separate step.

 

The above is a condensed version of my "hack." I'm OK with it but it gets kind of ugly when you have tons of checkboxes, dropdown menus, radio buttons, etc., so I'm hoping that someone can suggest a better process. Thanks.

 

 

3 REPLIES 3

On the whole, if you want to store unstructured data in SharePoint without fiddling with add-ins and whatnot, this method seems reasonable to me.

As far as I know, Power Apps just isn't setup to handle unstructured data conveniently. It would be nice if there was a Form property that returned a record of all unmapped cards within the form, as well. But, I could see that it would go against the design philosophy of Power Apps. So, there is no magic bullet where you won't have the map the fields to a record yourself.

That said, a couple improvements:

In your "code" button, you should assign your JSON() text output to a variable. I used UpdateContext(). Set the PA_FormDataField's card.Update property to that variable. The have then run SubmitForm() on a subsequent line of code. This way you won't have to do a separate Patch(). Really just swapping the order you're doing it currently, but it lets you do a single write to SharePoint.

Earlier I specified to use UpdateContext(); I'm guessing you're using Collect() to prepare your unstructured data? I suspect this because you are having to use a timer to give time for the Collection to be created. You're having this issue because a Collection is treated more like an internal data source than a variable. If you use UpdateContext() (which creates a variable in the scope of Screen), it will act in a deterministic way where your data will be there when you expect it on the next line of code when you submit the form.

I tested this setup to confirm it works.

Good question, I appreciate it.

 

Hey Scott:

 

Thanks for the thoughtful reply. I'm not sure what is meant by "design philosophy" that would prevent a solution like this from being provided without a lot of fuss and bother but I accept that it's not there so a custom solution is needed.

 

As to your comments on my approach:

  • Yes, I do name the JSON variable. I used Set() for this but UpdateContext would work as well and that makes more sense as the scope is not global.
  • I'm using Patch because the button that creates the JSON text lives outside the form and therefore I cannot update a form data card with the most current values. I suspect that your button is in a separate hidden data card within the form to allow this and that's a good suggestion too. I will try it. (I've found that you can get around this limitation by using an external button to select an internal button that updates/resets a form field but  that wouldn't be necessary with an internally triggered button).
  • Yes, I'm using Collect() (ClearCollect(), actually) to store the values but that's only because I thought that was the only way to store many values at once (in an array). Your suggestion to use UpdateContext({}) instead is also interesting because, to date, I've only used that for scalar values. After reading your reply I see how it now could handle records, or even tables, just as well and if that means there would be no delay then I can just chain the formulas together in one step. Much better!

I will try your suggestions (already verified, which inspires confidence!). Your method for doing this does sound much better than mine so I'm glad I posted the question here. Thanks again.

 

One final thought...this is a useful approach for complicated forms that have many fields that need to be persisted so I can see lots of use cases for it....of course that suggests making it a component. But I'm not sure how I would do that given the need to store case-specific keys and values in the JSON.

 

By the design philosophy of Power Apps, I mean what Microsoft is trying to achieve with Power Apps. As a low-code/no-code app platform, unstructured data diverges from what a broad swath of the intended audience would be familiar with. Defining all fields in the data source is in line with keeping things simple and harder for the developer to mess-up.

 


@Baltner wrote:
  • I'm using Patch because the button that creates the JSON text lives outside the form and therefore I cannot update a form data card with the most current values.

 


Double-check this, this isn't my experience. There shouldn't be any problem with referring to a variable from within a form (or on the Form control itself)

Ah, components, so much potential, but also annoying limitations. In particular, they don't work with forms. You can't have components inside of a form and you can't have forms inside of components. You could potentially create something based on a gallery so that you can vary the number of fields. I tried to do something similar and the problem I encountered is that Power Apps requires that field names are string literals, i.e. hard-coded in the editor. Field names can't be variables. You couldn't save the fields properly together as a record, but as individual records in a table. Something like:

ForAll(Gallery1.AllItems({Name: NameControl.Text, Value: ValueControl.Text}))

 Which went against my sense of aesthetics, lol. So, I can't recommend trying to generalize too much in Power Apps because of the limitations of the software, but if you get something working I would be curious about it!

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

Users online (1,116)