创建从其他 DAC 继承的 DAC
Create DAC that inherits from other DAC
在 Acumatica 中,有些情况下屏幕的 DAC(例如项目)不直接绑定到 table (PMProject),而是继承绑定到 [=12= 的 DAC ] (合同)。是否有一个很好的指导参考资料来做这件事?
T200 培训课程(示例 9.1)中部分涵盖了该主题。
基本原则:
如果您从绑定到 SQL table 的 DAC1 继承了一些 class DAC2,那么 DAC2 也将绑定到相同的 SQL table .
[Serializable]
public partial class DAC1 : IBQLTable
{
public abstract class tableID : PX.Data.IBqlField
{
}
[PXDBIdentity()]
public virtual Int32? TableID { get; set;}
}
[Serializable]
public partial class DAC2 : DAC1
{}
但是,生成的 SQL 查询中将使用 DAC1 中的字段。
PXSelect<DAC2, Where<DAC2.tableID, Equal<Required<DAC2.tableID>>>(...) ->
SELECT [DAC2].[TableID] FROM DAC1 DAC2 Where [DAC1].[TableID] = @P0
要允许 BQL 使用 DAC2 字段生成 SQL 查询,您应该替换 DAC2
中此字段的摘要 class
[Serializable]
public partial class DAC2 : DAC1
{
public new abstract class tableID : PX.Data.IBqlField
{
}
}
SQL 查询将如下所示:
SELECT [DAC2].[TableID] FROM DAC1 DAC2 Where [DAC2].[TableID] = @P0
要覆盖字段的属性,您应该覆盖 DAC2
中相应的 属性
[Serializable]
public partial class DAC2 : DAC1
{
public new abstract class tableID : PX.Data.IBqlField
{
}
[PXDBIdentity()]
[PXUIField(DisplayName = "ID")]
public override Int32? TableID {get; set;}
}
如果您希望 DAC2 与 DAC1 不同,例如您希望向 DAC2 添加一些字段,但又希望保持 DAC1 不变,那么您可以使用 PXTable 属性(例如 ARInvoice class)
[PXTable]
[Serializable]
public partial class DAC2 : DAC1
{
public new abstract class tableID : PX.Data.IBqlField
{
}
[PXDBIdentity()]
[PXUIField(DisplayName = "ID")]
public override Int32? TableID {get; set;}
public abstract class description : PX.Data.IBqlField
{
}
[PXDBString(60)]
public virtual String Description{get; set;}
}
SQL 查询将如下所示:
SELECT [DAC2].[TableID], [DAC2.Description]
FROM (SELECT [DAC1].[TableID] as TableID, [DAC2].[Description] as Description
FROM DAC1 Inner Join DAC2 on DAC1.TableID=DAC2.TableID) DAC2
Where [DAC2].[TableID] = @P0
在 Acumatica 中,有些情况下屏幕的 DAC(例如项目)不直接绑定到 table (PMProject),而是继承绑定到 [=12= 的 DAC ] (合同)。是否有一个很好的指导参考资料来做这件事?
T200 培训课程(示例 9.1)中部分涵盖了该主题。
基本原则:
如果您从绑定到 SQL table 的 DAC1 继承了一些 class DAC2,那么 DAC2 也将绑定到相同的 SQL table .
[Serializable]
public partial class DAC1 : IBQLTable
{
public abstract class tableID : PX.Data.IBqlField
{
}
[PXDBIdentity()]
public virtual Int32? TableID { get; set;}
}
[Serializable]
public partial class DAC2 : DAC1
{}
但是,生成的 SQL 查询中将使用 DAC1 中的字段。
PXSelect<DAC2, Where<DAC2.tableID, Equal<Required<DAC2.tableID>>>(...) ->
SELECT [DAC2].[TableID] FROM DAC1 DAC2 Where [DAC1].[TableID] = @P0
要允许 BQL 使用 DAC2 字段生成 SQL 查询,您应该替换 DAC2
中此字段的摘要 class[Serializable]
public partial class DAC2 : DAC1
{
public new abstract class tableID : PX.Data.IBqlField
{
}
}
SQL 查询将如下所示:
SELECT [DAC2].[TableID] FROM DAC1 DAC2 Where [DAC2].[TableID] = @P0
要覆盖字段的属性,您应该覆盖 DAC2
中相应的 属性[Serializable]
public partial class DAC2 : DAC1
{
public new abstract class tableID : PX.Data.IBqlField
{
}
[PXDBIdentity()]
[PXUIField(DisplayName = "ID")]
public override Int32? TableID {get; set;}
}
如果您希望 DAC2 与 DAC1 不同,例如您希望向 DAC2 添加一些字段,但又希望保持 DAC1 不变,那么您可以使用 PXTable 属性(例如 ARInvoice class)
[PXTable]
[Serializable]
public partial class DAC2 : DAC1
{
public new abstract class tableID : PX.Data.IBqlField
{
}
[PXDBIdentity()]
[PXUIField(DisplayName = "ID")]
public override Int32? TableID {get; set;}
public abstract class description : PX.Data.IBqlField
{
}
[PXDBString(60)]
public virtual String Description{get; set;}
}
SQL 查询将如下所示:
SELECT [DAC2].[TableID], [DAC2.Description]
FROM (SELECT [DAC1].[TableID] as TableID, [DAC2].[Description] as Description
FROM DAC1 Inner Join DAC2 on DAC1.TableID=DAC2.TableID) DAC2
Where [DAC2].[TableID] = @P0