2016-06-09 3 views
1

В Acumatica есть случаи, когда ЦАП для экрана (например, Проекты) напрямую не привязан к таблице (PMProject), но наследует ЦАП, привязанный к таблице (Контракт). Есть ли хороший источник справочной информации для этого?Создайте ЦАП, который наследуется от другого ЦАП

ответ

3

Эта тема частично покрыта учебным курсом T200 (пример 9.1).

Основные принципы:

Если вы унаследовали некоторый класс DAC2 от DAC1 привязанного к таблице SQL, то 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 генерировать запросы SQL с DAC2 поле вы должны заменить абстрактный класс этого поля в 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