首页 > 解决方案 > 数据未存储在数据库中

问题描述

我正在尝试将跟踪 DAC 的记录存储到 ContractMaint 图形扩展中的数据库中。

public class ContractAndContractTerminationReason : IBqlTable
{
    #region ContractAndContractTerminationID
    [PXDBIdentity(IsKey = true)]
    [PXUIField(DisplayName = "Contract And Contract Termination ID")]
    public virtual int? ContractAndContractTerminationID { get; set; }
    public abstract class contractAndContractTerminationID : IBqlField { }
    #endregion

    #region ContractID
    [PXDBInt()]
    [PXUIField(DisplayName = "Contract ID")]
    [PXDBDefault(typeof(Contract.contractID))]
    [PXParent(typeof(Select<Contract, Where<Contract.contractID, Equal<Current<ContractAndContractTerminationReason.contractID>>>>))]
    public virtual int? ContractID { get; set; }
    public abstract class contractID : IBqlField { }
    #endregion

    #region ContractTerminationReasonID
    [PXDBInt()]
    [PXUIField(DisplayName = "Reason")]
    [PXParent(typeof(Select<
            ContractTerminationReason,
            Where<ContractTerminationReason.contractTerminationReasonID, Equal<Current<ContractAndContractTerminationReason.contractTerminationReasonID>>>>))]
    [PXSelector(typeof(Search<
            ContractTerminationReason.contractTerminationReasonID,
            Where<ContractTerminationReason.contractID, Equal<Current<Contract.templateID>>>>), DescriptionField = typeof(ContractTerminationReason.description))]
    public virtual int? ContractTerminationReasonID { get; set; }
    public abstract class contractTerminationReasonID : IBqlField { }
    #endregion
}

在 ContractMaint 图形扩展中,我创建了以下视图。

public PXSelect<ContractAndContractTerminationReason> ContractAndContractTerminationReasons;

当用户选择值并在弹出面板上单击“确定”时,它会插入数据库中。这是我覆盖的“终止”方法的完整代码片段。

public delegate void TerminateDelegate();
        [PXOverride]
        public void Terminate(TerminateDelegate baseMethod)
        {
            Contract contractTemplate = PXSelect<Contract, Where<Contract.contractID, Equal<Current<Contract.templateID>>>>.Select(Base);
            bool isContractTerminationReasonEnabled = contractTemplate.GetExtension<ContractExt>().UsrEnableTerminationReason == null ? false : (bool)contractTemplate.GetExtension<ContractExt>().UsrEnableTerminationReason;
            if (isContractTerminationReasonEnabled)
            {
                if (SpecifyTerminationReason.AskExt(
                delegate
                {
                }) == WebDialogResult.OK)
                {
                    using (var ts = new PXTransactionScope())
                    {
                        try
                        {
                            ContractAndContractTerminationReasons.Insert(contractAndContractTerminationReason);
                            ContractAndContractTerminationReasons.Cache.IsDirty = true;
                            Base.Actions.PressSave();
                            ts.Complete();
                        }
                        catch (Exception ex)
                        {
                            PXTrace.WriteError(ex);
                        }
                    }
                }
            }
            //baseMethod();
        }

我可以看到代码已被执行。而且也没有错误。但它没有存储在数据库中。

正如下面的注释是我用来选择 ReasonID 的弹出面板的 PXFilter 视图:

public PXFilter<ContractTerminationReason.ContractAndContractTerminationReason> SpecifyTerminationReason;

谢谢你。

标签: acumatica

解决方案


查看您的代码,我将删除公共 DAC 属性并使用视图/缓存来存储数据。

在您的图形扩展中,您有以下我认为您不需要的内容。使用视图/缓存是首选方法。

ContractAndContractTerminationReason contractAndContractTerminationReason = new ContractAndContractTerminationReason();

因此,您可以删除ContractAndContractTerminationReason_ContractTerminationReasonID_FieldUpdated事件并仅使用过滤器当前值(假设它们具有您需要的值)。

这是最简单的形式。您共享的项目中没有页面条目或表格条目,因此我从示例中删除了面板提示。这将保存记录。

public class ContractMaint_Extension : PXGraphExtension<ContractMaint>
{
    public PXSelect<ContractAndContractTerminationReason> ContractAndContractTerminationReasons;

    public delegate void TerminateDelegate();
    [PXOverride]
    public virtual void Terminate(TerminateDelegate baseMethod)
    {
        var newRow = new ContractAndContractTerminationReason
        {
            ContractID = Base.Contracts.Current.ContractID,
            ContractTerminationReasonID = 2 //SpecifyTerminationReason.Current.ContractTerminationReasonID
        };

        ContractAndContractTerminationReasons.Insert(newRow);
        ContractAndContractTerminationReasons.Cache.Persist(PXDBOperation.Insert);
        ContractAndContractTerminationReasons.Cache.Clear();

        baseMethod();
    }
}

您正在使用的代码是否提示面板?对于过滤器,我通常会创建一个过滤器 DAC,而不是使用相同的 DAC 来执行更新。也许这会导致您的问题。

您将遇到的一个问题是,当 baseMethod 可能未完成且未将合同标记为已终止时,您正在保留记录。因此,您的桌子将有一个终止的原因,而合同没有处于终止状态。只是需要注意的事情。


推荐阅读