acumatica - 我需要有条件地设置一个必填字段
问题描述
我正在自定义销售订单屏幕,如下所示:
- 我在订单类型屏幕中添加了一个自定义布尔字段,名为“需要客户订单号”。
- 我已将代码添加到销售订单屏幕的 BLC 中,我希望根据是否选中“需要客户订单号”字段,有条件地使 CustomerOrderNumber 字段成为必填字段。
我正在使用 SOOrder_RowSelected 事件,如下所示:
protected virtual void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
var soorder = (SOOrder)e.Row;
if (soorder == null) return;
string ordtype = soorder.OrderType;
var soot = (SOOrderType)PXSelect<SOOrderType,
Where<SOOrderType.orderType, Equal<Required<SOOrderType.orderType>>>>.Select(Base, ordtype);
if (soot != null)
{
var sootext = PXCache<SOOrderType>.GetExtension<SOOrderTypeExt>(soot);
if (sootext != null)
{
PXUIFieldAttribute.SetRequired<SOOrder.customerOrderNbr>(sender, sootext.UsrRequireCustOrdNbr == null ? false : (bool)sootext.UsrRequireCustOrdNbr);
}
}
}
这确实在 CustomerOrderNumber 字段上加了一个星号 - 但如果该字段为空,它不会在保存时产生错误。
另一个问题是我的 PXSelect 从 SOOrderType 中获取记录总是为复选框用户字段返回 null,即使它在数据库中具有“True”值(这就是我将三元运算符放在调用中的原因)。即使我在 PXUIFieldAttribute.SetRequired 调用中硬编码一个“真”值,它仍然不会产生错误以防止保存。星号在那里,但它不起作用。
如果我使用 Cache_Attached 事件来添加 [PXDefault] 它可以完美地工作 - 但这对我没有帮助 - 我需要有条件地设置它。
有任何想法吗?
解决方案
必需仅用于显示星号。PXDefault 属性是根据 PersistingCheck 属性值使字段强制的属性。
问题是像 PersistingCheck 这样的 PXUIFieldAttributes 只能在创建图形时设置一次。您可以在构造函数/Initialize 方法中动态设置它,但如果在此之后更改属性,则它没有效果。
当我需要根据动态条件强制某个字段时,我删除 PXDefault 属性并在 RowPersisting 等事件处理程序中手动验证该字段:
public void PMTimeActivity_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
PMTimeActivity timeActivity = e.Row as PMTimeActivity;
if (timeActivity != null && PMTimeActivity.timeSpent == null)
{
PXUIFieldAttribute.SetError<PMTimeActivity.timeSpent>(sender, timeActivity, "'Time Spent' cannot be empty."));
}
}
推荐阅读
- database - 在 AWS 数据库迁移服务中出现外键破坏错误
- java - 如何在 Selenium 中检查表单元素的有效性状态
- css - Vue.js 多条路由之间的动态过渡
- gis - 有什么方法可以方便地使用 GeoJSON 和 Geomesa?
- c - Linux内核中需要始终为真条件的三元运算符是什么?
- c++ - clock_nanosleep 和 sleep_until 有什么区别?
- c - 如何以网络字节顺序从二进制文件中读取并在 c 中创建 struct sockaddr_in
- python - 从两个数据框创建新的数据框。一个df包含列索引,另一个df包含值
- javascript - Mongoose Schema 值未保存到 MongoDB
- c++ - 使用 Visual Studios 16.6 添加包含目录