数据未存储在数据库中

时间:2018-07-04 16:50:49

标签: acumatica

我正在尝试将用于后续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;

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

 DispatchQueue.global(qos: .background).async {
       SKStoreReviewController.requestReview()
 }

因此,您可以删除ContractAndContractTerminationReason contractAndContractTerminationReason = new ContractAndContractTerminationReason(); 事件,而仅使用过滤器的当前值(假设它们具有所需的值)。

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

ContractAndContractTerminationReason_ContractTerminationReasonID_FieldUpdated

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

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