当尝试使用REST作为现场服务服务项目或库存项目到达FSAppointmentDet.InventoryID
时,我遇到SQL错误。
表中存在InventoryID
字段,但是,看起来DAC已被继承,例如FSAppointmentDetService
。
其他字段起作用,似乎ID的字段正在引起SQL错误。
在这种情况下,SQL错误是找不到多步标识符。运行SQL事件探查器跟踪并查看SQL,看起来该表已在查询的一部分中而不是在另一部分中被别名。显然,这种情况的发生程度远远低于我们所能达到的水平,因此寻找有关如何获取InventoryID
用于现场服务详细记录的解决方法或想法。
答案 0 :(得分:0)
我已经看到,当一个DAC继承自另一个DAC时(继承于类继承的继承不像DAC扩展那样扩展)时,会发生这种情况,而无需重新声明其关键字段。解决方法是在子级中添加父键抽象类字段。
FSAppointmentDetService似乎缺少AppointmentID密钥声明。当ORM构建SQL查询时,它会为继承的DAC生成别名,但由于在子代中未全部重新声明父代的键字段,因此它感到困惑。
在FSAppointmentDet中,您有2个关键字段:
#region AppointmentID
public abstract class appointmentID : PX.Data.IBqlField
{
}
[PXDBInt(IsKey = true)]
[PXParent(typeof(Select<FSAppointment, Where<FSAppointment.appointmentID, Equal<Current<FSAppointmentDet.appointmentID>>>>))]
[PXDBLiteDefault(typeof(FSAppointment.appointmentID))]
[PXUIField(DisplayName = "Appointment Nbr.")]
public virtual int? AppointmentID { get; set; }
#endregion
#region AppDetID
public abstract class appDetID : PX.Data.IBqlField
{
}
[PXDBIdentity(IsKey = true)]
public virtual int? AppDetID { get; set; }
#endregion
但是在FSAppointmentDetService中,仅其中之一被重新声明。请注意,与未覆盖的FSAppointmentDet相比,它是如何使用“覆盖”来重新声明的:
#region AppDetID
public new abstract class appDetID : PX.Data.IBqlField
{
}
[PXDBIdentity(IsKey = true)]
public override int? AppDetID { get; set; }
#endregion
在这种情况下,我们无法将字段添加到该DAC,因为它是基本产品的一部分。我认为有可能创建一个继承自FSAppointmentDetService的新DAC,在其中添加丢失的密钥,并使用该新继承的DAC而不是FSAppointmentDetService。
但是我不知道在使用Web服务时是否有可能。如果不是,则必须在Acumatica基本产品中进行更改。您可以在Acumatica支持下填写错误报告,以在将来的版本中完成。