PowerApps Complex Logic to Filter Records Found within Start to End DateTime

22 Views Asked by At

In my Gallery, I set the color of Desks that are available = Green, and Red for booked Desks, if active 'Reservation Details' records are found within selected Date.

Switch(
    LookUp(
        ForAll(
            Filter(
                'Reservation Details',
                Date >= FromDate_Dp.SelectedDate,
                Date <= ToDate_Dp.SelectedDate 
                && 'Booking Status' = 'Booking Status (Reservation Details)'.Booked
            ),
            {
                DeskName: 'Reserved Desk'.Name,
                BookingStatus: Text('Booking Status')
            }
        ),
        DeskName = ThisItem.Name
    ).BookingStatus,
    "Booked",
    Color.Red,
    Color.Green
)

However, with 'Time' value implemented, I have to filter 'Reservation Details' via Date + Time. enter image description here


What I Tried

Below is the code I tried to include Time, but the results are incorrect.  (Booked Desks are still displayed as available in Green color)

Switch(
    LookUp(
        ForAll(
            Filter(
                'Reservation Details',
                'Start Date Time' >= FromDate_Dp.SelectedDate + Time(Value(FromTimeHour_Ddl.Selected.Value), Value(FromTimeMinutes_Ddl.Selected.Value), 0) 
                && 'End Date Time' <= ToDate_Dp.SelectedDate + Time(Value(ToTimeHour_Ddl.Selected.Value), Value(ToTimeMinutes_Ddl.Selected.Value), 0)
                && 'Booking Status' = 'Booking Status (Reservation Details)'.Booked
            ),
            {
                DeskName: 'Reserved Desk'.Name,
                BookingStatus: Text('Booking Status')
            }
        ),
        DeskName = ThisItem.Name
    ).BookingStatus,
    "Booked",
    Color.Red,
    Color.Green
)

Sample Scenario for Modified Formula Above

Existing Reservation: 27 Feb 9am - 6pm

If user tries to book 27 Feb 12pm - 1pm, the first && condition will fulfil,

'Start Date Time' >= FromDate_Dp.SelectedDate + Time(Value(FromTimeHour_Ddl.Selected.Value), Value(FromTimeMinutes_Ddl.Selected.Value), 0)

but the second && condition below will be missed, so the Desk will still be shown as available.

 'End Date Time' <= ToDate_Dp.SelectedDate + Time(Value(ToTimeHour_Ddl.Selected.Value), Value(ToTimeMinutes_Ddl.Selected.Value), 0)

Further Analysis

Below are some permutations that I thought through. However, this logic will also wrongly block Desks if a different day is selected (e.g. 28 Feb). *User is allowed to select multiple dates, but a fixed Start Time and End Time

Existing Reservation : 27 Feb 10am - 6pm

+ Permutations

1. Reservation 'Start Date Time' on/before Selected 'Start Date Time'
2. Reservation 'Start Date Time' on/after Selected 'End Date Time'

3. Reservation 'End Date Time' on/before Selected 'End Date Time'
4. Reservation 'End Date Time' on/after Selected 'End Date Time'


+ Scenarios to block Desk booking (would also wrongly block out Desks if a different day is selected, e.g. 28 Feb)

A) 27 Feb 12pm - 5pm
1. Reservation 'Start Date Time' on/before Selected 'Start Date Time'
3. Reservation 'End Date Time' on/before Selected 'End Date Time'

B) 27 Feb 9am - 5pm
2. Reservation 'Start Date Time' on/after Selected 'End Date Time'
4. Reservation 'End Date Time' on/after Selected 'End Date Time'

C) 27 Feb 12pm - 5pm
1. Reservation 'Start Date Time' on/before Selected 'Start Date Time'
4. Reservation 'End Date Time' on/after Selected 'End Date Time'

D) 27 Feb 9am - 6pm
2. Reservation 'Start Date Time' on/after Selected 'End Date Time'
3. Reservation 'End Date Time' on/before Selected 'End Date Time'
0

There are 0 best solutions below