我们有一个部署到用户智能手机设备上的应用程序。这个应用程序旨在捕捉用户当月的“可用性”。该应用程序为他们提供一个月内每一天的月视图,每天旁边都有一个拨动开关。然后用户切换他们可以工作的日期并点击保存。然后保存按钮使用 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)
非常感谢任何帮助!