Acumatica - Попытка добавить INItemXRef AlternatID в универсальный поиск.
Я посмотрел на другой вопрос, который, возможно, был дубликатом моего вопроса, но Acumatica предложил ему другой подход, и он не получил никаких ответов, надеясь, что ему повезет больше:
Добавление INItemXRef в глобальный поиск с элементом инвентаря
Цель — универсальный поиск по артикулу клиента. Acumatica посоветовала создать фиктивный экран обслуживания INItemXRef и добавить NoteID с возможностью поиска в DAC для ссылки на этот экран. Ниже моя первая попытка добавить NoteID, но я получаю ошибки компиляции:
public class INItemXRefExt : PXCacheExtension<PX.Objects.IN.INItemXRef>
{
#region NoteID
[PXDBGuid]
[PXUIField(DisplayName = "NoteID")]
[PXSearchable(SM.SearchCategory.IN,
"{0}: {1}",
new Type[] { typeof(INItemXRef.alternateType), typeof(INItemXRef.inventoryID)},
new Type[] { typeof(INItemXRef.descr), typeof(INItemXRef.alternateID) }, // add fields you want to be searchable
NumberFields = new Type[] { typeof(INItemXRef.inventoryID) },
Line1Format = "{0}{1}", Line1Fields = new Type[] { typeof(INItemClass.itemClassCD), typeof(INItemXRef.alternateID)},
Line2Format = "{0}", Line2Fields = new Type[] { typeof(INItemXRef.descr) },
//WhereConstraint = typeof(Where<Current<InventoryItem.itemStatus>, NotEqual<InventoryItemStatus.unknown>>),
SelectForFastIndexing = typeof(Select<INItemXRef>) // this is required so that search knows how to index your fields
)]
//[PXNote(PopupTextEnabled = true)]
//public Guid? NoteID { get; set; }
public virtual Guid? NoteID { get; set; }
public abstract class NoteID : IBqlField { }
#endregion
}
При компиляции я получаю эту ошибку проверки: \App_RuntimeCode\INITemXRef.cs(28): ошибка CS0102: тип "PX.Objects.IN.INItemXRefExt" уже содержит определение для "NoteID"
Сначала я подумал, что причина в том, что поле уже было создано в предыдущем запуске (я думаю, что это было), и public abstract class NoteID : IBqlField { }
, по сути, пытался заставить его дублировать поле. Поэтому я закомментировал строку и получил это:
Базовое свойство отсутствует или IBqlField не определен: NoteID в расширении PX.Objects.IN.INItemXRefExt
Я уверен, что с моим атрибутом поиска также есть много проблем, и я буду обновлять вопрос по мере его развития, но на данный момент я в тупике на этапе компиляции.
Обновлять:
Благодаря ответам ниже я смог немного переписать и все скомпилировать. Следующий шаг — выяснить, почему результаты немного странные. интересно, я не могу выполнить универсальный поиск и найти какой-либо элемент, если он не имеет перекрестной ссылки, а затем отображает только информацию о базовом элементе, хотя я пытаюсь отобразить альтернативный код (коды) и описания (я). Новый код:
#region NoteID
public abstract class noteID : PX.Data.IBqlField
{
}
protected Guid? _NoteID;
[PXSearchable(SM.SearchCategory.IN,
"{0}: {1}",
new Type[] { typeof(INItemXRef.alternateType), typeof(INItemXRef.inventoryID)},
new Type[] { typeof(INItemXRef.descr), typeof(INItemXRef.alternateID) }, // add fields you want to be searchable
NumberFields = new Type[] { typeof(INItemXRef.inventoryID) },
Line1Format = "{0}{1}", Line1Fields = new Type[] { typeof(INItemClass.itemClassCD), typeof(INItemXRef.alternateID)},
Line2Format = "{0}", Line2Fields = new Type[] { typeof(INItemXRef.descr) },
//WhereConstraint = typeof(Where<Current<InventoryItem.itemStatus>, NotEqual<InventoryItemStatus.unknown>>),
SelectForFastIndexing = typeof(Select<INItemXRef>) // this is required so that search knows how to index your fields
)]
[PXNote(DescriptionField = typeof(INItemXRef.inventoryID),
Selector = typeof(INItemXRef.inventoryID))]
public virtual Guid? NoteID
{
get
{
return this._NoteID;
}
set
{
this._NoteID = value;
}
}
#endregion
Я заметил, что и в коде из cbetabeta это имеет смысл, учитывая то, как работают остальные типы/свойства в Acumatica.
Вы можете просмотреть один из готовых DAC, который содержит поле NoteID, и просмотреть его для получения рекомендаций. Например, взгляните на определение поля INRegister.NoteID:
#region NoteID
public abstract class noteID : PX.Data.IBqlField
{
}
protected Guid? _NoteID;
[PXSearchable(SM.SearchCategory.IN, "{0}: {1}", new Type[] { typeof(INRegister.docType), typeof(INRegister.refNbr) },
new Type[] { typeof(INRegister.tranDesc), typeof(INRegister.extRefNbr), typeof(INRegister.transferNbr) },
NumberFields = new Type[] { typeof(INRegister.refNbr) },
Line1Format = "{0}{1:d}{2}{3}{4}", Line1Fields = new Type[] { typeof(INRegister.extRefNbr), typeof(INRegister.tranDate), typeof(INRegister.transferType), typeof(INRegister.transferNbr), typeof(INRegister.status) },
Line2Format = "{0}", Line2Fields = new Type[] { typeof(INRegister.tranDesc) },
WhereConstraint = typeof(Where<INRegister.docType, NotEqual<INDocType.production>, And<INRegister.docType, NotEqual<INDocType.disassembly>>>)
)]
[PXNote(DescriptionField = typeof(INRegister.refNbr),
Selector = typeof(INRegister.refNbr))]
public virtual Guid? NoteID
{
get
{
return this._NoteID;
}
set
{
this._NoteID = value;
}
}
#endregion
Обратите внимание на использование атрибута PXNote (и отсутствие использования атрибута PXDBGuid). Вы можете попробовать аналогичный подход, но только сначала с PXNote, чтобы убедиться, что он правильно компилируется. Затем вы можете добавить PXSearcheable и начать работать над ним.
Это сработало для компиляции и даже включило его в универсальный поиск. Обновлю мой вопрос новым кодом.
На этот конкретный вопрос был дан ответ, но для того, чтобы поиск работал так, как мне нужно, мне придется пойти в другом направлении, создав совершенно новый ЦАП, BLC и экран обслуживания. Спасибо за помощь!
В вашем коде у вас дважды есть первая буква NoteID в верхнем регистре. Guid должен быть NoteID в верхнем регистре, а абстрактный класс должен быть в нижнем регистре первой буквы noteID.