将屏幕 ID 翻译成它的站点地图屏幕标题

Translate a screen ID into it's sitemap screen title

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

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

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

谢谢

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

您也可以随时从您的网格 select 方法中调用此方法

像这样

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

另一种选择是在您的字段中添加 selector。像这样:

[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)
{}

然后将网格中的显示类型更改为"Text"

<px:PXGridColumn DataField="SiteMapTitle" Width="200px" DisplayMode="Text">

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

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