Расширение Acumatica APInvoice позволяет быстро проверить - PullRequest
1 голос
/ 04 февраля 2020

Версия 19.110.0013

Я создал таблицу расширений внутреннего соединения для APInvoice. Это вызвало проблему с потоком быстрых проверок. В частности, создание быстрой проверки создает запись в таблице APInvoice, но не соответствующую запись в таблице расширений.

Мой DA C

using PX.Data;
using PX.Objects.AP;
namespace MyProject.DAC
{
    [PXTable(IsOptional = false)]
    [Serializable()]
    public class ApInvoiceExtension : PXCacheExtension<APInvoice>
    {
        #region MyCustomFlag
        public abstract class myCustomFlag : IBqlField { }
        [PXDBBool()]
        [PXUIField(DisplayName = "Custom Flag")]
        public virtual bool? MyCustomFlag { get; set; }
        #endregion          
    }
}

Моя таблица

CREATE TABLE [dbo].[ApInvoiceExtension](
    [CompanyID] [int] NOT NULL,
    [DocType] [char](3) NOT NULL,
    [RefNbr] [nvarchar](15) NOT NULL,
    [MyCustomFlag] [bit] NULL,
 CONSTRAINT [ApInvoiceExtension_PK] PRIMARY KEY CLUSTERED 
(
    [CompanyID] ASC,
    [DocType] ASC,
    [RefNbr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ApInvoiceExtension] ADD  DEFAULT ((0)) FOR [CompanyID]
GO

Я вполне уверен, что это связано с определением APQuickCheck, которое является DA C со следующим атрибутом

[PXProjection(typeof(Select2<APRegister,
    InnerJoin<APInvoice, On<APInvoice.docType, Equal<APRegister.docType>,
        And<APInvoice.refNbr, Equal<APRegister.refNbr>>>,
    InnerJoin<APPayment, On<APPayment.docType, Equal<APRegister.docType>,
        And<APPayment.refNbr, Equal<APRegister.refNbr>>>>>,
    Where<APRegister.docType, Equal<APDocType.quickCheck>,
        Or<APRegister.docType, Equal<APDocType.voidQuickCheck>>>>), Persistent = true)]

Сохранение в соответствии с этим прогнозом игнорирует требуемые записи расширения. Я задавался вопросом, была ли проблема, потому что APInvoice, на который ссылаются здесь, был из пространства имен PX.Objects.AP.Standalone вместо пространства имен PX.Objects.AP, которое я расширил, поэтому я попытался обойти это, создав расширение DA C для этого пространства имен также , Мое расширение выглядело так:

using PX.Data;
using PX.Objects.AP.Standalone;
namespace MyProject.DAC.Standalone
{
    [PXTable(IsOptional = false)]
    [Serializable()]
    public class ApInvoiceExtension : PXCacheExtension<APInvoice>
    {
        #region MyCustomFlag
        public abstract class myCustomFlag : IBqlField { }
        [PXDBBool()]
        [PXUIField(DisplayName = "Custom Flag")]
        public virtual bool? MyCustomFlag { get; set; }
        #endregion          
    }
}

Это дополнение не изменило поведение, Quick Checks по-прежнему создавал запись в APInvoice, но не в моей таблице APInvoiceExtension.

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Вы абсолютно правы, и это из-за атрибута PXProjection. Обратите внимание, что PXProjection не является реальной таблицей, а похож на SQL представление с набором полей, взятых из нескольких таблиц. Вы можете видеть, что проекция APQuickCheck является дочерним APRegister классом - в результате она ничего не знает о расширенных APInvoice полях, и вам нужно добавить их вручную, используя свойство PXDBFieldAttribute.BqlField.

[PXNonInstantiatedExtension]
public class APQuickCheckExtension : PXCacheExtension<APQuickCheck>
{
    #region MyCustomFlag
    public abstract class myCustomFlag : IBqlField { }
    [PXDBBool(BqlField = typeof(ApInvoiceExtension.myCustomFlag))]
    [PXUIField(DisplayName = "Custom Flag")]
    public virtual bool? MyCustomFlag
    {
        get;
        set;
    }
    #endregion
}

[PXTable(IsOptional = false)]
[Serializable()]
public class ApInvoiceExtension : PXCacheExtension<APInvoice>
{
    #region MyCustomFlag
    public abstract class myCustomFlag : IBqlField { }
    [PXDBBool()]
    [PXUIField(DisplayName = "Custom Flag")]
    public virtual bool? MyCustomFlag { get; set; }
    #endregion
}

AP Quick Check with custom flag

enter image description here

0 голосов
/ 28 февраля 2020

Закончилось открытие дела с Acumatica. Ответ был таким, что мне нужно было расширить APRegister, а не APInvoice. Закончилось изменение APInvoice на APRegister (пришлось засыпать мои записи), и это сработало.

using PX.Data;
using PX.Objects.AP;
namespace MyProject.DAC
{
    [PXTable(IsOptional = false)]
    [Serializable()]
    public class ApRegisterExtension : PXCacheExtension<ApRegister>
    {
        #region MyCustomFlag
        public abstract class myCustomFlag : IBqlField { }
        [PXDBBool()]
        [PXUIField(DisplayName = "Custom Flag")]
        public virtual bool? MyCustomFlag { get; set; }
        #endregion          
    }
}

CREATE TABLE [dbo].[ApRegisterExtension](
    [CompanyID] [int] NOT NULL,
    [DocType] [char](3) NOT NULL,
    [RefNbr] [nvarchar](15) NOT NULL,
    [MyCustomFlag] [bit] NULL,
 CONSTRAINT [ApRegisterExtension_PK] PRIMARY KEY CLUSTERED 
(
    [CompanyID] ASC,
    [DocType] ASC,
    [RefNbr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ApRegisterExtension] ADD  DEFAULT ((0)) FOR [CompanyID]
GO
0 голосов
/ 04 февраля 2020

При создании таблицы расширений необходимо указать ключи базовой таблицы как ссылку в PXTable (или, по крайней мере, это требовалось еще в 5.X, когда мы впервые начали использовать расширения таблицы).

Расширение DA C может выглядеть следующим образом:

[PXTable(typeof(APInvoice.docType), typeof(APInvoice.refNbr), IsOptional = false)]
[Serializable]
public class ApInvoiceExtension : PXCacheExtension<APInvoice>
{
    #region MyCustomFlag
    public abstract class myCustomFlag : IBqlField { }
    [PXDBBool()]
    [PXUIField(DisplayName = "Custom Flag")]
    public virtual bool? MyCustomFlag { get; set; }
    #endregion          
}

Еще одно примечание: поскольку ваша таблица не является обязательной, вам необходимо предварительно заполнить таблицу расширений из базовой таблицы, чтобы у вас были все строки 1 для 1 Я бы порекомендовал установить для IsOptional значение true. Если задано значение false, и у вас есть запись APInvoice без соответствующей записи APInvoiceExtension, отображаемые значения на экранах и селекторах могут отображаться или работать неправильно.

...