C# CRCase_行选择在后续保存时激发下一个案例

C# CRCase_行选择在后续保存时激发下一个案例,c#,acumatica,C#,Acumatica,我为CRCaseMaint创建了一个扩展,并添加了事件CRCase\u row selection。以下是我当前使用的代码: protected virtual void CRCase_RowSelecting(PXCache sender, PXRowSelectingEventArgs e) { CRCase row = e.Row as CRCase; if (row == null) return; PXDatabase.

我为
CRCaseMaint
创建了一个扩展,并添加了事件
CRCase\u row selection
。以下是我当前使用的代码:

    protected virtual void CRCase_RowSelecting(PXCache sender, PXRowSelectingEventArgs e)
    {
        CRCase row = e.Row as CRCase;
        if (row == null) return;

        PXDatabase.ResetSlot<List<CRCase>>("OriginalCase");
        List<CRCase> originalCaseSlot = PXDatabase.GetSlot<List<CRCase>>("OriginalCase");

        if (originalCaseSlot.Count == 0)
        {
            originalCaseSlot.Add(sender.CreateCopy(row) as CRCase);
        }
        else
        {
            originalCaseSlot[0] = sender.CreateCopy(row) as CRCase;
        }
    }
protected virtual void CRCase\u行选择(PXCache sender,pxrowselectioningeventargs e)
{
CRCase行=e行作为CRCase;
if(row==null)返回;
PXDatabase.ResetSlot(“OriginalCase”);
List originalCaseSlot=PXDatabase.GetSlot(“OriginalCase”);
if(originalCaseSlot.Count==0)
{
originalCaseSlot.Add(sender.CreateCopy(行)作为CRCase);
}
其他的
{
originalCaseSlot[0]=发送方.CreateCopy(行)作为CRCase;
}
}
当我第一次打开一个案例时,这个事件会触发几次,最后一次触发时,当前案例正确地存储在e.Row中,所以这个代码非常有效。单击“保存”时,会出现一个
行持久化
事件,将存储在
原始CaseSlot
中的案例与更新后的案例进行比较。最后,它将原始案例槽设置为更新案例。这也很有效

但是,当我在不离开案例的情况下进行另一次更改并单击保存时,
rowselection
事件上的
e.Row
现在存储的是下一个案例,而不是当前案例。因为我没有以任何方式涉及下一个案例,所以我对这种情况的发生感到惊讶

我的问题是,我应该使用不同的事件而不是
行选择
,还是缺少其他一些内容


谢谢大家的帮助。

有时,当主记录更新或用户单击表单工具栏按钮时,框架会从数据库中选择两条记录:当前主记录和下一条记录。这就是为什么在下一个CRCase记录中第二次调用
rowselection

老实说,使用PXDatabase slot存储特定于用户会话的记录不是一个好主意PXDatabase插槽在所有用户会话之间共享,仅用于缓存来自数据库的常用数据,而数据库不容易频繁更新。这使得PXDatabase Slots的主要目的是将数据库查询的数量减少到广泛且经常使用的可配置数据,如段键或属性配置

话虽如此,使用
行选择
处理程序无疑是朝着正确方向迈出的一步。此外,在
行选择
处理程序中,还应另外定义一个单独的PrevVersionCase数据视图,以存储原始CRCase记录,并覆盖持久化方法以报告更改。PXCache对象上使用的Locate方法在缓存中搜索与提供的数据记录具有相同关键字段的数据记录。此方法允许比较原始缓存和修改的CRCase记录之间的更改,这些记录具有相同的关键字字段值

public class CRCaseMaintExt : PXGraphExtension<CRCaseMaint>
{
    [Serializable]
    public class CRPrevVersionCase : CRCase
    { }

    public PXSelect<CRPrevVersionCase> PrevVersionCase;

    protected virtual void CRCase_RowSelecting(PXCache sender, PXRowSelectingEventArgs e)
    {
        CRCase row = e.Row as CRCase;
        if (row == null || e.IsReadOnly) return;

        var versionCase = new CRPrevVersionCase();
        var versionCache = PrevVersionCase.Cache;
        sender.RestoreCopy(versionCase, row);
        if (versionCache.Locate(versionCase) == null)
        {
            versionCache.SetStatus(versionCase, PXEntryStatus.Held);
        }
    }

    [PXOverride]
    public void Persist(Action del)
    {
        var origCase = Base.Case.Current;
        var origCache = Base.Case.Cache;
        CRPrevVersionCase versionCase;

        if (origCache.GetStatus(origCase) == PXEntryStatus.Updated)
        {
            versionCase = new CRPrevVersionCase();
            origCache.RestoreCopy(versionCase, origCase);
            versionCase = PrevVersionCase.Cache.Locate(versionCase) as CRPrevVersionCase;

            if (versionCase != null)
            {
                foreach (var field in Base.Case.Cache.Fields)
                {
                    if (!Base.Case.Cache.FieldValueEqual(origCase, versionCase, field))
                    {
                        PXTrace.WriteInformation(string.Format(
                            "Field {0} was updated", field));
                    }
                }
            }
        }

        del();

        if (origCase != null)
        {
            PrevVersionCase.Cache.Clear();
            versionCase = new CRPrevVersionCase();
            Base.Case.Cache.RestoreCopy(versionCase, origCase);
            PrevVersionCase.Cache.SetStatus(versionCase, PXEntryStatus.Held);
        }
    }
}

public static class PXCacheExtMethods
{
    public static bool FieldValueEqual(this PXCache cache, 
        object a, object b, string fieldName)
    {
        return Equals(cache.GetValue(a, fieldName), cache.GetValue(b, fieldName));
    }
}
public类CRCaseMaintExt:PXGraphExtension
{
[可序列化]
公共类CRPrevVersionCase:CRCase
{ }
公共PXSelect PreversionCase;
受保护的虚拟无效CRCase\u行选择(PXCache发送方,PXRowSelectingEventArgs e)
{
CRCase行=e行作为CRCase;
if(row==null | | e.IsReadOnly)返回;
var versionCase=new CRPrevVersionCase();
var versionCache=preversioncase.Cache;
sender.RestoreCopy(versionCase,row);
if(versionCache.Locate(versionCase)==null)
{
SetStatus(versionCase,PXEntryStatus.hold);
}
}
[PXOverride]
公共无效持续(操作del)
{
var origCase=Base.Case.Current;
var origCache=Base.Case.Cache;
CRPrevVersionCase;
if(origCache.GetStatus(origCase)==PXEntryStatus.Updated)
{
versionCase=新的CRPrevVersionCase();
origCache.RestoreCopy(版本酶,origCase);
versionCase=PrevVersionCase.Cache.Locate(versionCase)作为CRPrevVersionCase;
if(versionCase!=null)
{
foreach(Base.Case.Cache.Fields中的变量字段)
{
如果(!Base.Case.Cache.FieldValueEqual(origCase、versionCase、field))
{
PXTrace.WriteInformation(string.Format(
“字段{0}已更新”,字段“);
}
}
}
}
del();
if(origCase!=null)
{
PrevVersionCase.Cache.Clear();
versionCase=新的CRPrevVersionCase();
Base.Case.Cache.RestoreCopy(versionCase,origCase);
PrevVersionCase.Cache.SetStatus(versionCase,PXEntryStatus.hold);
}
}
}
公共静态类PXCacheExtMethods
{
public static bool FieldValueEqual(此PXCache缓存,
对象a、对象b、字符串字段名)
{
返回等于(cache.GetValue(a,fieldName),cache.GetValue(b,fieldName));
}
}

行选择代码的目标是什么?也许你可以比较一下RowSelecting和view.current记录中的行。我非常感谢你帮我们解决了这个问题!我真的很感激花时间为我自己和其他想做类似事情的人提供这些信息。我感觉数据库插槽在整个实例中共享。谢谢你帮我核实。不客气,@JoeS!请点击左边的“检查”按钮接受答案好吗?