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