使用REST尝试获取现场服务详细信息-InventoryID = SQL错误:找不到多部分标识符

时间:2018-10-30 20:10:47

标签: rest acumatica

当尝试使用REST作为现场服务服务项目或库存项目到达FSAppointmentDet.InventoryID时,我遇到SQL错误。

表中存在InventoryID字段,但是,看起来DAC已被继承,例如FSAppointmentDetService

其他字段起作用,似乎ID的字段正在引起SQL错误。

在这种情况下,SQL错误是找不到多步标识符。运行SQL事件探查器跟踪并查看SQL,看起来该表已在查询的一部分中而不是在另一部分中被别名。显然,这种情况的发生程度远远低于我们所能达到的水平,因此寻找有关如何获取InventoryID用于现场服务详细记录的解决方法或想法。

1 个答案:

答案 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支持下填写错误报告,以在将来的版本中完成。