Как правильно расширить CustomerPaymentMethod? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть кое-что, что работает, но, конечно, не кажется правильным

Желание: добавить одно поле в качестве расширения для кода / таблицы CustomerPaymentMethod - все ниже

Проблема: Зачем мне поле PaymentMethodID и как его заполнить, если оно необходимо?

Запущено без этого в таблице БД ИЛИ ЦАП.Это загружает / работает в прямом доступе к AR303010 (метод оплаты клиента), но завершается неудачно при соединении SQL из AR303000 (клиент AR)

Если я просто добавляю в таблицу, то получаю «Невозможно вставить ноль в поле»

Если я добавлю в ЦАП, то продолжу получать Null в БД (только в таблице расширений)

Так что это работает, но, конечно, не кажется правильным.Предполагается, что в таблице расширений НЕ требуется идентификатор PaymentMethodID, поскольку в ЦАП из файла «CustomerPaymentMethod.cs» он НЕ помечен как «IsKey = true».Если мне это нужно, то я надеюсь, что оно будет заполнено автоматически как часть ключа

Таблица:

Create Table XPMCustomerPaymentMethodExt (
    [CompanyID] [int] NOT NULL DEFAULT ((0)),
    [PMInstanceID] [int] NOT NULL,
    [BAccountID] [int] NOT NULL,
    [PaymentMethodID] [nvarchar](10) NULL,  /* Problem Child, if not here, fails to load customer screen (AR303000) */
    [CanConsolidate] [bit] NULL,
    [DeletedDatabaseRecord] [bit] NOT NULL DEFAULT ((0)),
 CONSTRAINT [PK_XPMCustomerPaymentMethodExt] PRIMARY KEY CLUSTERED 
(
    [CompanyID] ASC,
    [PMInstanceID] ASC
    )
    )

ЦАП:

[PXTable(IsOptional = true)]
public class XPMCustomerPaymentMethodExt : PXCacheExtension<PX.Objects.AR.CustomerPaymentMethod>
{
    #region CanConsolidate
    public abstract class canConsolidate : PX.Data.IBqlField
    {
    }
    protected bool? _CanConsolidate = false;
    [PXDBBool]
    [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Payments may be consolidated")]
    public virtual bool? CanConsolidate
    {
        get
        {
            return _CanConsolidate;
        }
        set
        {
            _CanConsolidate = value;
        }
    }
    #endregion

    #region PaymentMethodID
    public abstract class paymentMethodID : PX.Data.IBqlField
    {
    }
    protected string _PaymentMethodID; // = Base.PaymentMethodID;
    [PXMergeAttributes(Method = MergeMethod.Merge)]
    [PXDBString(10, IsUnicode = true)]
    //[PXDefault(typeof(CustomerPaymentMethod.paymentMethodID), PersistingCheck = PXPersistingCheck.Nothing)]
    //[PXFormula(typeof(Selector<CustomerPaymentMethod.pMInstanceID, CustomerPaymentMethod.paymentMethodID>))]
    public virtual String PaymentMethodID
    {
        get
        {
            //return Base.PaymentMethodID;
            return _PaymentMethodID;
        }
        set
        {
            // Base.PaymentMethodID = value;
            _PaymentMethodID = value;
        }
    }
    #endregion
}

1 Ответ

0 голосов
/ 06 марта 2019

Это не типично, чтобы найти PXMergeAttributes в расширении кэша. Наиболее близким к сообщению об ошибке "Unable to insert null into field" является проверка PXDefault PXPersistingCheck.

Если у вас есть этот атрибут в поле, попытка сохранить значение null для этого поля приведет к ошибке, аналогичной той, которую вы упомянули:

[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]

Похоже, вы это закомментировали, но я думаю, что он все еще там из-за PXMergeAttributes:

[PXMergeAttributes(Method = MergeMethod.Merge)]
[PXDBString(10, IsUnicode = true)]
//[PXDefault(typeof(CustomerPaymentMethod.paymentMethodID), PersistingCheck = PXPersistingCheck.Nothing)]
//[PXFormula(typeof(Selector<CustomerPaymentMethod.pMInstanceID, CustomerPaymentMethod.paymentMethodID>))]

Если в поле Base DAC есть PXDefault, и вы добавляете атрибут PXMergeAttributes, то это приводит к объединению атрибутов Base DAC и Extension DAC, тем самым сохраняя PXDefault Base DAC и обеспечивая, что значение этого поля никогда не равно нулю, если выбрасываются ошибки проверки.

...