这特别适用于Acumatica的服务管理模块。在服务订单屏幕(SD300100)和人工选项卡下。我们希望在创建新行并选择型号时,将根据所选的型号自动填充服务ID。
我编码了这个:
protected void FSSODetService_ServiceID_FieldSelecting(PXCache cache, PXFieldSelectingEventArgs e)
{
var service = (FSSODetService)e.Row;
if (service == null) return;
var equipment = (FSEquipment)PXSelect<FSEquipment,
Where<FSEquipment.SMEquipmentID, Equal<Required<FSSODetService.SMEquipmentID>>>>.Select(Base, service.ServiceID);
if (equipment != null)
{
e.ReturnValue = equipment.EquipmentTypeID;
}
}
这在发布时给我留下了这个错误。
\App_RuntimeCode\ServiceOrderEntry.cs(54): error CS0118: 'FieldService.ServiceDispatch.FSEquipment.SMEquipmentID' is a 'property' but is used like a 'type'
\App_RuntimeCode\ServiceOrderEntry.cs(54): error CS0118: 'FieldService.ServiceDispatch.FSSODet.SMEquipmentID' is a 'property' but is used like a 'type'
我觉得它与数据库值的设置有关,因为它们在开头而不是小写时是首都。如果有人对此有一些了解,我将不胜感激。
答案 0 :(得分:1)
以大写字母开头的字段名称引用属性值字段。 以较低字母开头的字段名称引用字段的类型。
在BQL查询中,您不向查询提供字段的值。您提供字段的类型,因此您必须使用小写的第一个字母:
PXSelect<FSEquipment,
Where<FSEquipment.sMEquipmentID, Equal<Required<FSSODetService.sMEquipmentID>>>>
在BQL查询参数中,您使用属性值而不是类型,因此您使用大写字母:
.Select(Base, service.ServiceID)
修改强> 您在FieldService产品的命名约定中发现了一个错误。 而不是像第一个字母大写/小写:'sMEquipmentID'/'SMEquipmentID'
public abstract class sMEquipmentID : PX.Data.IBqlField { }
public virtual int? SMEquipmentID { get; set; }
他们选择了第三个字母:'SMequipmentID'/'SMEquipmentID'
public abstract class SMequipmentID : PX.Data.IBqlField { }
public virtual int? SMEquipmentID { get; set; }
因此,对于此字段(而不是所有其他字段),您应该在BQL查询中使用小写的第三个字母“SMequipmentID”。
如果您无法访问源代码,您仍然可以使用Visual Studio或ILSpy等其他实用程序打开ServiceDispatch.DLL来搜索和检查类型名称。由于ServiceDispatch最初不是Acumatica核心产品的一部分,因此它确实存在一些其他命名约定差异: