2016-06-09 60 views
1

在Acumatica中,有一些情況下屏幕的DAC(例如Projects)不直接綁定到表(PMProject),但繼承了綁定到表的DAC(Contract )。有沒有一個很好的教學參考資料來源?創建從其他DAC繼承的DAC

回答

3

本主題部分涵蓋在T200培訓課程中(例9.1)。

基本原則:

如果你繼承綁定到SQL表,然後DAC2也將被綁定到同一個SQL表中的DAC1一些類DAC2。

[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