PowerApps: Иерархические выпадающие списки в SharePoint - Полное руководство
Узнайте, как создавать иерархические выпадающие списки в PowerApps с использованием нескольких списков SharePoint. Полное руководство с примерами кода для приложений учета времени с зависимыми выпадающими списками.
Как создать иерархические выпадающие списки в PowerApps с использованием двух разных списков SharePoint?
Я разрабатываю приложение для учета времени в PowerApps с четырьмя выпадающими списками: Проект, Действия, Поддействие CPC и Результат. Значения каждого выпадающего списка должны зависеть от предыдущего выбора, а данные извлекаются из разных списков SharePoint.
Для выпадающего списка “Поддействие CPC” я использую это условие в свойстве DisplayMode:
If(
Or(IsBlank(DpdAction.SelectedText), Not(StartsWith(DpdProcess.Selected.Value,"CPC"))),
DisplayMode.Disabled,
DisplayMode.Edit
)
Чтобы ограничить значения выпадающего списка “Действия”, я использую этот код в свойстве Items:
Sort(Distinct(Filter('Cascading List', Title = DpdProcess.Selected.Value),Action),Value)
Мои списки SharePoint структурированы следующим образом:
Список каскадирования (Cascading List):
- Проект (например, Correspondence, EService Processing)
- Действие (например, Case Activated for Member, Re-Activation)
Список результатов (Outcomes List):
- Проект (например, Correspondence, EService Processing)
- Результат (например, Outcome A, Outcome G)
Я хочу создать связь между выпадающими списками “Проект” и “Действия” с использованием списка каскадирования, а затем подключить выпадающий список “Результат” с помощью отдельного списка результатов. Можно ли использовать функции фильтрации для одновременной ссылки на оба списка SharePoint? Я беспокоюсь о сложности поддержания всех возможных комбинаций Проект/Действие/Результат в одном списке.
Создание иерархических выпадающих списков в PowerApps с использованием нескольких списков SharePoint
Создание иерархических выпадающих списков в PowerApps с использованием нескольких списков SharePoint абсолютно возможно и является распространенной практикой для приложений учета времени. Вы можете использовать функции Filter, LookUp и Collect для связи значений выпадающих списков между разными списками SharePoint, хотя вам потребуется тщательно структурировать отношения данных и учитывать последствия для производительности при работе с большими наборами данных.
Содержание
- Понимание вашей текущей реализации
- Настройка иерархических отношений
- Реализация межсписковой фильтрации
- Оптимизация производительности
- Альтернативные подходы
- Пример полной реализации
Понимание вашей текущей реализации
Ваш текущий подход для выпадающего списка “Действие” с использованием Sort(Distinct(Filter('Cascading List', Title = DpdProcess.Selected.Value),Action),Value) принципиально верен и соответствует лучшим практикам PowerApps для иерархических выпадающих списков. Однако при работе с несколькими списками SharePoint необходимо тщательно учитывать, как устанавливаются отношения данных.
Функция Filter, которую вы используете, является именно тем инструментом, который нужен для этой сценария, так как она позволяет динамически фильтровать значения выпадающих списков на основе предыдущих выборов. Для структуры вашего приложения учета времени вам необходимо установить четкие отношения между:
- Выпадающий список проектов → Выпадающий список действий (из списка “Cascading List”)
- Выпадающий список проектов → Выпадающий список результатов (из списка “Outcomes List”)
Ключевая задача заключается в том, чтобы оба выпадающих списка реагировали на один и тот же выбор проекта, хотя и извлекают данные из разных источников.
Настройка иерархических отношений
Для установления правильных иерархических отношений между вашими списками SharePoint вам необходимо:
- Стандартизировать названия проектов: Убедитесь, что названия проектов идентичны во обоих списках SharePoint для обеспечения правильного сопоставления
- Добавить столбцы подстановки: Рассмотрите возможность добавления столбцов подстановки в ваши списки для установления формальных отношений
- Использовать последовательное именование: Поддерживайте последовательные соглашения об именовании для значений проектов
Для вашей конкретной структура поток отношений должен быть следующим:
Выпадающий список проектов (выбран) →
├── Фильтрация выпадающего списка действий из 'Cascading List'
└── Фильтрация выпадающего списка результатов из 'Outcomes List'
Когда проект выбран, оба выпадающих списка действий и результатов должны обновляться на основе этого выбора, даже если они извлекают данные из разных списков.
Реализация межсписковой фильтрации
Вот как реализовать межсписковую фильтрацию для вашего конкретного сценария:
Свойство Items выпадающего списка проектов
Sort(Distinct(Union('Cascading List', 'Outcomes List'), Title), Value)
Это гарантирует, что ваш выпадающий список проектов включает все уникальные названия проектов из обоих списков.
Свойство Items выпадающего списка действий
If(
!IsBlank(DpdProcess.Selected.Value),
Sort(
Distinct(
Filter('Cascading List', Title = DpdProcess.Selected.Value),
Action
),
Value
),
[]
)
Свойство Items выпадающего списка результатов
If(
!IsBlank(DpdProcess.Selected.Value),
Sort(
Distinct(
Filter('Outcomes List', Project = DpdProcess.Selected.Value),
Outcome
),
Value
),
[]
)
Ключевое понимание заключается в том, что оба выпадающих списка ссылаются на один и тот же выпадающий список проектов (DpdProcess.Selected.Value), но фильтруют из своих respective списков SharePoint.
Выпадающий список под-действий CPC
Ваша текущая реализация для выпадающего списка под-действий CPC хорошо структурирована:
If(
Or(IsBlank(DpdAction.SelectedText), Not(StartsWith(DpdProcess.Selected.Value,"CPC"))),
DisplayMode.Disabled,
DisplayMode.Edit
)
Для свойства Items вам потребуется реализовать дополнительную логику фильтрации на основе выбранного действия:
If(
!IsBlank(DpdAction.Selected.Value) &&
StartsWith(DpdProcess.Selected.Value,"CPC"),
Filter(
'Cascading List',
Title = DpdProcess.Selected.Value,
Action = DpdAction.Selected.Value
),
[]
)
Оптимизация производительности
При работе с несколькими списками SharePoint в иерархических выпадающих списках производительность может стать проблемой. Вот стратегии оптимизации:
- Используйте коллекции CDS: Загружайте данные в коллекции для уменьшения запросов к SharePoint
- Реализуйте отложенную загрузку: Используйте
DeferсLoadDataиSaveDataдля приложений с приоритетом автономной работы - Минимизируйте сложность фильтрации: Держите выражения фильтрации как можно проще
- Рассмотрите постраничную навигацию: Для больших наборов данных реализуйте постраничную навигацию или виртуальную прокрутку
Пример загрузки коллекции
// OnVisible или App.Start
ClearCollect(Projects, Distinct(Union('Cascading List', 'Outcomes List'), Title));
ClearCollect(Actions, 'Cascading List');
ClearCollect(Outcomes, 'Outcomes List');
// Затем используйте коллекции вместо прямых ссылок на SharePoint
// Свойство Items выпадающего списка действий:
If(
!IsBlank(DpdProcess.Selected.Value),
Sort(
Distinct(
Filter(Actions, Title = DpdProcess.Selected.Value),
Action
),
Value
),
[]
)
Альтернативные подходы
Использование Dataverse
Как упоминалось в исследованиях, списки SharePoint достаточны для простых или плоских структур данных, но для сложного моделирования реляционных данных Dataverse предлагает значительные преимущества:
- Нативная поддержка отношений: Позволяет сложные соединения и фильтрации между таблицами
- Ссылочная целостность: Поддерживает согласованность данных в отношениях
- Лучшая производительность: Оптимизирован для сложных запросов и отношений
Использование Power Automate Flow
Для очень сложных сценариев рассмотрите возможность использования Power Automate для:
- Кэширования данных в коллекции
- Обработки сложных подстановок
- Управления синхронизацией данных между списками
Пример полной реализации
Вот полная реализация для вашего приложения учета времени:
Структура списка SharePoint
Список Cascading List:
- Title (Название проекта)
- Action
- [Опционально: SubAction, Category]
Список Outcomes List:
- Project (должен соответствовать названиям проектов в Cascading List)
- Outcome
- [Опционально: Description]
Реализация в Power Apps
Выпадающий список проектов
Items: Sort(Distinct(Union('Cascading List', 'Outcomes List'), Title), Value)
Выпадающий список действий
Items: If(
!IsBlank(DpdProcess.Selected.Value),
Sort(
Distinct(
Filter('Cascading List', Title = DpdProcess.Selected.Value),
Action
),
Value
),
[]
)
Выпадающий список под-действий CPC
// Свойство Items:
If(
!IsBlank(DpdAction.Selected.Value) &&
StartsWith(DpdProcess.Selected.Value,"CPC"),
Sort(
Distinct(
Filter('Cascading List',
Title = DpdProcess.Selected.Value,
Action = DpdAction.Selected.Value
),
SubAction
),
Value
),
[]
)
// Свойство DisplayMode (как у вас сейчас):
If(
Or(IsBlank(DpdAction.SelectedText), Not(StartsWith(DpdProcess.Selected.Value,"CPC"))),
DisplayMode.Disabled,
DisplayMode.Edit
)
Выпадающий список результатов
Items: If(
!IsBlank(DpdProcess.Selected.Value),
Sort(
Distinct(
Filter('Outcomes List', Project = DpdProcess.Selected.Value),
Outcome
),
Value
),
[]
)
Обработка ошибок и валидация
Добавьте валидацию для обеспечения согласованности данных:
// Добавьте в вашу логику кнопки отправки или сохранения
If(
IsBlank(DpdProcess.Selected.Value),
Notify("Пожалуйста, выберите проект", NotificationType.Error),
IsBlank(DpdAction.Selected.Value),
Notify("Пожалуйста, выберите действие", NotificationType.Error),
// Дополнительная валидация
// Продолжайте сохранение
)
Источники
- Документация Microsoft Power Apps - Работа с данными SharePoint
- Code Creators - Dataverse vs. SharePoint Lists: The Right Backend for Power Apps
- SP Guides - Create a Dropdown Navigation in SharePoint
- Microsoft Power Apps - Filter, Search, and LookUp functions
- Microsoft Power Apps - Distinct function
Заключение
Создание иерархических выпадающих списков в PowerApps с использованием нескольких списков SharePoint достижимо с помощью функций Filter и LookUp. Ваш текущий подход к реализации верен, и с помощью правильных техник межсписковой фильтрации вы можете успешно реализовать ваше приложение учета времени с четырьмя зависимыми выпадающими списками, которые вы описали. Рассмотрите возможность реализации коллекций данных для лучшей производительности и изучите Dataverse, если сложность увеличится. Ключ заключается в поддержании последовательного именования в списках и реализации правильной обработки ошибок для обеспечения целостности данных.