创建继承自其他DAC的DAC

时间:2016-06-09 21:52:03

标签: acumatica

在Acumatica中,有些情况下屏幕的DAC(例如,项目)不直接绑定到表(PMProject),但是继承了一个绑定到表(合同)的DAC。这样做是否有良好的教学参考资料?

1 个答案:

答案 0 :(得分:3)

T200培训课程(例9.1)部分涵盖了这一主题。

基本原则:

如果从绑定到SQL表的DAC1继承了某个类DAC2,那么DAC2也将绑定到同一个SQL表。

[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
{}

但是,DAC1中的字段将用于生成的SQL查询。

PXSelect<DAC2, Where<DAC2.tableID, Equal<Required<DAC2.tableID>>>(...) ->
SELECT [DAC2].[TableID] FROM DAC1 DAC2 Where [DAC1].[TableID] = @P0

要允许BQL使用DAC2字段生成SQL查询,您应该在DAC2中替换此字段的抽象类

[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类)

[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