Искать в Selector - PullRequest
       1

Искать в Selector

0 голосов
/ 14 января 2020

Поиск по умолчанию в acumatica селекторе содержит, и это создает много проблем при вводе данных в один раз селектора на пользовательской странице. Есть ли способ изменить поведение для запуска вместо содержит.

Обновление

Я пробовал следующий код, и это фильтрация на основе запуска с, но не отображение всех столбцов в селекторе

#region Custom Selector Attribute
public class LotSerialNbrSelectionAttribute : PXCustomSelectorAttribute
{
    public LotSerialNbrSelectionAttribute(Type type, Type[] fieldlist)

        : base(type,fieldlist)
    {

    }
    protected virtual IEnumerable GetRecords()
    {
        PXView view = new PXView(this._Graph, !this._DirtyRead, this._Select);
        PXCache lotSerCach = this._Graph.Caches[typeof(InfoLotSerialFilter)];
        List<object> result = new List<object>();
        Int32 totalrow = 0;
        Int32 startrow = PXView.StartRow;
        result = view.Select(PXView.Currents, PXView.Parameters,
                   PXView.Searches, PXView.SortColumns, PXView.Descendings,
                   PXView.Filters, ref startrow, PXView.MaximumRows, ref totalrow);
        PXView.StartRow = 0;
        string searchval = string.Empty;
        if(PXView.Filters.Length > 0)
            searchval = PXView.Filters[0].Value.ToString();

        InfoLotSerialFilter searchrow = lotSerCach.Current as InfoLotSerialFilter;
        foreach(PXResult<INLotSerialStatus> line in result)
        {

            INLotSerialStatus row = line;

            if(string.IsNullOrEmpty(searchval))
                yield return row;
            else
            {
                if(row.LotSerialNbr.StartsWith(searchval))
                    yield return row;
            }
        }
    }
}
#endregion

Вызов атрибута

#region LotSerialNbr
    public abstract class lotSerialNbr : IBqlField
    {
    }
    protected string _LotSerialNbr;
    [PXString(100, IsUnicode = true )]
    [PXUIField(DisplayName = "Serial Number" )]
    [LotSerialNbrSelectionAttribute(typeof(Search2<INLotSerialStatus.lotSerialNbr,InnerJoin<INSite,On<INSite.siteID,Equal<INLotSerialStatus.siteID>>,CrossJoin<MemoSetUp>>,Where<INLotSerialStatus.qtyHardAvail,Greater<decimal0>,And<INLotSerialStatus.siteID,NotEqual<MemoSetUp.memoOutSiteId>>>>),
                new Type[]{typeof(INLotSerialStatus.inventoryID),
                typeof(INLotSerialStatus.lotSerialNbr),
                typeof(INSite.siteCD) }
                )]

    public virtual string LotSerialNbr
    {
        get
        {
            return this._LotSerialNbr;
        }
        set
        {
            this._LotSerialNbr = value;
        }
    }
    #endregion

Результат

enter image description here

InventoryID и SiteID не отображаются в браузере выбора

1 Ответ

1 голос
/ 14 января 2020

Я пробовал измененный код, указанный ниже, и отлично работает

#region Custom Selector Attribute
public class LotSerialNbrSelectionAttribute : PXCustomSelectorAttribute
{
    public LotSerialNbrSelectionAttribute(Type type, Type[] fieldlist)

        : base(type, typeof(INLotSerialStatus.inventoryID), typeof(INLotSerialStatus.lotSerialNbr), typeof(INSite.siteCD))
    {

    }
    protected virtual IEnumerable GetRecords()
    {
        PXView view = new PXView(this._Graph, !this._DirtyRead, this._Select);
        string searchval = string.Empty;
        if (PXView.Filters.Length > 0)
            searchval = PXView.Filters[0].Value.ToString();
        PXView.Filters.Clear();
        //PXCache lotSerCach = this._Graph.Caches[typeof(InfoLotSerialFilter)];
        List<object> result = new List<object>();
        Int32 totalrow = 0;
        Int32 startrow = PXView.StartRow;
        result = view.Select(PXView.Currents, PXView.Parameters,
                   PXView.Searches, PXView.SortColumns, PXView.Descendings,
                   PXView.Filters, ref startrow, 10000, ref totalrow);
        PXView.StartRow = 0;
        foreach(PXResult<INLotSerialStatus,INSite> line in result)
        {

            INLotSerialStatus row = line;

            if(string.IsNullOrEmpty(searchval))
                yield return line;
            else
            {
                if(row.LotSerialNbr.StartsWith(searchval))
                    yield return line;
            }
        }
    }
}
#endregion

enter image description here

...