Поле учетной записи строки PO не будет сохраняться

#acumatica

#acumatica

Вопрос:

В PO я не могу получить поле учетной записи строки PO (ExpenseAcctID) для сохранения. Значение отображается в пользовательском интерфейсе обычно, и когда я проверяю значение в обработчиках FieldUpdated, RowUpdated и RowPersisted, поле действительно имеет значение. Каким-то образом оно не сохраняется в БД. Поле было настроено, как показано ниже. Поле в .ASPX указан как PXSelector. Есть идеи?

     [PXMergeAttributes(Method = MergeMethod.Replace)]
    [PXRestrictor(typeof(Where<Account.active, Equal<True>>), PX.Objects.GL.Messages.AccountInactive)]
    [PXRestrictor(typeof(Where<Where<Current<GLSetup.ytdNetIncAccountID>, IsNull,
                        Or<Account.accountID, NotEqual<Current<GLSetup.ytdNetIncAccountID>>>>>), PX.Objects.GL.Messages.YTDNetIncomeSelected)]
    [PXDimensionSelector(AccountAttribute.DimensionName,
        typeof(SearchFor<Account.accountID>
                .In<SelectFrom<Account>
                    .LeftJoin<PMBudget>.On<Account.accountGroupID.IsEqual<PMBudget.accountGroupID>>
                    .Where<
                        Where<POLine.lineType.FromCurrent.IsEqual<POLineType.nonStock>
                            .And<Where<PMBudget.projectID.IsEqual<POLine.projectID.FromCurrent>
                            .And<Where<PMBudget.projectTaskID.IsEqual<POLine.taskID.FromCurrent>
                            .And<Where<PMBudget.costCodeID.IsEqual<POLine.costCodeID.FromCurrent>
                            .And<Where<PMBudget.curyRevisedAmount.IsGreater<Zero>
                            .And<Where<PMBudget.accountGroupID.IsNotNull>
                            >>>>>>>>>
                        .Or<Where<POLine.lineType.FromCurrent.IsNotEqual<POLineType.nonStock>
                            .Or<Where<POLine.projectID.FromCurrent.IsNull
                            .Or<Where<POLine.taskID.FromCurrent.IsNull
                            .Or<Where<POLine.costCodeID.FromCurrent.IsNull
                            >>>>>>>>>>
                    .AggregateTo<GroupBy<Account.accountID>>
                    .OrderBy<Account.accountCD.Asc>>),
            typeof(Account.accountCD),
            new Type[] { typeof(Account.accountCD), typeof(Account.description), typeof(Account.accountGroupID), typeof(PMBudget.curyRevisedAmount),
                typeof(PMBudget.projectID), typeof(PMBudget.projectTaskID), typeof(PMBudget.costCodeID) },
            DescriptionField = typeof(Account.description),
            Filterable = false
            )]
    [PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Account", Visibility = PXUIVisibility.Visible)]
    protected void POLine_ExpenseAcctID_CacheAttached(PXCache cache)
    {
    }
  

Комментарии:

1. Не добавляю в качестве ответа, потому что я не уверен. Я думаю , что Acumatica больше не знает, что это поле базы данных. Попробуйте добавить [PXDBInt] . Вы заменили ранее определенный атрибут [Account], который содержал в нем атрибут [PXDBInt] , но ваша замена не сообщает Acumatica, что это поле базы данных, поскольку оно больше не имеет ссылки на PXDBInt .

2. Это сработало, так что продолжайте и добавьте в качестве ответа, если хотите. 🙂 Я думал о том, чтобы попробовать это на самом деле, но класс POLine не включил его, поэтому я этого не сделал. Однако, как вы упомянули, класс AccountAttribute сделал, но я этого не уловил. Спасибо!

Ответ №1:

Acumatica требуется атрибут [PXDBInt], чтобы связать поле с базой данных. Исходное определение поля в DAC:

 #region ExpenseAcctID
public abstract class expenseAcctID : PX.Data.BQL.BqlInt.Field<expenseAcctID> { }
protected Int32? _ExpenseAcctID;
[Account(typeof(POLine.branchID),DisplayName = "Account", Visibility = PXUIVisibility.Visible, Filterable = false, DescriptionField = typeof(Account.description), AvoidControlAccounts = true)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
public virtual Int32? ExpenseAcctID
{
    get
    {
        return this._ExpenseAcctID;
    }
    set
    {
        this._ExpenseAcctID = value;
    }
}
#endregion
  

Атрибут [Учетная запись] содержит следующие атрибуты, которые применяются для вас:

 [PXUIField(DisplayName = "Account", Visibility = PXUIVisibility.Visible, FieldClass = DimensionName)]   
[PXDBInt]
[PXInt]
[PXRestrictor(typeof(Where<Account.active, Equal<True>>), Messages.AccountInactive)]
[PXRestrictor(typeof(Where<Where<Current<GLSetup.ytdNetIncAccountID>, IsNull,
    Or<Account.accountID, NotEqual<Current<GLSetup.ytdNetIncAccountID>>>>>), Messages.YTDNetIncomeSelected)]    
  

С помощью [PXMergeAttributes(метод = Метод слияния.Заменить)] в вашем cache_attached все атрибуты в определении DAC для этого поля удаляются и заменяются только тем, что вы определяете.

Вы переключились на [PXDimensionSelector], который не содержит атрибута [PXDBInt] . Это означает, что Acumatica не может знать, что поле предназначено для привязки к базе данных. У вас все еще есть доступ к полю на экране, но при взаимодействии между кэшем и базой данных это поле будет пропущено.

Для разрешения просто добавьте [PXDBInt] в ваш cache_attached следующим образом:

 [PXMergeAttributes(Method = MergeMethod.Replace)]
[PXDBInt]
[PXRestrictor(typeof(Where<Account.active, Equal<True>>), PX.Objects.GL.Messages.AccountInactive)]
[PXRestrictor(typeof(Where<Where<Current<GLSetup.ytdNetIncAccountID>, IsNull,
                    Or<Account.accountID, NotEqual<Current<GLSetup.ytdNetIncAccountID>>>>>), PX.Objects.GL.Messages.YTDNetIncomeSelected)]
[PXDimensionSelector(AccountAttribute.DimensionName,
    typeof(SearchFor<Account.accountID>
            .In<SelectFrom<Account>
                .LeftJoin<PMBudget>.On<Account.accountGroupID.IsEqual<PMBudget.accountGroupID>>
                .Where<
                    Where<POLine.lineType.FromCurrent.IsEqual<POLineType.nonStock>
                        .And<Where<PMBudget.projectID.IsEqual<POLine.projectID.FromCurrent>
                        .And<Where<PMBudget.projectTaskID.IsEqual<POLine.taskID.FromCurrent>
                        .And<Where<PMBudget.costCodeID.IsEqual<POLine.costCodeID.FromCurrent>
                        .And<Where<PMBudget.curyRevisedAmount.IsGreater<Zero>
                        .And<Where<PMBudget.accountGroupID.IsNotNull>
                        >>>>>>>>>
                    .Or<Where<POLine.lineType.FromCurrent.IsNotEqual<POLineType.nonStock>
                        .Or<Where<POLine.projectID.FromCurrent.IsNull
                        .Or<Where<POLine.taskID.FromCurrent.IsNull
                        .Or<Where<POLine.costCodeID.FromCurrent.IsNull
                        >>>>>>>>>>
                .AggregateTo<GroupBy<Account.accountID>>
                .OrderBy<Account.accountCD.Asc>>),
        typeof(Account.accountCD),
        new Type[] { typeof(Account.accountCD), typeof(Account.description), typeof(Account.accountGroupID), typeof(PMBudget.curyRevisedAmount),
            typeof(PMBudget.projectID), typeof(PMBudget.projectTaskID), typeof(PMBudget.costCodeID) },
        DescriptionField = typeof(Account.description),
        Filterable = false
        )]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIField(DisplayName = "Account", Visibility = PXUIVisibility.Visible)]
protected void POLine_ExpenseAcctID_CacheAttached(PXCache cache) { }