扩展中的数据视图自定义

时间:2017-11-08 02:22:40

标签: acumatica

我已经覆盖了扩展中自定义图形的数据视图,它通过重新声明视图和使用委托对象技术来返回正确的数据而不会出现问题。问题在于,当我这样做时,主图中视图上的AllowSelect / AllowDelete修改停止工作,一旦我注释掉覆盖,逻辑就会正常工作。

不确定我缺少什么,但任何想法都会受到赞赏

编辑:为了澄清,在主图上,没有扩展名,数据检索和允许......工作没有问题

public class FTTicketEntry : PXGraph<FTTicketEntry, UsrFTHeader>
    {
        public PXSelect<UsrFTHeader> FTHeader;
        public PXSelect<UsrFTGridLabor, Where<UsrFTGridLabor.ticketNbr, Equal<Current<UsrFTHeader.ticketNbr>>>> FTGridLabor;

使用扩展名时,数据会从修改后的视图中正确返回,但只有在扩展程序中输入时,“允许...”才能从主图中生效

    public class FTTicketEntryExtension : PXGraphExtension<FTTicketEntry>
    {
        public PXSelect<UsrFTGridLabor, Where<UsrFTGridLabor.ticketNbr, Equal<Current<UsrFTHeader.ticketNbr>>, And<UsrFTGridLabor.projectID, Equal<Current<UsrFTHeader.projectID>>, And<UsrFTGridLabor.taskID, Equal<Current<UsrFTHeader.taskID>>>>>> FTGridLabor;   

我还尝试了扩展上的其他进程,结果相同,数据被正确过滤,但Allow ...命令失败。

    public PXSelect<UsrFTGridLabor, Where<UsrFTGridLabor.ticketNbr, Equal<Current<UsrFTHeader.ticketNbr>>>> FTGridLabor;
    public virtual IEnumerable fTGridLabor()
    {
        foreach (PXResult<UsrFTGridLabor> record in Base.FTGridLabor.Select())
        {
            UsrFTGridLabor p = (UsrFTGridLabor)record;
            if (p.ProjectID == Base.FTHeader.Current.ProjectID && p.TaskID == Base.FTHeader.Current.TaskID)
            {
                yield return record;
            }
        }    
    }

我不想使用PXSelectReadOnly的主要问题是,标题上有一个状态字段,当需要某些条件组合并且在行选择的事件上调用时,它们会被驱动,有时是所有事件,有时是无事件,主要是问题是,当我覆盖视图是屏幕扩展的主要意图时,我显然不希望将所有UI逻辑复制到扩展中。

感谢您的帮助,希望您能看到我忽视或错过的东西

由于

2 个答案:

答案 0 :(得分:0)

每个BLC实例都存储2个集合中的所有实际数据视图和操作:视图和操作。无论何时,您自定义数据视图或具有BLC扩展名的操作,原始数据视图/操作都会在扩展类中声明的自定义对象的相应集合中替换。在从适当的集合中删除原始数据视图或操作之后,很明显,对原始对象所做的任何更改都不会产生任何效果,因为BLC不再使用原始对象。

从这两个集合中的任何一个访问实际对象的最简单方法如下:Views["FTGridLabor"].Allow... = value;

或者,您可以在缓存级别使用AllowInsert,AllowUpdate和AllowDelete属性:FTGridLabor.Cache.Allow... = value;

通过更改缓存级别上的AllowXXX属性,您完全无需在数据视图上设置AllowXXX,因为与数据视图级别上的相同属性相比,PXCache.AllowXXX属性具有更高的优先级:

public class PXView
{
    ...
    protected bool _AllowUpdate = true;
    public bool AllowUpdate
    {
        get
        {
            if (_AllowUpdate && !IsReadOnly)
            {
                return Cache.AllowUpdate;
            }
            return false;
        }
        set
        {
            _AllowUpdate = value;
        }
    }
    ...
}

尽管如此,要解决UI Logic不适用于修改后的视图的问题,请考虑以下选项之一:

  1. 通过从Views集合中获取的对象,在原始BLC及其扩展中设置AllowXXX属性值: Views["FTGridLabor"].Allow... = value;

  2. 使用缓存级别的AllowXXX属性值进行操作:FTGridLabor.Cache.Allow... = value;

答案 1 :(得分:-1)

首先检查您的DataView是否应该是PXSelectReadonly的变体。

如果没有更多信息,我的建议是在扩展程序的初始化方法中设置允许属性:

long counter = 0;
long total = image.Width * image.Height * (Color.White - Color.Black);
for(int x = 0; x < image.Width; x++)
{
    for(int y = 0; y < image.Height; y++)
    {
        var p1 = image.GetPixel(x, y);
        var p2 = otherImage.GetPixel(x, y);
        var g1 = ((p1.R + p1.G + p1.B) / 3);
        var g2 = ((p2.R + p2.G + p2.B) / 3);
        var distance = Math.Abs(g1 - g2);
        counter += distance;
    }
}
var similarity = 100 - ((counter / total) * 100);