2

我们有一个部署到用户智能手机设备上的应用程序。这个应用程序旨在捕捉用户当月的“可用性”。该应用程序为他们提供一个月内每一天的月视图,每天旁边都有一个拨动开关。然后用户切换他们可以工作的日期并点击保存。然后保存按钮使用 ForAll + Patch 函数来检查每条记录。如果记录存在,它会更新任何更改,如果记录不存在,则创建它。

问题

一部分用户(低于 2-5%)遇到一个问题,即每月的第一天有时无法正确显示(通常默认为 false),然后当用户保存记录时,它会将其更新为“错误”为该月的 1 日。这会导致记录更改为假,然后用户会因为他们没有更改它而对为什么它从真更改感到困惑。仅在一个用户中,我们发现该月的前 3 天显示不正确,然后他们将其保存了下来。从那以后他们就没有发生过这种情况,因此这可能是异常或用户错误,而不是此问题的一部分。

潜在原因

该集合建立在日期连接和从不同表中查找信息的基础上。日期是动态的,因此对它们进行 DateAdd 操作。该应用程序和日期存储在英国,用户位于英国。在一位遇到问题的用户身上,我们注意到他们的时间以 12 小时格式显示在他们的手机上,而不是 24 小时格式(与大多数英国设备一样)。因此,我们为 TimeZone 添加了一段偏移代码,并且自从进入应用程序以来,它似乎已经为该用户修复了它。此变量替换以下代码:

旧代码:

Today()

新代码:

Set(_todayOffset, DateValue(Text(DateAdd(Now(), TimeZoneOffset(), Minutes), "[$-en-GB]dd/mm/yyyy")));

潜在的解决方案

一部分用户似乎不太可能没有将他们的设备设置为他们的语言环境。所以我的问题是,还有其他可能导致这种情况的原因吗?是否有处理设备语言环境和日期的默认方法?有没有办法强制日期显示在某个时区或区域设置中,覆盖设备设置以真正消除这个潜在问题?为了完整起见,我添加了用于生成和保存以下数据的代码:

缓存显示的数据(Gallery.Items 绑定到 'aAvail')

Set(userID, Office365Users.MyProfile().UserPrincipalName);
Set(empID, LookUp(PF_Workers, UPN = userID, 'Employee ID'));

Set(_todayOffset, DateValue(Text(DateAdd(Now(), TimeZoneOffset(), Minutes), "[$-en-GB]dd/mm/yyyy")));
Set(_firstDayOfMonth, DateAdd(Date(Year(_todayOffset), Month(_todayOffset), 0), 1, Days));
Set(_firstDayOfNextMonth, DateAdd(_firstDayOfMonth, 1, Months));
Set(_fdom_6monthBefore, DateAdd(_firstDayOfMonth, -6, Months));
Set(_fdom_6monthAhead, DateAdd(_firstDayOfMonth, 6, Months));

ClearCollect(
    aDates,
    Filter(
        PF_Dates,
        Month >= _fdom_6monthBefore,
        Month < _fdom_6monthAhead
    )
);
ClearCollect(
    aComb1,
    AddColumns(
        aDates,
        "Records",
        LookUp(
            PF_Availabilty,
            And(
                Date = aDates[@Date],
                'Employee ID' = empID
            ),
            'Record ID'
        )
    )
);
ClearCollect(
    aAvail,
    AddColumns(
        aComb1,
        "Work",
        LookUp(
            PF_Availabilty,
            'Record ID' = aComb1[@Records],
            Work
        )
    )
);

保存数据

// Set save variable
Set(_savingData, true);

// Cache and check data in database, and then perform Patch
ClearCollect(
    avGalleryData,
    AddColumns(
        galDatePicker.AllItems,
        "AvailableToggle",
        tglAvailability.Value
    )
);
ForAll(
    avGalleryData,
    If(
        IsBlankOrError(avGalleryData[@Records]),
        Patch(
            PF_Availabilty,
            Defaults(PF_Availabilty),
            {
                'Employee ID': empID,
                Date: DateValue(Text(DateAdd(Date, TimeZoneOffset(), Minutes), "[$-en-GB]dd/mm/yyyy")),
                Month: DateValue(Text(DateAdd(Month, TimeZoneOffset(), Minutes), "[$-en-GB]dd/mm/yyyy")),
                Work: 
                If(
                    AvailableToggle = true,
                    'Work (PF_Availabilty)'.'true',
                    'Work (PF_Availabilty)'.'false'
                )
            }
        ),
        Patch(
            PF_Availabilty,
            LookUp(
                PF_Availabilty,
                'Record ID' = avGalleryData[@Records]
            ),
            {
                Work: 
                If(
                    AvailableToggle = true,
                    'Work (PF_Availabilty)'.'true',
                    'Work (PF_Availabilty)'.'false'
                )
            }
        )
    )
);

// Reloading cached data
ClearCollect(
    aComb1,
    AddColumns(
        aDates,
        "Records",
        LookUp(
            PF_Availabilty,
            And(
                Date = aDates[@Date],
                'Employee ID' = empID
            ),
            'Record ID'
        )
    )
);
ClearCollect(
    aAvail,
    AddColumns(
        aComb1,
        "Work",
        LookUp(
            PF_Availabilty,
            'Record ID' = aComb1[@Records],
            Work
        )
    )
);

// Cleanup variables
Set(_savingData, false)

非常感谢任何帮助!

4

0 回答 0