#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) { }