Переведите идентификатор экрана в заголовок экрана карты сайта.

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

В идеале мы преобразуем это в атрибут поля для нового поля в нашем DAC истории событий.

Например, у меня может быть значение CreatedScreenID «SO301000», которое я хочу отображать «Заказы на продажу» в нашей сетке для этой конкретной строки. Для этой цели я бы создал новое поле CreatedScreenTitle. Я ищу помощь в том, как лучше всего перевести идентификатор в заголовок.

Спасибо


person Brendan    schedule 15.12.2015    source источник


Ответы (2)


В структуре есть поставщик карты сайта, который хранит полное сопоставление в кеше (и, следовательно, вам не нужно будет каждый раз запрашивать БД).

Если у вас есть идентификатор карты сайта, который вы хотите запросить, вы можете получить такой заголовок:

var title = screenID;
var siteMapNode = PXSiteMap.Provider.FindSiteMapNodeByScreenID(screenID);
if (siteMapNode != null)
{
   title = siteMapNode.Title;
}

В вашем случае создание настраиваемого атрибута для отображения значения может быть лучшей идеей:

public class SiteMapTitleAttribute : PXStringAttribute,
                                     IPXFieldSelectingSubscriber
{
    private Type _SiteMapScreenID;
    public SiteMapTitleAttribute(Type siteMapScreenID) : base(50)
    {
        _SiteMapScreenID = siteMapScreenID;
    }

    public override void FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
    {
        if (e.Row == null) return;

        string screenID = sender.GetValue(e.Row, _SiteMapScreenID.Name) as string;
        if (!string.IsNullOrEmpty(screenID))
        {
            var siteMapNode = PXSiteMap.Provider.FindSiteMapNodeByScreenID(screenID);
            if (siteMapNode != null)
            {
                e.ReturnValue = siteMapNode.Title;
            }
        }
    }
}

Затем вы можете использовать его так:

public abstract class createdScreenTitle : PX.Data.IBqlField
{
}
[SiteMapTitle(typeof(createdByScreenID))]
[PXUIField(DisplayName = "Created Screen", Visible = true, Enabled = false)]
public virtual String CreatedScreenTitle { get; set; }
person Philippe    schedule 16.12.2015
comment
Это именно то, что я ищу. Даже включает атрибут, который мне нужно будет создать для нашего ЦАП / сети - Спасибо, Филипп - person Brendan; 17.12.2015

Я не уверен, есть ли вызов фреймворка, но вы всегда можете сделать это с помощью запроса BQL. Либо присоединен к другому запросу, либо сам по себе.

Если вы сделаете это самостоятельно, что-то вроде этого сработает

PX.SM.SiteMap sitemap = PXSelect<PX.SM.SiteMap, Where<PX.SM.SiteMap.screenID, Equal<Required<PX.SM.SiteMap.screenID>>>>.Select(this, sitemapid);
if (sitemap != null && sitemap.Title != null)
{
    mytitle = sitemap.Title;
}

Вы всегда можете вызвать это из своего метода выбора сетки

Что-то вроде этого

PXSelect<MyGrid> GridResults;
protected virtual IEnumerable gridResults()
{
    [....MY BASE SELECT HERE....]
    foreach......
    {
       MyGrid gridrow = new MyGrid();
       [STUFF]
       PX.SM.SiteMap sitemap = PXSelect<PX.SM.SiteMap, Where<PX.SM.SiteMap.screenID, Equal<Required<PX.SM.SiteMap.screenID>>>>.Select(this, sitemapid);
       if (sitemap != null && sitemap.Title != null)
       {
            gridrow.SiteMapTitle = sitemap.Title;
       }
       yield return gridrow
     }
}

Другой вариант - добавить селектор в ваше поле. Что-то вроде этого:

[PXDBCreatedByScreenID()]
[PXSelector(typeof(Search3<SiteMap.screenID,
OrderBy<Asc<SiteMap.screenID>>>), typeof(SiteMap.screenID), typeof(SiteMap.title),
DescriptionField = typeof(SiteMap.title))]
[PXUIField(DisplayName = "Created By")]
public virtual void MyDAC_SiteMapTitle_CacheAttached(PXCache cache)
{}

Затем измените тип отображения в сетке на «Текст».

<px:PXGridColumn DataField="SiteMapTitle" Width="200px" DisplayMode="Text">
person Jeff Williams    schedule 15.12.2015
comment
Джефф - Хотя ваш ответ должен работать, чтобы ответить на вопрос, я нашел ответ Филиппа лучшим решением из двух. Спасибо за быстрый ответ и поддержку. - person Brendan; 17.12.2015