【问题标题】:Translate a screen ID into it's sitemap screen title将屏幕 ID 翻译成它的站点地图屏幕标题
【发布时间】:2015-12-17 01:56:47
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: acumatica


    【解决方案1】:

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

    如果你有站点地图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; }
    

    【讨论】:

    • 这正是我想要的。甚至包括我需要为我们的 dac/grid 创建的属性 - 谢谢 Philippe
    【解决方案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">
    

    【讨论】:

    • 杰夫 - 虽然你的答案应该可以回答这个问题,但我发现菲利普的答案是两个答案的更好解决方案。感谢您的快速回复和支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多