将屏幕 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; }
我正在寻找一个 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; }