将屏幕ID转换为其站点地图屏幕标题

时间:2015-12-15 18:26:58

标签: acumatica

我正在寻找一个Acumatica框架调用,它根据当前屏幕ID为我提供给定屏幕的站点地图标题名称。我们有一个事件历史记录页面,我们希望将创建的屏幕ID转换为相关的站点地图标题名称,以便更好地方便用户显示,因为标准用户不知道或不关心屏幕ID。

理想情况下,我们会将其转换为事件历史记录DAC中新字段的字段属性。

例如,我的CreatedScreenID值可能为“SO301000”,我想在该网格中为该特定行显示“销售订单”。为此,我将创建一个名为CreatedScreenTitle的新字段。我正在寻找有关将ID转换为标题的最佳方法的帮助。

由于

2 个答案:

答案 0 :(得分:3)

框架中有一个站点地图提供程序,它将完整的映射存储在缓存中(因此您不需要每次都查询数据库。)

如果你有站点地图ID,你想查询,你可以得到这样的标题:

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; }

答案 1 :(得分:2)

我不确定是否存在框架调用,但您始终可以通过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">