使用另一个字段的选择填充网格中的字段
Populate Field in Grid with selection of another Field
这特别适用于 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'
我觉得这与数据库值的设置有关,因为它们一开始是大写而不是小写。如果有人对此有所了解,我将不胜感激。
以大写字母开头的字段名称引用 属性 值字段。
以小写字母开头的字段名称引用字段的类型。
在 BQL 查询中,您不向查询提供字段的值。您提供字段类型,因此您必须使用小写首字母:
PXSelect<FSEquipment,
Where<FSEquipment.sMEquipmentID, Equal<Required<FSSODetService.sMEquipmentID>>>>
在 BQL 查询参数中,您使用 属性 值而不是类型,因此您使用大写字母:
.Select(Base, service.ServiceID)
编辑:
您在 FieldService 产品的命名约定中发现了一个错误。
而不是像这样制作第一个字母 upper/lower 大小写:'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 产品的一部分,因此它确实有一些其他的命名约定差异:
这特别适用于 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'
我觉得这与数据库值的设置有关,因为它们一开始是大写而不是小写。如果有人对此有所了解,我将不胜感激。
以大写字母开头的字段名称引用 属性 值字段。 以小写字母开头的字段名称引用字段的类型。
在 BQL 查询中,您不向查询提供字段的值。您提供字段类型,因此您必须使用小写首字母:
PXSelect<FSEquipment,
Where<FSEquipment.sMEquipmentID, Equal<Required<FSSODetService.sMEquipmentID>>>>
在 BQL 查询参数中,您使用 属性 值而不是类型,因此您使用大写字母:
.Select(Base, service.ServiceID)
编辑: 您在 FieldService 产品的命名约定中发现了一个错误。 而不是像这样制作第一个字母 upper/lower 大小写:'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 产品的一部分,因此它确实有一些其他的命名约定差异: