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

Acumatica 将屏幕ID转换为其站点地图屏幕标题,acumatica,Acumatica,我正在寻找一个Acumatica框架调用,该调用根据当前屏幕id为我提供给定屏幕的站点地图标题名称。我们有一个事件历史页面,我们希望将创建的屏幕id转换为相关的站点地图标题名称,以便更好地显示用户友好性,因为标准用户不知道或不关心屏幕id 理想情况下,我们会将其转换为事件历史DAC中新字段的字段属性 例如,我可能有一个CreatedScreenID值SO301000,我想在我们的网格中显示该特定行的销售订单。为此,我将创建一个名为CreatedScreentile的新字段。我正在寻找帮助的最佳方

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

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

例如,我可能有一个CreatedScreenID值SO301000,我想在我们的网格中显示该特定行的销售订单。为此,我将创建一个名为CreatedScreentile的新字段。我正在寻找帮助的最佳方式来翻译的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;
}
您也可以从网格选择方法中调用它

像这样的

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)
{}
public abstract class createdScreenTitle : PX.Data.IBqlField
{
}
[SiteMapTitle(typeof(createdByScreenID))]
[PXUIField(DisplayName = "Created Screen", Visible = true, Enabled = false)]
public virtual String CreatedScreenTitle { get; set; }
然后将网格中的显示类型更改为文本

<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;
            }
        }
    }
}
然后您可以这样使用它:

[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)
{}
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/网格创建的属性-谢谢PhilippeJeff-而您的答案应该能够回答我发现Philippe的答案是两个答案中更好的解决方案的问题。感谢您的快速回复和支持。