Переопределение персистентного клиента создает проблему NextMove при удалении - PullRequest
0 голосов
/ 23 октября 2019

При попытке удалить клиента появляется следующая ошибка:

An unhandled exception has occurred in the function 'MoveNext'

enter image description here

Я думаю, что мне нужно добавить это, если заявление иличто-то похожее.

if(Base.BAccount.Cache.GetStatus(CCustomer) != PXEntryStatus.InsertedDeleted || Base.BAccount.Cache.GetStatus(CCustomer) != PXEntryStatus.Deleted)

Я нашел пару ссылок с этой проблемой, но не связанных со страницей клиента.

public delegate void PersistDelegate();
    [PXOverride]
    public void Persist(PersistDelegate baseMethod)
    {
        using (var scope = new PXTransactionScope())
        {
            Customer row = this.Base.BAccount.Current;
            if (row.ParentBAccountID == null)
            {
                CustomerMaint businessAccount = PXGraph.CreateInstance<CustomerMaint>();
                PXResultset<Customer> Children = PXSelect<Customer, Where<Customer.parentBAccountID, Equal<Required<Customer.bAccountID>>>>.Select(Base, row.BAccountID);
                foreach (Customer item in Children)
                {
                    businessAccount.Clear();
                    businessAccount.BAccount.Current = PXSelectorAttribute.Select<Customer.bAccountID>(this.Base.BAccount.Cache, item.BAccountID) as Customer;
                    item.TermsID = row.TermsID;
                    item.Status = row.Status;
                    Contact defContact = PXSelect<Contact, Where<Contact.bAccountID, Equal<Required<BAccount.bAccountID>>, And<Contact.contactID, Equal<Required<BAccount.defContactID>>>>>.Select(businessAccount, item.BAccountID, item.DefContactID);
                    defContact.EMail = this.Base.DefContact.Current.EMail;
                    businessAccount.DefContact.Update(defContact);
                    businessAccount.BAccount.Update(item);
                    businessAccount.Save.PressButton();
                }
            }
            baseMethod();
            scope.Complete();
        }
       }

Я надеюсь, что есть проверка, которую я могу встроить, или что-то ещеэто может устранить ошибку MoveNext при удалении.

1 Ответ

1 голос
/ 23 октября 2019

Попробуйте использовать тот же шаблон, что и базовый класс CustomerMaint, который использует методы UpdateChildAccounts и GetChildAccounts для изменения дочерних учетных записей.

    protected virtual void Customer_PrintDunningLetters_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {
        Customer row = (Customer)e.Row;
        CheckExcludedFromDunning(cache, row);
        UpdateChildAccounts<Customer.printDunningLetters>(cache, row, GetChildAccounts(sharedCreditPolicy: true));
    }

    protected virtual void Customer_Status_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {
        Customer row = e.Row as Customer;
        if (row == null) return;

        if (row.ParentBAccountID == null)
        {
            Func<Customer, bool> func;
            string newValue = GetSharedCreditChildStatus(row.Status, out func);
            UpdateChildAccounts<Customer.status>(cache, row, GetChildAccounts(sharedCreditPolicy: true).Where(func), newValue);
        }
    }

    protected virtual void Customer_ConsolidateToParent_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
    {
        Customer row = (Customer)e.Row;
        if (row == null) return;

        if (row.ParentBAccountID == null)
        {
            IEnumerable<Customer> childs;
            string message = PXMessages.LocalizeFormatNoPrefix(Messages.RelatedFieldChangeOnParentWarning,
                PXUIFieldAttribute.GetDisplayName<Customer.consolidateToParent>(sender));

            if ((childs = GetChildAccounts()).Any() && e.ExternalCall)
            {
                if (CurrentCustomer.Ask(message, MessageButtons.YesNo) == WebDialogResult.Yes)
                {
                    UpdateChildAccounts<Customer.consolidateToParent>(sender, row, childs);
                }
            }

            row.SharedCreditPolicy &= row.ConsolidateToParent;
        }
        else if (row.SharedCreditPolicy == true && row.ConsolidateToParent != true && (bool?)e.OldValue == true)
        {
            sender.SetValueExt<Customer.sharedCreditPolicy>(row, false);
        }
    }

protected virtual void UpdateChildAccounts<Field>(PXCache cache, Customer parent, IEnumerable<Customer> enumr, object sourceValue = null)
    where Field : IBqlField
{
    if (PXAccess.FeatureInstalled<FeaturesSet.parentChildAccount>() &&
        parent != null &&
        parent.ParentBAccountID == null)
    {
        sourceValue = sourceValue ?? cache.GetValue<Field>(parent);
        foreach (Customer child in enumr)
        {
            if (sourceValue != cache.GetValue<Field>(child))
            {
                cache.SetValue<Field>(child, sourceValue);
                cache.Update(child);
            }
        }
    }
}

protected virtual IEnumerable<Customer> GetChildAccounts(bool sharedCreditPolicy = false, bool consolidateToParent = false, bool consolidateStatements = false)
{
    if (PXAccess.FeatureInstalled<FeaturesSet.parentChildAccount>())
    {
        PXSelectBase<Customer> select = new PXSelect<Customer, Where<Customer.parentBAccountID, Equal<Current<Customer.bAccountID>>>>(this);
        if (sharedCreditPolicy)
        {
            select.WhereAnd<Where<Customer.sharedCreditPolicy, Equal<True>>>();
        }
        if (consolidateToParent)
        {
            select.WhereAnd<Where<Customer.consolidateToParent, Equal<True>>>();
        }
        if (consolidateStatements)
        {
            select.WhereAnd<Where<Customer.consolidateStatements, Equal<True>>>();
        }

        return select.Select().RowCast<Customer>();
    }

    return Enumerable.Empty<Customer>();
}

В противном случае создайте новый DAC, наследуемый от Customer, для хранениядетей и создать представление данных для них в графе. Затем вы можете изменить дочерние элементы в этом представлении данных, и они будут автоматически сохраняться при вызове пользователем действия Сохранить из пользовательского интерфейса.

[Serializable]
public partial class OtherCustomer : Customer
{
    public new abstract class bAccountID : PX.Data.BQL.BqlInt.Field<bAccountID> { }
}

PXSelect<OtherCustomer, Where< … >> OtherCustomers;
...