I have a scheduling calculator primarily based on 3 date picker fields (Every Monday, 2nd Tuesday, and 1st&3rdTuesday).
Currently, the date is manually entered into the Every Monday date picker, the 2nd Tuesday picker calculates the 2nd Tuesday based on the date selected in the Every Monday date picker, and the 1st&3rdTuesday date picker is calculated based on the date that gets calculated in the 2nd Tuesday date picker.
I'd like for the user to be able to enter in EITHER the Every Monday or the 1st&3rdTuesday date picker, and calculate the dates either way. However, when I've attempted this using an IF statement in both the Every Monday and 1st&3rdTuesday date pickers (once with the IF statement in only one date picker and another time with the IF statement in both) and I get a circular reference error.
Is it possible to accomplish what I need or will I have to find a workaround?
@Anonymous
I haven't tested this but you can probably use variable in the OnChange of the DatePickers, eg
Every Monday DP: OnChange :
Set( vEveryMonday, dpEveryMonday.SelectedDate); Set( v1st_3rd_Tuesday, Blank())
1st and 3rd Tuesday DP: OnChange:
Set( vEveryMonday, Blank()); Set( v1st_3rd_Tuesday, dp1st_3rdTuesday.SelectedDate)
Then use your If() statements using these variables, checking for IsBlank() first.
Thanks, @EddieE . I've tried the variables and I'm still receiving the circular error. If I understood correctly, I place the variables in each of the control's OnChange properties, then use them in the DefaultDate properties of each control's If statements.
@Anonymous
Can you please share the formulas you are using on your datepickers
@Anonymous
After having a quick play I think this should do what you want. You will just have to add Dyas between dates to suit your needs.
- Add a DatePicker, call it FirstMonday, then set these properties
// OnChange
Set( vEveryMonday, FirstMonday.SelectedDate);
Set( v1st_3rd_Tuesday, DateAdd( vEveryMonday, 8, Days));
// DefaultDate
vEveryMonday
- Add a second DatePicker, call it SecondTuesday, then set it's properties
// OnChange
Set( v1st_3rd_Tuesday, SecondTuesday.SelectedDate);
Set( vEveryMonday, DateAdd( v1st_3rd_Tuesday, -8, Days));
// DefaultDate
v1st_3rd_Tuesday
The dates and variables don't make sense but hopefully you can work it out? Basically, if a user picks a Monday, the Tuesday DatePicker is set to +8days past that date. Then, if a user picks a Tuesday, the Monday is set to -8 days before that date.
It works in my testing so hopefully this will do what you need.
@EddieE Thank you for your reply. Sorry, for the delayed response, I've been on vacation. I tried your suggested formula and it gave me the red underlines. Also, I'm pretty sure setting -8 days will not work because the calendar days change so much. This is the code I have on the Default Date property of the 1st&3rdTuesday date picker, which is currently dependent on the date picking in the Every Monday picker. I hope that makes sense.
With(
{
FirstOfMonth: Date(
Year(1stTuesdayDatePicker.SelectedDate),
Month(1stTuesdayDatePicker.SelectedDate),
1
),
DayOfWeek: 3,
N: 1
},
With(
{
FirstTuesday: DateAdd(
FirstOfMonth,
(N * 7) - Weekday(
DateAdd(
FirstOfMonth,
7 - DayOfWeek
)
)
)
},
With(
{
SecondOfMonth: Date(
Year(2and4Tuesday.SelectedDate),
Month(2and4Tuesday.SelectedDate),
1
),
DayOfWeekSS: 3,
NSS: 2
},
With(
{
SecondTuesSS: DateAdd(
SecondOfMonth,
(NSS * 7) - Weekday(
DateAdd(
SecondOfMonth,
7 - DayOfWeekSS
)
)
)
},
With(
{
FourthOfMonth: Date(
Year(2and4Tuesday.SelectedDate),
Month(2and4Tuesday.SelectedDate),
1
),
DayofWeekFS: 3,
NFS: 4
},
With(
{
FourthTuesSS: DateAdd(
FourthOfMonth,
(NFS * 7) - Weekday(
DateAdd(
FourthOfMonth,
7 - DayofWeekFS
)
)
)
},
With(
{
FirstOfMonthCC: Date(
Year(2and4Tuesday.SelectedDate),
Month(2and4Tuesday.SelectedDate),
1
),
DayOfWeekCC: 3,
NCC: 1
},
With(
{
FirstTuesCC: DateAdd(
FirstOfMonthCC,
(NCC * 7) - Weekday(
DateAdd(
FirstOfMonthCC,
7 - DayOfWeek
)
)
)
},
With(
{
ThirdOfMonth: Date(
Year(2and4Tuesday.SelectedDate),
Month(2and4Tuesday.SelectedDate),
1
),
DayOfWeekSS3: 3,
N3SS: 3
},
With(
{
ThirdTuesSS: DateAdd(
ThirdOfMonth,
(N3SS * 7) - Weekday(
DateAdd(
ThirdOfMonth,
7 - DayOfWeekSS3
)
)
)
},
If(
IsBlank('EveryMondayDatePicker'),
"",
IsBlank(2and4Tuesday),
DateAdd(
DateAdd(
FirstOfMonth,
1,
Months
),
(N * 7) - Weekday(
DateAdd(
DateAdd(
FirstOfMonth,
1,
Months
),
7 - DayOfWeek
)
)
),
2and4Tuesday.SelectedDate = SecondTuesSS,
DateAdd(
DateAdd(
FirstOfMonthCC,
1,
Months
),
(NCC * 7) - Weekday(
DateAdd(
DateAdd(
FirstOfMonthCC,
1,
Months
),
7 - DayOfWeekCC
)
)
),
2and4Tuesday.SelectedDate = FourthTuesSS,
DateAdd(
DateAdd(
ThirdOfMonth,
1,
Months
),
(N3SS * 7) - Weekday(
DateAdd(
DateAdd(
ThirdOfMonth,
1,
Months
),
7 - DayOfWeekSS
)
)
)
)
)
)
)
)
)
)
)
)
)
)
@Anonymous
I hope you had a nice break 🙂
When I put your code into a DatePicker I can see those red lines. If you look closely at them , you'll see that these lines don't highlight the NUMERAL at the start of your DatePickers. This is the clue you need.
You cannot start control names with numbers, PowerApps doesn't like it. To fix this, I changed the DatePickers to FirstTuesdayDatePicker and Secondand4Tuesday respectively. Then I went through the code above and change that accordingly and the errors go away ... however ... The code picks 1-Feb-2022 no matter what I select for 1st Monday so I think you'll need to work on that.
Lastly, I'm not a huge fan of large complex With() statements, they tend to go against the whole "Low-Code" mantra and in this instance can create far more complexity than is needed, IMO. I guess though, if you are happy using this code format - go for it 🙂
@EddieE Thanks, Eddie. I'll give it a shot. I am not a fan of the large complex With statements but it's the only solution that I could find that would calculate the nth days of the month. I have one meeting that is every Monday, the preceding meeting is only on the first Tuesday of the month, then the next meeting is on the second and fourth Tuesday of the month, and the last meeting for approvals is on the first Tuesday and third Tuesday of the month. The meetings have to be conducted in that order so depending on when the user can get into the first meeting will determine their path forward. However, some users find it easier to plan the LAST meeting, usually due to other deadlines or restraints, and then calculate the meetings backward. This is what I was trying to accomplish. If you have a simpler way to get the Nth days of the month than using With statements, I'm happy to entertain it. I am still relatively new to PowerApps so every step is a learning step for me.
User | Count |
---|---|
126 | |
87 | |
85 | |
75 | |
69 |
User | Count |
---|---|
215 | |
180 | |
139 | |
97 | |
83 |