Поділитися через


Функція помилок

Застосовується до: програм Canvas Програм на основі моделі

Надання відомостей про помилки для попередніх змін у джерелі даних.

Зведення

Помилки можуть виникати в разі змінення запису джерела даних. Із-поміж безлічі можливих причин можна відмітити відключення мережі, відсутність дозволів та конфлікти, пов’язані з редагуванням.

Функції, які змінюють дані в джерелах даних, як-от Patch, Collect, Remove, RemoveIf, Update, UpdateIf і SubmitForm, звітують про помилки у два способи:

  • Кожна з цих функцій повертає значення помилки в результаті операції. Помилки можна виявити за допомогою isError і замінити або приглушити за допомогою ifError і App.OnError, як завжди. Додаткову інформацію див. в розділі Обробка помилок.
  • Після операції функція Errors також повертатиме помилки для попередніх операцій. Це знадобитися для відображення повідомлення про помилку на екрані форми без потреби записування помилки в змінній стану.

Виникненню деяких помилок можна запобігти, якщо скористатися функціями Validate і DataSourceInfo. Пропозиції щодо роботи з помилками та їх уникнення див. в розділі про роботу із джерелами даних.

Опис

Функція Errors повертає таблицю помилок, що містить перелічені нижче стовпці.

  • Record (Запис). Запис у джерелі даних, щодо якого виникла помилка. Якщо помилка сталася під час створення запису, цей стовпець буде пустим.
  • Стовпець. Стовпець, що спричинив помилку, якщо її можна віднести до одного стовпця. В іншому разі цей стовпець буде пустим.
  • Message (Повідомлення). Опис помилки. Цей рядок помилки може відображатися для кінцевого користувача. Зауважте, що повідомлення може створюватися джерелом даних і може бути довгим та містити необроблені імена стовпців, які можуть нічого не означати для користувача.
  • Error (Помилка). Код помилки, який можна використовувати у формулах для усунення помилки.
ErrorKind Опис
ErrorKind.Conflict До того самого запису було внесено іншу зміну, що призвело до конфлікту змінення. Скористайтеся функцією Refresh, щоб перезавантажити запис і знову спробувати внести зміну.
ErrorKind.ConstraintViolation Порушено одне або кілька обмежень.
ErrorKind.CreatePermission Здійснено спробу створити запис, але поточний користувач не має дозволу на створення записів.
ErrorKind.DeletePermission Здійснено спробу видалити запис, але поточний користувач не має дозволу на видалення записів.
ErrorKind.EditPermission Здійснено спробу редагувати запис, але поточний користувач не має дозволу на редагування записів.
ErrorKind.GeneratedValue Здійснено спробу змінити стовпець, який джерело даних створює автоматично.
ErrorKind.MissingRequired У записі відсутнє значення для обов’язкового стовпця.
ErrorKind.None Помилки відсутні.
ErrorKind.NotFound Здійснено спробу редагувати або видалити запис, однак запис не вдалося знайти. Можливо, запис змінив інший користувач.
ErrorKind.ReadOnlyValue Здійснено спробу змінити стовпець лише для читання.
ErrorKind.Sync Джерело даних повідомило про помилку. Додаткові відомості див. в стовпці «Message».
ErrorKind.Unknown Сталася помилка невідомого типу.
ErrorKind.Validation Виявлено загальну проблему перевірки, що не відповідає іншим типам.

Помилки можуть повертатися для всього джерела даних або тільки для вибраного рядка через використання аргументу Record функції.

Функція Patch або інші функції даних можуть повертати пусте значення, якщо, наприклад, не вдалося створити запис. У цих випадках можна передати пусте значення до функції Errors, і вона поверне відповідні відомості про помилки. Подальше застосування функцій даних до того самого джерела даних призведе до видалення цих відомостей про помилки.

У разі відсутності помилок таблиця, яку повертає функція Errors, буде пустою, і її можна перевірити за допомогою функції IsEmpty.

Синтаксис

Errors( DataSource [, Record ] )

  • DataSource — обов’язковий аргумент. Джерело даних, для якого потрібно повернути помилки.
  • Record – необов'язковий аргумент. Певний запис, для якого потрібно повернути помилки. Якщо не вказати цей аргумент, функція повертатиме помилки для всього джерела даних.

Приклади

Покрокові інструкції

У цьому прикладі будемо працювати з джерелом даних IceCream (Морозиво).

Морозиво.

У програмі користувач завантажує запис «Chocolate» (Шоколадне) у форму введення даних, а потім змінює значення стовпця Quantity (Кількість) на 90. Запис, з яким потрібно працювати, розміщується в змінній контекстуEditRecord.

  • UpdateContext( { EditRecord: LookUp( IceCream, Flavor = "Chocolate" ) } )

Для внесення цієї зміни до джерела даних використовується функція Patch.

  • Patch( IceCream, EditRecord, Gallery.Updates )

У ній: Gallery.Updates обчислює значення { Quantity: 90 }, оскільки зміни зазнала лише властивість Quantity.

На жаль, якраз перед викликом функції Patch, хтось змінив значення Quantity для запису «Chocolate» на 80. Power Apps виявить це та попередить виникнення конфліктного змінення. Цю ситуацію можна перевірити за допомогою нижчезазначеної формули.

  • IsEmpty( Errors( IceCream, EditRecord ) )

Вона повертає значення false, тому що функція Errors повернула наведену нижче таблицю.

Запис Стовпчик Повідомлення Помилка
{ Flavor: "Chocolate", Quantity: 100 } пусто «Інший користувач змінив запис, який ви намагається змінити. Перезавантажте запис і повторіть спробу.» ErrorKind.Conflict

У формі можна розмістити підпис, щоб показати цю помилку користувачеві.

  • Для відображення помилки настройте властивість Text елемента керування «Підпис» відповідно до зазначеної нижче формули.
    Label.Text = First(Errors( IceCream, EditRecord )).Message

Також до форми можна додати кнопку Перезавантажити, щоб користувач міг ефективно вирішити конфлікт.

  • Для відображення кнопки тільки в разі виникнення конфлікту настройте властивість Visible елемента керування «Кнопка» відповідно до нижченаведеної формули.
    !IsEmpty( Lookup( Errors( IceCream, EditRecord ), Error = ErrorKind.Conflict ) )
  • Щоб натискання користувачем кнопки призводило до скасування змін, настройте властивість кнопки OnSelect відповідно до вказаної нижче формули.
    ReloadButton.OnSelect = Revert( IceCream, EditRecord )