#acumatica
#acumatica
Вопрос:
Добрый день!
Как вы запускаете проверки представления при нажатии пользовательской кнопки? Например, у меня есть обязательное поле Amount в DAC, и оно имеет атрибут PXDefault. Если я сохранил запись, не заполнив ее, это, естественно, вызовет ошибку «Ошибка: ‘Amount’ не может быть пустым». Теперь отсюда я хочу повторить это поведение при срабатывании другой кнопки, кроме кнопки СОХРАНЕНИЯ.
Как вы запускаете эту проверку? Я уже пытался добавить атрибут PXUIVerify в само поле, но он уже срабатывал во время загрузки страницы, я пытался отключить его, добавив свойство атрибута CheckOnRowSelected = false, но безрезультатно, он по-прежнему запускает проверку.
Приветствуются любые предложения и ответы. Большое вам спасибо.
Дополнительный вопрос:
Каков правильный способ проверки формы?
Ответ №1:
Проверка того, является ли поле пустым, происходит в событии 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) amp;amp; (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 amp;amp; value is string amp;amp; ((string)value).Trim() == string.Empty))
{
throw new PXException(ErrorMessages.FieldIsEmpty, PXUIFieldAttribute.GetDisplayName(cache, fieldName));
}
}
}
В качестве оговорки, эта методология пропустит любую проверку, которая произошла бы в пользовательском событии RowPersisting.
Ответ №2:
Вы можете вызвать событие RaiseFieldVerifying. Проверьте график ARDocumentEnq, кнопка для CreateInvoice (Введите новый счет) вызывает события FieldVerifying и FieldUpdated, запуская их. Вы можете перехватить исключение, как в графике внутренней передачи:
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));
}
}
}
Комментарии:
1. Привет @KRichardson, есть ли какой-нибудь динамический способ для этого? Я имею в виду, есть ли у меня способ запустить проверку полей, которые имеют атрибуты PXDefault? Например, у меня есть 10 обязательных полей, и перед сохранением записи мне нужно нажать кнопку обработать, теперь я хочу вызвать ошибку в этих обязательных полях, есть ли способ для меня запускать эти поля динамически? без выполнения метода RaiseExceptionHandling?
2. Кнопка Save.Press() запустила бы всю необходимую проверку полей, но вы хотели проверить перед сохранением. В прошлом я писал пользовательскую логику для процессов на графиках, которые требуют проверки, отличной от ввода данных, например, для «проверки» документа в целом, и включал их прямо в выполнение кнопки. Это может быть лучшим способом обработки требуемых значений перед попыткой
3. Я надеюсь, что существуют методы, которые можно вызвать для проверки кэша в целом. но в любом случае, спасибо за предложения и ответ, я подумаю о способе проверки графического представления в целом.