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

时间:2017-04-05 14:43:13

标签: acumatica

我在INReceiptEntry上有一个扩展图。我为自定义DAC设置了一个视图,我希望为其生成一个缓存,以便插入对象。在我生成一个我要插入缓存的对象后,我使用ViewName.Insert(Object); (在图扩展的RowPersisting处理程序中也使用了具有相同结果的ViewName.Cache.Insert(Object))。这通常会将数据项存储在与DAC关联的相应数据库数据表中,但DB中不存储任何内容。而不是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
}

这是不是因为没有插入自定义缓存?使用图表扩展或在Persisting函数中执行此缓存插件是否与失败原因有关?

根据要求,DAC:

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 { }

    }
}

1 个答案:

答案 0 :(得分:2)

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

INRegister_RowPersisting处理程序的其他改进领域。 RowPersisting处理程序旨在在数据记录提交到数据库之前验证数据记录或取消特定数据记录的提交操作。有关详细信息,请参阅Acumatica Framework API Reference

更好的方法是在执行基础Persist方法之前覆盖Persist方法并插入缺少的EMPWorkOrderINRegister记录。如果基础Persist方法失败,使用try-catch语句并删除带有插入状态的EMPWorkOrderINRegister记录也是一个好主意。