Acumatica 图扩展上缓存中插入的记录未保存到数据库

Acumatica 图扩展上缓存中插入的记录未保存到数据库,acumatica,Acumatica,我在INReceiptEntry上有一个扩展图。我为自定义DAC设置了一个视图,我希望为其生成一个缓存,以便将对象插入其中。生成一个要插入缓存的对象后,使用ViewName.insert(Object);(还使用了ViewName.Cache.Insert(对象),具有相同的结果)在图形扩展的行持久化处理程序中。这通常会将数据项存储在与DAC关联的相应数据库数据表中,但数据库中不会存储任何内容。而不是If语句激发,我得到一个弹出窗口,说明对象未插入。这是我的密码: public class IN

我在INReceiptEntry上有一个扩展图。我为自定义DAC设置了一个视图,我希望为其生成一个缓存,以便将对象插入其中。生成一个要插入缓存的对象后,使用ViewName.insert(Object);(还使用了ViewName.Cache.Insert(对象),具有相同的结果)在图形扩展的行持久化处理程序中。这通常会将数据项存储在与DAC关联的相应数据库数据表中,但数据库中不会存储任何内容。而不是If语句激发,我得到一个弹出窗口,说明对象未插入。这是我的密码:

public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry>
{
    public PXSelect<EMPWorkOrderINRegister> WorkOrderINRegisters;

    #region Event Handlers

    protected void INRegister_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
    {
        var row = (INRegister)e.Row;

        var rowExt = PXCache<INRegister>.GetExtension<INRegisterExt>(row);

        //Get Target Objects
        foreach (INTranSplit split in PXSelect<INTranSplit, Where<INTranSplit.refNbr, 
            Equal<Required<INRegister.refNbr>>, And<INTranSplit.tranType, Equal<TranType>>>>
            .Select(Base, Base.CurrentDocument.Current.RefNbr))
        {
            EMPWorkOrderINRegister WOINR = new EMPWorkOrderINRegister();
            WOINR.Woid = rowExt.Usrwoid;
            WOINR.RefNbr = split.RefNbr;
            WOINR.SplitLineNbr = split.SplitLineNbr;
            if (WorkOrderINRegisters.Insert(WOINR) == null)
            {
                Base.CurrentDocument.Ask("Did not insert WOINR:" + WOINR.RefNbr.ToString()  + ", " + WOINR.SplitLineNbr.ToString(), MessageButtons.OK);
                return;
            }
        }
    }
    #endregion
}
ReceiptEntry_扩展中的公共类:pxGrapherExtension { 公共登记册; #区域事件处理程序 注册表中受保护的空存储持久化(PXCache缓存,PXRowPersistingEventArgs e) { var row=(在注册表中)e.row; var rowExt=PXCache.GetExtension(行); //获取目标对象 foreach(在PXSelect中拆分) .选择(Base,Base.CurrentDocument.Current.RefNbr)) { EMPWorkOrderINRegister WOINR=新的EMPWorkOrderINRegister(); WOINR.Woid=rowExt.Usrwoid; WOINR.RefNbr=split.RefNbr; WOINR.SplitLineNbr=split.SplitLineNbr; if(WorkOrderINRegisters.Insert(WOINR)==null) { Base.CurrentDocument.Ask(“未插入WOINR:”+WOINR.RefNbr.ToString()+“,“+WOINR.SplitLineNbr.ToString(),MessageButtons.OK”); 返回; } } } #端区 } 有没有理由不将其插入自定义缓存?使用图形扩展或在持久化函数中执行此缓存插入与此失败的原因有关吗

经请求,发援会:

using System;
using PX.Data;
using PX.Objects.IN;

namespace Manufacturing
{
[Serializable]
public class EMPWorkOrderINRegister : IBqlTable
    {


    #region Id

    [PXDBIdentity()]
    [PXUIField(DisplayName = "Id")]
    public int? Id { get; set; }

    public class id : IBqlField { }

    #endregion


    #region Woid

    [PXDBInt()]
    [PXUIField(DisplayName = "Woid")]
    public int? Woid { get; set; }

    public class woid : IBqlField { }

    #endregion


    #region RefNbr

    [PXDBString(15, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "Receipt Number")]
    public string RefNbr { get; set; }

    public class refNbr : IBqlField { }

    #endregion

    #region SplitLineNbr

    [PXDBInt()]
    [PXUIField(DisplayName = "Split Line Nbr")]
    public int? SplitLineNbr { get; set; }

    public class splitLineNbr : IBqlField { }

    #endregion

    #region AvailableSNs
    [PXString()]
    [PXUIField(DisplayName = "Available SNs")]
    public string AvailableSNs { get; set; }

    public class availableSNs : IBqlField { }
    #endregion


    [PXString()]
    [PXDBScalar(typeof(Search<INTranSplit.lotSerialNbr, Where<INTranSplit.refNbr, Equal<EMPWorkOrderINRegister.refNbr>,
      And<INTranSplit.splitLineNbr, Equal<EMPWorkOrderINRegister.splitLineNbr>>>>))]
    public string SelectedSN { get; set; }
    public class selectedSN : IBqlField { }

    }
}
使用系统;
使用PX数据;
使用PX.Objects.IN;
名称空间制造
{
[可序列化]
公共类EMPWorkOrderINRegister:IBqlTable
{
#区域Id
[PXDBIdentity()]
[PXUIField(DisplayName=“Id”)]
公共int?Id{get;set;}
公共类id:IBqlField{}
#端区
#世界区域
[PXDBInt()]
[PXUIField(DisplayName=“Woid”)]
公共int?Woid{get;set;}
公共类woid:IBqlField{}
#端区
#区域参考编号
[PXDBString(15,IsUnicode=true,InputMask=”“)]
[PXUIField(DisplayName=“收据编号”)]
公共字符串RefNbr{get;set;}
公共类refNbr:IBqlField{}
#端区
#区域拆分NBR
[PXDBInt()]
[PXUIField(DisplayName=“分割线编号”)]
公共int?SplitLineNbr{get;set;}
公共类splitLineNbr:IBqlField{}
#端区
#区域可用性
[PXString()]
[PXUIField(DisplayName=“可用SNs”)]
可用公共字符串ns{get;set;}
公共类可用性ns:IBqlField{}
#端区
[PXString()]
[PXDBScalar(类型(搜索))]
公共字符串SelectedSN{get;set;}
公共类selectedSN:IBqlField{}
}
}

Eric,您的DAC存在一个主要问题,即缺少关键字段

INRegister_Row持久化处理程序的其他改进领域。行持久化处理程序设计用于在将数据记录提交到数据库之前验证数据记录,或取消特定数据记录的提交操作。有关更多详细信息,请参阅


对于您的场景,更好的方法是重写Persist方法,并在执行基本Persist方法之前插入缺少的EMPWorkOrderINRegister记录。如果基本持久化方法失败,使用try-catch语句并删除状态为插入的EMPWorkOrderINRegister记录也是一个好主意。

Eric,DAC存在一个主要问题,即缺少键字段

INRegister_Row持久化处理程序的其他改进领域。行持久化处理程序设计用于在将数据记录提交到数据库之前验证数据记录,或取消特定数据记录的提交操作。有关更多详细信息,请参阅


对于您的场景,更好的方法是重写Persist方法,并在执行基本Persist方法之前插入缺少的EMPWorkOrderINRegister记录。如果基本Persist方法失败,使用try-catch语句删除状态为插入的EMPWorkOrderINRegister记录也是一个好主意。

是否检查了DAC中的键?此外,字段是否用“PXDB”属性修饰?你能在这里发布你的DAC代码吗?我添加了DAC代码。按照@RuslanDev的建议尝试设置[PXDBIdentity(IsKey=true)]。你检查了DAC中的密钥了吗?此外,字段是否用“PXDB”属性修饰?你能在这里发布你的DAC代码吗?我添加了DAC代码。请按照@RuslanDev的建议尝试设置[PXDBIdentity(IsKey=true)]。Ruslan,PXDBIdentity字段可用作键吗?如何仅覆盖“Persist”函数?在Acumatica内置的自定义UI中,我没有看到为该函数生成覆盖的任何选项,在帮助中也没有看到任何选项(特别是API引用->事件模型->事件)。在发布之后,我确实意识到将其放入行持久化并不是一个好的选择,因此我尝试将其放置在其他位置,但很难使其正常工作。只有当PXDBIdentity属性的IsKey属性设置为
True
时,PXDBIdentity字段才会变为键字段。否则,系统将PXDBIdentity字段视为常规非关键字段。有关重写的持久化方法的示例,请检查步骤7.4:在T300培训课程中重写持久化方法。在Acumatica Customization Guide()中覆盖一个虚拟方法主题也是值得检查的!再次感谢你,罗斯兰。我回顾了我的其他DAC,发现我仍然在PXDBIdentity字段上使用IsKey,所以我不知道是什么