данные не сохраняются в базе данных - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь сохранить запись для следующего 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;

И когда пользователь выбирает значение и нажимает OK на всплывающей панели, он вставляется в базу данных. Вот полный фрагмент кода метода Terminate, который я переопределил.

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();
        }

Я вижу, что код был выполнен. И здесь тоже нет ошибок. Но это не хранится в базе данных.

Точно так же, как примечание ниже, это представление PXFilter для моей всплывающей панели, которое я использую для выбора ReasonID:

public PXFilter<ContractTerminationReason.ContractAndContractTerminationReason> SpecifyTerminationReason;

Спасибо.

1 Ответ

0 голосов
/ 07 июля 2018

Проверяя ваш код, я бы удалил общедоступное свойство 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 может не завершиться и не пометить контракт как расторгнутый. В результате ваша таблица будет иметь расторгнутую причину, а контракт не будет в расторгнутом состоянии. Просто на что посмотреть.

...