Acumatica: запуск проверки сохранения на другой пользовательской кнопке - PullRequest
0 голосов
/ 08 марта 2019

Добрый день!

Как вы запускаете проверки представления при нажатии пользовательской кнопки? Например, у меня есть обязательное поле Amount в ЦАПе, и оно имеет атрибут PXDefault. Если я сохранил запись, не заполнив ее, она естественно вызывает «Ошибка:« Сумма »не может быть пустой» ошибка. Теперь я хочу повторить это поведение, когда сработает другая кнопка, кроме кнопки СОХРАНИТЬ.

Как вы запускаете эту проверку? Я уже пытался добавить атрибут PXUIVerify на само поле, но он уже срабатывал при загрузке страницы, я пытался отключить его, добавив свойство Attribute CheckOnRowSelected = false, но безрезультатно. Он все еще вызывает проверку.

Любые предложения и ответы приветствуются. Большое вам спасибо.

Дополнительный вопрос:

Как правильно проверить форму?

Ответы [ 2 ]

1 голос
/ 16 июля 2019

Проверка того, является ли поле пустым, происходит в событии RowPersisting в PXDefaultAttribute. Проверка наличия ошибок на экране происходит в событии CommandPreparing в PXUIFieldAttribute.

Поскольку вы на самом деле не сохраняете, было бы проще повторить проверку, а не пытаться ее «запустить». Следующий фрагмент кода пытается повторить проверку путем проверки каждой записи в кэше для каждого представления на графике.

public static void Validate(PXGraph graph)
{
    for (int k = 0; k < graph.Views.Caches.Count; ++k)
    {
        PXCache cache = graph.Caches[graph.Views.Caches[k]];
        PXEntryStatus status;

        foreach (object rec in cache.Cached)
        {
            status = cache.GetStatus(rec);

            if (cache.GetStatus(rec) == PXEntryStatus.Updated || cache.GetStatus(rec) == PXEntryStatus.Inserted)
            {
                cache.Current = rec;

                foreach (PXDefaultAttribute attribute in cache.GetAttributesReadonly(rec, null).OfType<PXDefaultAttribute>())
                {
                    CheckDefaultAttribute(attribute.PersistingCheck, attribute.FieldName, rec, cache);
                }

                foreach (PXDBDefaultAttribute attribute in cache.GetAttributesReadonly(rec, null).OfType<PXDBDefaultAttribute>())
                {
                    CheckDefaultAttribute(attribute.PersistingCheck, attribute.FieldName, rec, cache);
                }

                // Verifies that there are no errors on the page.
                foreach (IPXInterfaceField field in cache.GetAttributesReadonly(rec, null).OfType<IPXInterfaceField>())
                {
                    if (!string.IsNullOrEmpty(field.ErrorText) && (field.ErrorLevel == PXErrorLevel.Error || field.ErrorLevel == PXErrorLevel.RowError))
                    {
                        throw new PXException(field.ErrorText);
                    }
                }
            }
        }
    }
}

// Verifies that the field has a value if the PersistingCheck is not PXPersistingCheck.Nothing
protected static void CheckDefaultAttribute(PXPersistingCheck persistingCheck, string fieldName, object row, PXCache cache)
{
    if (persistingCheck != PXPersistingCheck.Nothing)
    {
        object value = cache.GetValue(row, fieldName);

        if (value == null || (persistingCheck == PXPersistingCheck.NullOrBlank && value is string && ((string)value).Trim() == string.Empty))
        {
            throw new PXException(ErrorMessages.FieldIsEmpty, PXUIFieldAttribute.GetDisplayName(cache, fieldName));
        }
    }
}

Как отказ от ответственности, эта методология пропустит любую проверку, которая произойдет в пользовательском событии RowPersisting.

1 голос
/ 08 марта 2019

Вы можете вызвать событие RaiseFieldVerifying. Посмотрите на график ARDocumentEnq, кнопка CreateInvoice (Enter New Invoice) вызывает события FieldVerifying и FieldUpdated, вызывая их. Вы можете поймать исключение, как на графике INTransferEntry:

protected virtual void INRegister_TransferType_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
    INRegister row = (INRegister)e.Row;
    {
        object toSiteID = row.ToSiteID;
        try
        {
            sender.RaiseFieldVerifying<INRegister.toSiteID>(row, ref toSiteID);
            sender.RaiseExceptionHandling<INRegister.toSiteID>(row, toSiteID, null);
        }
        catch (PXSetPropertyException ex)
        {
            sender.RaiseExceptionHandling<INRegister.toSiteID>(row, toSiteID, new PXSetPropertyException(ex, PXErrorLevel.Error, Messages.WarehouseNotAllowed, Messages.OneStep));
        }
    }
}
...