I am building my first PowerApp using a SharePoint site and the user would like the "Stage" of the application (Stage_DataCard1, DataCardValue3) to automatically update when other 'triggers' such as "Transferred to Field Date" (DataCardValue17), "Test Completed by" (DataCardValue19) are completed. These fields will be blank (empty) before the data is entered (Date or text).
"DataCardValue3" is a drop down list with items - Choices([@'Log Requests'].Request_x0020_stage)
I need the DataCardValue3 to be either the selected value from the drop down list OR update automatically when one of the trigger points is reached. If a trigger is not met the stage should stay as the last stage.
Is this possible? if so how do I code it? I have had a look online and I think it should be possible but I can't see how - do I use UpdateContext, a plain If statement? Where do I put the code - in DataCardValue3 or where the trigger is entered (DataCardValue17 and DataCardValue19) and under which option?
Solved! Go to Solution.
Ok, perfect. So here is the formula:
If( SharePointForm1.Mode = FormMode.New, LookUp( Choices(AB12.Stage), Value = "New" ), SharePointForm1.Mode = FormMode.View, Parent.Default, SharePointForm1.Mode = FormMode.Edit, If( Not(IsBlank(DataCardValueTestCompletedBy.Text)), LookUp( Choices(AB12.Stage), Value = "Tested" ), Not(IsBlank(DataCardValueTransferredToFieldDate.SelectedDate)), LookUp( Choices(AB12.Stage), Value = "Transferred" ), Parent.Default ) )
Just replace AB12 with the name of your datasource, Stage with the name of your stage field, DataCardValueTestCompletedBy and DataCardValueTransferredToFieldDate with the name of your corresponding datacard values.
Tell me how this goes...
If I understand correctly what you want to achieve here...
You have the following datacards in your app:
First, please consider renaming your datacards and your DataCardValue controls. It really helps coding... 😊
So, what you want to do is (values may differ from what you really want here):
If that's what you're trying to acheive, then I suggest you put the following formula in your DefaultSelectedItems of your DataCardValue3 control:
LookUp(Choices([@'Log Requests'].Request_x0020_stage), Value= If(Not(IsBlank(DataCardValue17.SelectedDate)), "Transferred", Not(IsBlank(DataCardValue19.Text)), "Tested") )
This will not prevent the user to manually change the value of the Stage field if needed.
One thing though: using this code will give precedence to the Tested value since it is the last one tested in the If statement. Meaning: if both fields Transferred to Field Date AND Test Completed by are filled, then Stage will be Tested.
Hope this helps,
Many thanks for your prompt reply, I will take your advice and rename the data card values to make coding easier - thanks. Stage_DataCard1 is a drop down list.
I have tried what you suggest and it works however when I save and then re-open the item the Stage is blank (contains no data at all) - have I done something wrong?
Let's say you have the following in your form:
Are you saying that after your save this item, when edit it again, the Stage field is blank ?
indeed it is a little strange - I'm really not sure what is going on!
When I create a new item save and view it the stage is empty, on edit it goes to Find items. It seems to save ok but when I re-open the Stage is again blank - see attached.
I have just reverted back to an old version and will start again to see if I have done something daft in my excitement to test the coding yesterday. I will post an update
I have started from the beginning again and found something else. I can get the first change to work ok (change stage to "Transferred") however when I add data to the trigger to change the Stage to it to "Tested" it does not work - unless I remove the date in the first stage (DataCardValue17.SelectedDate).
I'm sorry that I did not make this clear in my post but this will be a sequential process so "Transferred to Field Date" will be completed first then "Test Completed By" will be filled in (by someone else). So, is it possible to alter the coding to account for this - I have tried:
LookUp(Choices([@'Log Requests'].Request_x0020_stage), Value=
If(Not(IsBlank(DataCardValue17.SelectedDate)), "Transferred", ((DataCardValue17), Not (IsBlank(DataCardValue19.Text))), "Tested")
but - well it is obviously wrong!
Is it possible to do this - if so how?
Ok. No, your formula can't work...
If I understand well from your what I've seen in your document, you would like to have a New value for your Stage field when you initially create a new item, right ?
So, could you try this formula:
LookUp(Choices([@'Log Requests'].Request_x0020_stage), Value= Switch(<your form>.FormMode, FormMode.New, "New", FormMode.Edit, If( Not(IsBlank(DataCardValue17.SelectedDate)), "Transferred", Not(IsBlank(DataCardValue19.Text)), "Tested", Parent.Default.Value ), FormMode.View, Parent.Default.Value ) )
A bit more complicated here. I couldn't test it so I compiled it in my brain... 😊 I hope there will be no error...
Keep me posted...
Thanks, I checked your code but got an error, The function 'Switch' has some invalid arguments' (see attached).
I'm sorry but I don't think the code will do what I need:
The first stage will be New, I think your code will do this (thanks) but as work is completed the user wants to divide the record of what has been completed into stages so from "New", the next stage is "Transferred" and the subsequent one is "Tested".
Using the first code you sent, the Stage automatically updates from, the manually selected stage, "New" to "Transferred" when the DataCardValue17 (date) is entered but the Stage does not then update to "Tested" when I enter a value into DataCardValue19 (text) unless I clear the date field from DataCardValue17. The stage updates if I clear the date from DataCardValue17 so I was trying to say if DataCardValue17 and DataCardValue19 are not empty then change the Stage to "Tested" - to reach the "Tested" Stage data will exist in both DataCardValue17 and DataCardValue19.
I hope this makes sense!
Is this possible?
Ok... First I made a mistake right at the begining of the formula because the property that holds the form mode is Mode not FormMode. Then, you are right: my formula will not allow your Stage column to get the "Tested" value.
So, can you please try this new formula:
LookUp(Choices([@'Log Requests'].Request_x0020_stage), Value= Switch(SharePointForm1.Mode, FormMode.New, "New", FormMode.Edit, If( Not(IsBlank(DataCardValue19.Text)), "Tested", Not(IsBlank(DataCardValue17.SelectedDate)), "Transferred", Parent.Default.Value ), FormMode.View, Parent.Default.Value ) )
Tell me how this goes...
I have tested your revised code however I still get "The function 'Switch' has some invalid arguments (see attached).
I have re-ordered the if statement you original wrote in line with your latest code (so that DataValue19 comes before DataCardValue17) and the stages update however the Stage field clears on save - I guess the other part of your coding (once it works) will resolve this?
Many thanks for your help with this.
We're excited to announce our first cross-community 'Can You Solve These?' challenge!
Reopen responsibly, monitor intelligently, and protect continuously with solutions for a safer work environment.
We are excited for the next Super User season.
FIll out a quick form to claim your community user group member badge today!
Features releasing from October 2020 through March 2021